/** * Adds a flattened version of all toplevel ANDed WHERE clauses. */ protected void addWhere(List<Predicate> clauses, WhereClause where) { if (where != null) { addWhere(clauses, where.predicate); } }
query = addWildcardNotNullClauses(query); addFacetFilters(clauses, facetFilter); addTypes(clauses, query.from); addWhere(clauses, query.where); simplifyTypes(clauses); MultiExpression multiExpression = new MultiExpression(Operator.AND, clauses); String prefix = en.getKey(); List<Predicate> list = en.getValue(); groupedExpressions.put(prefix, makeSingleAndPredicate(prefix, list)); reorganizeGroupedExpressions(groupedExpressions); whereExpr = makeSingleAndPredicate("", expressions);
List<String> keys = new ArrayList<>(groupedExpressions.keySet()); List<String> withPrefix = new ArrayList<>(); String prefix = findPrefix(keys, withPrefix); if (prefix != null) { throw new QueryParseException("Too complex correlated wildcards in query: " + groupedExpressions); Predicate second = makeSingleAndPredicate(secondPrefix, exprs); Predicate expr = makeSingleAndPredicate(prefix, Arrays.asList(first, second)); groupedExpressions.put(prefix, expr);
/** * Finds all the types to take into account (all concrete types being a subtype of the passed types) based on the * FROM list. * <p> * Adds them as a ecm:primaryType match in the toplevel operands. */ protected void addTypes(List<Predicate> clauses, FromClause node) { onlyRelations = true; Set<String> fromTypes = new HashSet<>(); FromList elements = node.elements; for (String typeName : elements.values()) { if (TYPE_DOCUMENT.equalsIgnoreCase(typeName)) { typeName = TYPE_DOCUMENT; } fromTypes.addAll(getDocumentTypeNamesExtending(typeName)); boolean isRelation = isTypeRelation(typeName); onlyRelations = onlyRelations && isRelation; } fromTypes.remove(TYPE_ROOT); LiteralList list = new LiteralList(); for (String type : fromTypes) { list.add(new StringLiteral(type)); } clauses.add(new Predicate(new Reference(NXQL.ECM_PRIMARYTYPE), Operator.IN, list)); }
continue; set = getStringLiterals((LiteralList) rvalue); Set<String> set = getDocumentTypeNamesForFacet(mixin); if (primaryTypes == null) { if (op == Operator.EQ) {
protected void processReference(Reference node) { String prefix = getCorrelatedWildcardPrefix(node.name); int count = prefix.isEmpty() ? 0 : 1; node.setInfo(new PrefixInfo(prefix, count)); }
query = addIsNotNullClauses(query, wildcards);
protected void addWhere(List<Predicate> clauses, Predicate expr) { if (expr.operator == Operator.AND && expr.lvalue instanceof Expression && expr.rvalue instanceof Expression) { addWhere(clauses, (Predicate) expr.lvalue); addWhere(clauses, (Predicate) expr.rvalue); } else if (expr.operator == Operator.AND && expr instanceof MultiExpression) { for (Predicate pred : ((MultiExpression) expr).predicates) { addWhere(clauses, pred); } } else { clauses.add(expr); } }