package foundation.data.object; import foundation.dao.Filter; import foundation.persist.NamedSQL; import foundation.persist.source.NamedDataSource; import foundation.util.Util; import foundation.variant.provider.IVariantsProvider; public class SQLGuide { private DataObject dataObject; private NamedDataSource dataSource; private String batchName; private String oneName; private NamedSQL batchSQL; private NamedSQL oneSQL; private NamedSQL tableCountSQL; private NamedSQL expendCountSQL; private String commaSeparator; private String joinSelectFields; private String joinSQL; private boolean standard_batch; private boolean standard_one; private boolean standard_count; public SQLGuide(DataObject dataObject) throws Exception { this.dataObject = dataObject; this.dataSource = dataObject.getDataSource(); tableCountSQL = NamedSQL.getInstance(dataSource.getDBaseType(), NamedSQL.Code_GetCount); } public void build() { DataJoins dataJoins = dataObject.getDataJoins(); if (dataJoins == null) { return; } commaSeparator = dataJoins.getCommaSeparator(); joinSelectFields = dataJoins.getJoinSelectFields(); joinSQL = dataJoins.getJoinSQL(); } public NamedSQL getBrowseBatchSQL() throws Exception { NamedSQL result = batchSQL.createInstance(); //1. 如果不是自定义SQL和JoinSQL,就选取ViewName或TableName if (standard_batch) { result.setTableName(dataObject.getTableOrViewName()); return result; } //2. 如果是自定义SQL和JoinSQL,选取TableName result.setTableName(dataObject.getTableOrViewName()); result.setParam("commaSeparator", commaSeparator); result.setParam("joinSelectFields", joinSelectFields); result.setParam("joinSQL", joinSQL); //3. 返回 return result; } public NamedSQL getBrowseOneSQL() throws Exception { NamedSQL result = oneSQL.createInstance(); //1. 如果不是自定义SQL和JoinSQL,就选取ViewName或TableName if (standard_one) { result.setTableName(dataObject.getTableOrViewName()); return result; } //2. 如果是自定义SQL和JoinSQL,选取TableName result.setTableName(dataObject.getTableName()); result.setParam("commaSeparator", commaSeparator); result.setParam("joinSelectFields", joinSelectFields); result.setParam("joinSQL", joinSQL); //3. 返回 return result; } public NamedSQL getCountSQL(IVariantsProvider[] providers) throws Exception { NamedSQL namedSQL; Filter filter = findFilter(providers); //1. 没有过滤条件 if (filter == null) { namedSQL = tableCountSQL.createInstance(); namedSQL.setTableName(dataObject.getTableOrViewName()); return namedSQL; } //2. 过滤条件没有超出主表范围 if (!filter.containsSlaveTables(dataObject.getJoinTables())) { namedSQL = tableCountSQL.createInstance(); namedSQL.setTableName(dataObject.getTableOrViewName()); } //3. else { namedSQL = expendCountSQL.createInstance(); namedSQL.setTableName(dataObject.getTableName()); namedSQL.setParam("commaSeparator", commaSeparator); namedSQL.setParam("joinSelectFields", joinSelectFields); namedSQL.setParam("joinSQL", joinSQL); namedSQL.setOrderBy(""); namedSQL.setPage(null); } return namedSQL; } public void setBatchSQL(String sqlName) throws Exception { this.batchName = sqlName; //1. 先检查 自定义SQL 是否可用 if (!Util.isEmpty(sqlName)) { batchSQL = NamedSQL.getInstance(dataSource.getDBaseType(), sqlName); standard_batch = false; return; } //2. 检查 Join SQL 是否可用 DataJoins dataJoins = dataObject.getDataJoins(); if (dataJoins != null && !dataJoins.isEmpty()) { batchSQL = NamedSQL.getInstance(dataSource.getDBaseType(), NamedSQL.Code_GetJoinEntity); standard_batch = false; return; } //3. 默认 SQL batchSQL = NamedSQL.getInstance(dataSource.getDBaseType(), NamedSQL.Code_GetEntity); standard_batch = true; } public void setOneSQL(String sqlName) throws Exception { this.oneName = sqlName; //1. 先检查 自定义SQL 是否可用 if (!Util.isEmpty(sqlName)) { oneSQL = NamedSQL.getInstance(dataSource.getDBaseType(), sqlName); standard_one = false; return; } //2. 检查 Join SQL 是否可用 DataJoins dataJoins = dataObject.getDataJoins(); if (dataJoins != null && !dataJoins.isEmpty()) { oneSQL = NamedSQL.getInstance(dataSource.getDBaseType(), NamedSQL.Code_GetJoinEntity); standard_one = false; return; } //3. 默认 SQL oneSQL = NamedSQL.getInstance(dataSource.getDBaseType(), NamedSQL.Code_GetEntity); standard_one = true; } public void setCountSQL(String sqlName) throws Exception { //1. 先检查 自定义SQL 是否可用 if (!Util.isEmpty(sqlName)) { expendCountSQL = NamedSQL.getInstance(dataSource.getDBaseType(), sqlName); standard_count = false; return; } //2. 检查 Join Count SQL 是否可用 DataJoins dataJoins = dataObject.getDataJoins(); if (dataJoins != null && !dataJoins.isEmpty()) { expendCountSQL = NamedSQL.getInstance(dataSource.getDBaseType(), NamedSQL.Code_GetJoinCount); standard_count = false; return; } //3. 如果不是Join,但是有特殊的BatchSQL,用特殊的SQL做为Count SQL if (!standard_batch) { String sqlText = " select count(1) from ( " + batchSQL.toString() + " ) a "; expendCountSQL = new NamedSQL("expendCountSQL", sqlText); standard_count = false; return; } //4. 默认情况 expendCountSQL = tableCountSQL; standard_count = true; } private Filter findFilter(IVariantsProvider[] providers) { if (providers == null) { return null; } for (int i = 0; i < providers.length; i++) { IVariantsProvider provider = providers[i]; if (provider == null) { continue; } if (Filter.ProviderName.equals(provider.getProviderName())) { return (Filter) provider; } } return null; } public boolean isStandard_batch() { return standard_batch; } public boolean isStandard_one() { return standard_one; } public boolean isStandard_count() { return standard_count; } public boolean isBatchAndOneSame() { boolean result = Util.equals(batchName, oneName); return result; } }