net.ibizsys.model.engine.querydsl.database.sql.QuerydslDEDataQueryBase Maven / Gradle / Ivy
The newest version!
package net.ibizsys.model.engine.querydsl.database.sql;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import com.querydsl.core.BooleanBuilder;
import com.querydsl.core.types.Expression;
import com.querydsl.core.types.Predicate;
import com.querydsl.core.types.dsl.DateTimeExpression;
import com.querydsl.core.types.dsl.NumberExpression;
import com.querydsl.core.types.dsl.SimpleExpression;
import com.querydsl.core.types.dsl.StringExpression;
import net.ibizsys.model.PSModelEnums.DEDataQueryViewLevel;
import net.ibizsys.model.PSModelEnums.PredefinedFieldType;
import net.ibizsys.model.dataentity.IPSDataEntity;
import net.ibizsys.model.dataentity.defield.IPSDEFGroupDetail;
import net.ibizsys.model.dataentity.defield.IPSDEField;
import net.ibizsys.model.dataentity.defield.IPSLinkDEField;
import net.ibizsys.model.dataentity.ds.IPSDEDQCondition;
import net.ibizsys.model.dataentity.ds.IPSDEDQFieldCondition;
import net.ibizsys.model.dataentity.ds.IPSDEDQGroupCondition;
import net.ibizsys.model.dataentity.ds.IPSDEDQJoin;
import net.ibizsys.model.dataentity.ds.IPSDEDataQuery;
import net.ibizsys.model.util.Conditions;
import net.ibizsys.model.util.DataTypeUtils;
import net.ibizsys.model.util.DataTypes;
public abstract class QuerydslDEDataQueryBase {
private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(QuerydslDEDataQueryBase.class);
private IQuerydslSession iQuerydslSession = null;
private IPSDEDataQuery iPSDEDataQuery = null;
private List selectPSDEFieldList = null;
private List unionQuerydslDEDataQueryList = null;
private Map> psDEFieldExpressionMap = new LinkedHashMap<>();
private IQuerydslDataEntity iQuerydslDataEntity = null;
public QuerydslDEDataQueryBase(IQuerydslSession iQuerydslSession, IPSDEDataQuery iPSDEDataQuery) throws Exception {
this(iQuerydslSession, iPSDEDataQuery, null);
}
public QuerydslDEDataQueryBase(IQuerydslSession iQuerydslSession, IPSDEDataQuery iPSDEDataQuery, List selectPSDEFieldList) throws Exception {
this.iQuerydslSession = iQuerydslSession;
this.iPSDEDataQuery = iPSDEDataQuery;
this.selectPSDEFieldList = selectPSDEFieldList;
this.initMetadata();
}
public IPSDEDataQuery getPSDEDataQuery() {
return this.iPSDEDataQuery;
}
public IPSDataEntity getPSDataEntity() {
return getPSDEDataQuery().getParentPSModelObject(IPSDataEntity.class, false);
}
public List getSelectPSDEFields() {
return this.selectPSDEFieldList;
}
protected void initMetadata() throws Exception {
onInitMetadata();
}
protected IQuerydslSession getQuerydslSession() {
return this.iQuerydslSession;
}
public IQuerydslDataEntity getQuerydslDataEntity() {
return this.iQuerydslDataEntity;
}
protected void onInitMetadata() throws Exception {
this.iQuerydslDataEntity = getQuerydslSession().getQuerydslDataEntity(this.getPSDataEntity(), "");
TreeMap selectedPSDEFieldMap = new TreeMap();
if (!ObjectUtils.isEmpty(this.getSelectPSDEFields())) {
for (IPSDEField iPSDEField : this.getSelectPSDEFields()) {
selectedPSDEFieldMap.put(iPSDEField.getName(), 1);
}
} else {
if (this.getPSDEDataQuery().getViewLevel() == DEDataQueryViewLevel.DEFGROUP.value && this.getPSDEDataQuery().getPSDEFGroup() != null) {
java.util.List psDEFGroupDetails = this.getPSDEDataQuery().getPSDEFGroup().getPSDEFGroupDetails();
if (!ObjectUtils.isEmpty(psDEFGroupDetails)) {
for (IPSDEFGroupDetail iPSDEFGroupDetail : psDEFGroupDetails) {
selectedPSDEFieldMap.put(iPSDEFGroupDetail.getPSDEFieldMust().getName(), 1);
}
}
}
}
boolean bSelectPSDEField = selectedPSDEFieldMap.size() > 0;
java.util.List psDEFields = this.getPSDataEntity().getAllPSDEFields();
if (!ObjectUtils.isEmpty(psDEFields)) {
for (IPSDEField iPSDEField : psDEFields) {
if (iPSDEField.isDynaStorageDEField() || iPSDEField.isUIAssistDEField()) {
continue;
}
if (!iPSDEField.isPhisicalDEField() && iPSDEField.isLinkDEField()) {
IPSLinkDEField iPSLinkDEField = (IPSLinkDEField) iPSDEField;
if (!iPSLinkDEField.getRealPSDataEntityMust().isEnableSQLStorage()) {
log.warn(String.format("属性[%1$s]实际引用实体[%2$s]不支持SQL存储,忽略", iPSLinkDEField.getName(), iPSLinkDEField.getRealPSDataEntity().getName()));
continue;
}
}
if (bSelectPSDEField && selectedPSDEFieldMap.containsKey(iPSDEField.getName())) {
// 选择列
} else if (!this.testSelectPSDEField(iPSDEField, this.getPSDEDataQuery().getViewLevel()) || bSelectPSDEField) {
if (!iPSDEField.isQueryColumn() || !selectedPSDEFieldMap.containsKey(iPSDEField.getName())) {
if (!iPSDEField.isPhisicalDEField()) {
if (!iPSDEField.isInheritDEField())
continue;
}
// IPSDEFDTColumn iPSDEFDTColumn =
// iPSDEField.getPSDTColumn(this.getDBType());
// String strPSDEFieldExp = null;
// if
// (mainQueryConfig.getPSDEDataQuery().isQueryFromView())
// {
// strPSDEFieldExp = StringHelper.Format("%1$s.%2$s",
// "t1",
// this.iPSDBType.getDBObjStandardName(iPSDEFDTColumn.getColumnName()));
// this.setFieldQueryCaseSensitive(strPSDEFieldExp,
// iPSDEFDTColumn.getQueryCaseSenstive());
// } else {
// strPSDEFieldExp = getPSDEFieldExp(iPSDEField, "",
// derAliasMap, derList);
// }
//
//
//
// int nDataType = iPSDEField.getStdDataType();
//
//
// fieldDataTypeMap.put(iPSDEFDTColumn.getColumnName().toUpperCase(),
// nDataType);
// fieldExpMap.put(iPSDEFDTColumn.getColumnName().toUpperCase(),
// strPSDEFieldExp);
// continue;
}
}
if (iPSDEField.getStringLength() != -1 && iPSDEField.getStringLength() > 8000) {
log.error(String.format("长文本属性[%1$s]放入查询中,会影响检索性能", iPSDEField.getName()));
}
Expression expression = this.getQuerydslDataEntity().getExpression(iPSDEField);
this.psDEFieldExpressionMap.put(iPSDEField.getName(), expression);
}
}
this.buildPSDEDQJoin(this.getPSDEDataQuery().getPSDEDQMainMust(), this.getQuerydslDataEntity());
}
protected void buildPSDEDQJoin(IPSDEDQJoin iPSDEDQJoin, IQuerydslDataEntity iQuerydslDataEntity) throws Exception {
// 放入条件
IPSDEDQGroupCondition iPSDEDQGroupCondition = iPSDEDQJoin.getPSDEDQGroupCondition();
if (iPSDEDQGroupCondition != null) {
Predicate predicate = this.buildPSDEDQGroupCondition(iPSDEDQGroupCondition, iQuerydslDataEntity);
if (predicate != null) {
iQuerydslDataEntity.getPredicates().add(predicate);
}
}
List childPSDEDQJoinList = iPSDEDQJoin.getChildPSDEDQJoins();
if (!ObjectUtils.isEmpty(childPSDEDQJoinList)) {
for (IPSDEDQJoin childPSDEDQJoin : childPSDEDQJoinList) {
IQuerydslDataEntity joinQuerydslDataEntity = iQuerydslDataEntity.getJoinQuerydslDataEntity(childPSDEDQJoin.getJoinType(), childPSDEDQJoin.getJoinPSDERMust());
this.buildPSDEDQJoin(childPSDEDQJoin, joinQuerydslDataEntity);
}
}
}
protected Predicate buildPSDEDQGroupCondition(IPSDEDQGroupCondition iPSDEDQGroupCondition, IQuerydslDataEntity iQuerydslDataEntity) throws Exception {
if (ObjectUtils.isEmpty(iPSDEDQGroupCondition.getPSDEDQConditions())) {
return null;
}
BooleanBuilder booleanBuilder = new BooleanBuilder();
for (IPSDEDQCondition iPSDEDQCondition : iPSDEDQGroupCondition.getPSDEDQConditions()) {
if (iPSDEDQCondition instanceof IPSDEDQFieldCondition) {
Predicate predicate = this.buildPSDEDQFieldCondition((IPSDEDQFieldCondition) iPSDEDQCondition, iQuerydslDataEntity);
if (predicate != null) {
if (Conditions.AND.equalsIgnoreCase(iPSDEDQGroupCondition.getCondOp())) {
booleanBuilder.and(predicate);
} else {
booleanBuilder.or(predicate);
}
}
continue;
}
if (iPSDEDQCondition instanceof IPSDEDQGroupCondition) {
Predicate predicate = this.buildPSDEDQGroupCondition((IPSDEDQGroupCondition) iPSDEDQCondition, iQuerydslDataEntity);
if (predicate != null) {
if (Conditions.AND.equalsIgnoreCase(iPSDEDQGroupCondition.getCondOp())) {
booleanBuilder.and(predicate);
} else {
booleanBuilder.or(predicate);
}
}
continue;
}
}
if (iPSDEDQGroupCondition.isNotMode()) {
return booleanBuilder.not();
}
return booleanBuilder;
}
protected Predicate buildPSDEDQFieldCondition(IPSDEDQFieldCondition iPSDEDQFieldCondition, IQuerydslDataEntity iQuerydslDataEntity) throws Exception {
IPSDEField iPSDEField = iQuerydslDataEntity.getPSDEField(iPSDEDQFieldCondition.getFieldName(), false);
Expression expression = iQuerydslDataEntity.getExpression(iPSDEField);
int nStdDataType = iPSDEField.getStdDataType();
if(StringUtils.hasLength(iPSDEDQFieldCondition.getValueFunc())) {
boolean bOk = false;
if (DataTypeUtils.isStringDataType(nStdDataType)) {
if("STRLEN".equalsIgnoreCase(iPSDEDQFieldCondition.getValueFunc())) {
StringExpression stringExpression = (StringExpression) expression;
expression = stringExpression.length();
nStdDataType = DataTypes.INT;
bOk = true;
}
}
if(!bOk) {
throw new Exception(String.format("未支持的函数[%1$s]", iPSDEDQFieldCondition.getValueFunc()));
}
}
SimpleExpression simpleExpression = (SimpleExpression) expression;
String strCondOp = iPSDEDQFieldCondition.getCondOp();
if (Conditions.ISNULL.equals(strCondOp)) {
return simpleExpression.isNull();
}
if (Conditions.ISNOTNULL.equals(strCondOp)) {
return simpleExpression.isNotNull();
}
Object condValue = null;
String strCondValue = iPSDEDQFieldCondition.getCondValue();
String strPSVarType = iPSDEDQFieldCondition.getPSVARTypeId();
if (StringUtils.hasLength(strPSVarType)) {
condValue = this.getQuerydslSession().getContext(strPSVarType, strCondValue);
if (condValue instanceof String && !DataTypeUtils.isStringDataType(nStdDataType)) {
condValue = DataTypeUtils.parse(nStdDataType, (String) condValue);
}
} else {
condValue = DataTypeUtils.parse(nStdDataType, strCondValue);
}
if (DataTypeUtils.isStringDataType(nStdDataType)) {
StringExpression stringExpression = (StringExpression) expression;
// if(StringUtils.hasLength(iPSDEDQFieldCondition.getValueFunc())) {
// stringExpression.le
// }
if (Conditions.EQ.equals(strCondOp)) {
return stringExpression.eq((String) condValue);
}
if (Conditions.NOTEQ.equals(strCondOp)) {
// return
// stringExpression.ne(Expressions.stringTemplate(String.format("'%1$s'",
// strCondValue)));
return stringExpression.ne((String) condValue);
}
if (Conditions.LIKE.equals(strCondOp)) {
return stringExpression.likeIgnoreCase((String) condValue);
}
if (Conditions.LEFTLIKE.equals(strCondOp)) {
return stringExpression.startsWithIgnoreCase((String) condValue);
}
if (Conditions.RIGHTLIKE.equals(strCondOp)) {
return stringExpression.endsWithIgnoreCase((String) condValue);
}
throw new Exception(String.format("未支持的字符条件操作[%1$s]", strCondOp));
}
if (DataTypeUtils.isNumberDataType(nStdDataType)) {
NumberExpression numberExpression = (NumberExpression) expression;
if (Conditions.EQ.equals(strCondOp)) {
return numberExpression.eq(condValue);
}
if (Conditions.NOTEQ.equals(strCondOp)) {
return numberExpression.ne(condValue);
}
if (Conditions.GT.equals(strCondOp)) {
return numberExpression.gt((Number) condValue);
}
if (Conditions.GTANDEQ.equals(strCondOp)) {
return numberExpression.goe((Number) condValue);
}
if (Conditions.LT.equals(strCondOp)) {
return numberExpression.lt((Number) condValue);
}
if (Conditions.LTANDEQ.equals(strCondOp)) {
return numberExpression.loe((Number) condValue);
}
throw new Exception(String.format("未支持的数值条件操作[%1$s]", strCondOp));
}
if (DataTypeUtils.isDateTimeDataType(nStdDataType)) {
DateTimeExpression dateTimeExpression = (DateTimeExpression) expression;
if (Conditions.EQ.equals(strCondOp)) {
return dateTimeExpression.eq(condValue);
}
if (Conditions.NOTEQ.equals(strCondOp)) {
return dateTimeExpression.ne(condValue);
}
if (Conditions.GT.equals(strCondOp)) {
return dateTimeExpression.gt((Date) condValue);
}
if (Conditions.GTANDEQ.equals(strCondOp)) {
return dateTimeExpression.goe((Date) condValue);
}
if (Conditions.LT.equals(strCondOp)) {
return dateTimeExpression.lt((Date) condValue);
}
if (Conditions.LTANDEQ.equals(strCondOp)) {
return dateTimeExpression.loe((Date) condValue);
}
throw new Exception(String.format("未支持的数值条件操作[%1$s]", strCondOp));
}
throw new Exception(String.format("未支持的条件操作[%1$s][%2$s]", nStdDataType, strCondOp));
}
/**
* 判断是否输出指定属性
*
* @param iPSDEField
* @param nViewColLevel
* @return
*/
protected boolean testSelectPSDEField(IPSDEField iPSDEField, int nViewColLevel) {
if (iPSDEField.isDynaStorageDEField() || iPSDEField.isUIAssistDEField())
return false;
if (nViewColLevel == -1)
return iPSDEField.isQueryColumn();
if (iPSDEField.isKeyDEField())
return true;
if (PredefinedFieldType.LOGICVALID.value.equalsIgnoreCase(iPSDEField.getPredefinedType()))
return true;
return iPSDEField.getViewLevel() >= nViewColLevel;
}
public java.util.Collection getExpressionNames() {
return psDEFieldExpressionMap.keySet();
}
public Expression getExpression(String strName, boolean bTryMode) throws Exception {
Expression expression = this.psDEFieldExpressionMap.get(strName);
if (expression != null || bTryMode) {
return expression;
}
throw new Exception(String.format("无法获取指定表达式[%1$s]", strName));
}
}