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;
  }
  protected Expression processPropertyTracedownToManyNone(
      Attribute<?, ?> attr, Expression builder, List<Parameter> parameters) {
    ConditionQuery subQuery = getTraceDownQuery();
    // subQuery.setPrefix(getQuery().getPrefix()+parameters.size()+"_");
    Expression subBuilder = new ExpressionBuilder();
    List<Expression> childExps = new ArrayList<Expression>(3);
    for (PropertyCondition subPc : subQuery.getConditions()) {
      Expression subExp = subPc.processProperty(subBuilder, parameters);
      childExps.add(subExp);
    }
    if (childExps.isEmpty()) {
      throw new InvalidQueryException("No expression from subquery.");
    }
    Expression finalExp = childExps.get(0);

    for (int i = 1; i < childExps.size(); i++) {
      finalExp = finalExp.and(childExps.get(i));
    }

    return builder.noneOf(getProp(), finalExp);
  }
  protected Expression processPropertyTracedownToManySomeOptimized(
      Attribute<?, ?> attr, Expression builder, List<Parameter> parameters) {
    ConditionQuery subQuery = getTraceDownQuery();
    // subQuery.setPrefix(getQuery().getPrefix()+parameters.size()+"_");
    Expression prefixExp = builder.anyOf(getProp());

    List<Expression> complexExps = new ArrayList<Expression>();

    for (PropertyCondition subPc : subQuery.getConditions()) {
      Expression subExp = subPc.processProperty(prefixExp, parameters);
      complexExps.add(subExp);
    }
    Expression finalExp = null;
    if (complexExps.isEmpty()) {
      throw new InvalidQueryException("No expression from subquery.");
    }
    finalExp = complexExps.get(0);
    for (int i = 1; i < complexExps.size(); i++) {
      finalExp = finalExp.and(complexExps.get(i));
    }
    return finalExp;
  }