All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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




© 2015 - 2024 Weber Informatics LLC | Privacy Policy