package foundation.io.define; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import foundation.dao.Filter; import foundation.dao.OrderBy; import foundation.data.object.DataObject; import foundation.io.mapping.FieldMappingRuntime; import foundation.io.mapping.MappingsRuntime; import foundation.persist.ISQLContext; import foundation.persist.NamedSQL; import foundation.util.ContentBuilder; import foundation.util.Util; public class IOSQLContext implements ISQLContext { private List paramNames; private Map paramMap; private DataIO dataIO; private MappingsRuntime mainMappingsRuntime; private MappingsRuntime toMappingsRuntime; private Filter dynamicFilter; private Filter userFilter; private String ioBatchId; public IOSQLContext(DataIO dataIO) { this.paramMap = new HashMap(); this.dataIO = dataIO; initParamNames(); } public IOSQLContext(IOTask fileIO) { this.paramMap = new HashMap(); initParamNames(); } public void setParametersTo(NamedSQL namedSQL) { for (String name : paramNames) { if (namedSQL.containsVariant(name)) { String value = getParameter(name); if (value == null) { continue; } namedSQL.setParam(name, value); } } } public void addOneParameter(String name, String value) { if (Util.isEmpty(name)) { return; } String lower = name.toLowerCase(); if (!paramMap.containsKey(lower)) { paramNames.add(name); } paramMap.put(lower, value); } public String getParameter(String name) { if (Util.isEmpty(name)) { return name; } try { name = name.toLowerCase(); if ("toTable".equalsIgnoreCase(name)) { return dataIO.getToName(); } else if ("toTempTable".equalsIgnoreCase(name)) { return dataIO.getToTempName(); } else if ("fromTable".equalsIgnoreCase(name)) { return dataIO.getFromName(); } else if ("distinct".equalsIgnoreCase(name)) { return dataIO.isDistinctSelect() ? "distinct" : ""; } else if ("insertToFieldNames".equalsIgnoreCase(name)) { return getInsertToFieldNames(); } else if ("insertToPlaceHolders".equalsIgnoreCase(name)) { return insertToPlaceHolders(); } else if ("insertFromFieldNames".equalsIgnoreCase(name)) { return getInsertFromFieldNames(); } else if ("insertFromToTempFieldNames".equalsIgnoreCase(name)) { return insertFromToTempFieldNames(); } else if ("keyFieldPairs".equalsIgnoreCase(name)) { return getKeyFieldPairs(); } else if ("filterFieldValues".equalsIgnoreCase(name)) { return getFilterFieldValues(); } else if ("updateFieldPairs".equalsIgnoreCase(name)) { return getUpdateFieldPairs(); } else if ("updateFromFieldNames".equalsIgnoreCase(name)) { return getUpdateFromFieldNames(); } else if ("selectFromFieldNames".equalsIgnoreCase(name)) { return getSelectFromFieldNames(); } else if ("orderBy".equalsIgnoreCase(name)) { return getOrderBy(); } else if ("dynamicFilter".equalsIgnoreCase(name)) { return getDynamicFilter(); } else if ("userFilter".equalsIgnoreCase(name)) { return getUserFilter(); } else if ("ioBatchId".equalsIgnoreCase(name)) { return ioBatchId; } else if (paramMap.containsKey(name)) { return paramMap.get(name); } else if("taskName".equalsIgnoreCase(name)) { return dataIO.getTaskName(); } } catch (Exception e) { e.printStackTrace(); } return null; } private String getInsertToFieldNames() throws Exception { ContentBuilder builder = new ContentBuilder(", "); MappingsRuntime mappingsRuntime = toMappingsRuntime; for (FieldMappingRuntime mappingRuntime : mappingsRuntime) { builder.append(mappingRuntime.getToName()); } if (isSaveRowNo()) { builder.append("rowno"); } return builder.toString(); } private String insertToPlaceHolders() throws Exception { ContentBuilder builder = new ContentBuilder(", "); MappingsRuntime mappingsRuntime = toMappingsRuntime; for (int i = 0; i < mappingsRuntime.size(); i++) { builder.append("?"); } if (isNewID()) { builder.append("?"); } if (isSaveRowNo()) { builder.append("?"); } return builder.toString(); } private String getInsertFromFieldNames() { ContentBuilder builder = new ContentBuilder(", "); MappingsRuntime mappingsRuntime = mainMappingsRuntime; for (FieldMappingRuntime mappingRuntime : mappingsRuntime) { builder.append(mappingRuntime.getFromName()); } String selectFields = builder.toString(); if ("distinct".equalsIgnoreCase(getParameter("distinct"))) { selectFields = " distinct " + selectFields; } return selectFields; } private String insertFromToTempFieldNames() throws Exception { ContentBuilder builder = new ContentBuilder(", "); MappingsRuntime mappingsRuntime = toMappingsRuntime; for (FieldMappingRuntime mappingRuntime : mappingsRuntime) { builder.append(mappingRuntime.getFromName()); } return builder.toString(); } private String getKeyFieldPairs() { String[] fieldPairs = dataIO.getKeyFieldPairs(); //1. if not define if (fieldPairs == null || fieldPairs.length == 0) { return dataIO.getFromName() + ".id = " + dataIO.getToName() + ".id"; } //2. if define ContentBuilder result = new ContentBuilder(" and "); for (String fieldPair : fieldPairs) { String segment = setParametersTo(fieldPair); result.append(segment); } return result.toString(); } private String getFilterFieldValues() { String[] fields = dataIO.getFilterFieldValues(); //1. if not define if (fields == null || fields.length == 0) { return "1=1"; } //2. if define ContentBuilder result = new ContentBuilder(" and "); for (String fieldPair : fields) { String segment = setParametersTo(fieldPair); result.append(segment); } return result.toString(); } private String getUpdateFieldPairs() throws Exception { ContentBuilder result = new ContentBuilder(", "); MappingsRuntime mappingsRuntime = mainMappingsRuntime; String toTable = dataIO.getToName(); String fromTable = dataIO.getFromName(); for (FieldMappingRuntime mappingRuntime : mappingsRuntime) { result.append(toTable + "." + mappingRuntime.getToName() + " = " + fromTable + "." + mappingRuntime.getFromName()); } return result.toString(); } private String getUpdateFromFieldNames() throws Exception { ContentBuilder builder = new ContentBuilder(", "); MappingsRuntime mappingsRuntime = mainMappingsRuntime; for (FieldMappingRuntime mappingRuntime : mappingsRuntime) { builder.append(mappingRuntime.getFromName()); } return builder.toString(); } private String getSelectFromFieldNames() throws Exception { ContentBuilder builder = new ContentBuilder(", "); MappingsRuntime mappingsRuntime = toMappingsRuntime; for (FieldMappingRuntime mappingRuntime : mappingsRuntime) { builder.append(mappingRuntime.getFromName()); } String selectFields = builder.toString(); if ("distinct".equalsIgnoreCase(getParameter("distinct"))) { selectFields = " distinct " + selectFields; } return selectFields; } private String getOrderBy() { String fromName = dataIO.getFromName(); DataObject dataObject = DataObject.getInstance(fromName); if (dataObject == null) { return ""; } OrderBy orderBy = dataObject.getDefaultOrderBy(); if (orderBy == null) { return ""; } return orderBy.toString(); } private String getDynamicFilter() { if (dynamicFilter == null) { return "1=1"; } return dynamicFilter.toString(); } private String getUserFilter() { if (userFilter == null) { return "1=1"; } return userFilter.toString(); } public String setParametersTo(String segment) { if (segment == null) { return segment; } segment = segment.toLowerCase(); for (String name : paramNames) { if (segment.indexOf(name) >= 0) { String value = getParameter(name); if (value == null) { continue; } segment = segment.replace(name, value); } } return segment; } public boolean isNewID() { MappingsRuntime mappingsRuntime = mainMappingsRuntime; return !mappingsRuntime.containsToField("id"); } public boolean isSaveRowNo() { MappingsRuntime mappingsRuntime = mainMappingsRuntime; return mappingsRuntime.containsToField("rowno"); } public void setDynamicFilter(Filter dynamicFilter) { this.dynamicFilter = dynamicFilter; } public void setUserFilter(Filter userFilter) { this.userFilter = userFilter; } public void setIoBatchId(String ioBatchId) { this.ioBatchId = ioBatchId; } public void setToMappingsRuntime(MappingsRuntime toMappingsRuntime) { this.toMappingsRuntime = toMappingsRuntime; } public void setMainMappingsRuntime(MappingsRuntime mainMappingsRuntime) { this.mainMappingsRuntime = mainMappingsRuntime; } private void initParamNames() { paramNames = new ArrayList(); paramNames.add("toTable"); paramNames.add("toTempTable"); paramNames.add("fromTable"); paramNames.add("distinct"); paramNames.add("toFieldCreateMetas"); paramNames.add("insertToFieldNames"); paramNames.add("insertToPlaceHolders"); paramNames.add("insertFromFieldNames"); paramNames.add("insertFromToTempFieldNames"); paramNames.add("keyFieldPairs"); paramNames.add("filterFieldValues"); paramNames.add("updateFieldPairs"); paramNames.add("updateFromFieldNames"); paramNames.add("selectFromFieldNames"); paramNames.add("dynamicFilter"); paramNames.add("userFilter"); paramNames.add("orderBy"); paramNames.add("ioBatchId"); paramNames.add("taskName"); } public DataIO getDataIO() { return dataIO; } }