protected Expression processPropertyTracedownTooneOptimized( Attribute<?, ?> attr, Expression builder, List<Parameter> parameters) { ConditionQuery subQuery = getTraceDownQuery(); Expression finalExp = null; for (PropertyCondition subPc : subQuery.getConditions()) { if (subPc.isReturnSimpleExpression()) { Expression subExp = subPc.processProperty(builder.get(getProp()), parameters); if (finalExp == null) { finalExp = subExp; } else { finalExp = finalExp.and(subExp); } } else { // low-performance query since an extra layer of exists added // but this is the only way to make it work. // this situation is rare. So we may do not need to optimize it Expression subBuilder = new ExpressionBuilder(); Expression subExp = subPc.processProperty(subBuilder, parameters); ReportQuery childQuery = formRelationReportQuery(attr, subBuilder); childQuery.retrievePrimaryKeys(); childQuery.setSelectionCriteria(subBuilder.equal(builder.get(getProp())).and(subExp)); if (finalExp == null) { finalExp = builder.exists(childQuery); } else { finalExp = finalExp.and(builder.exists(childQuery)); } } } return finalExp; }
protected boolean isComplexTracedown(Attribute<?, ?> attr) { ConditionQuery subQuery = getTraceDownQuery(); for (PropertyCondition subPc : subQuery.getConditions()) { if (!subPc.isReturnSimpleExpression()) { return false; } } return true; }