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;
|
}
|
}
|