protected void addFacetFilters(List<Predicate> clauses, FacetFilter facetFilter) { if (facetFilter == null) { return; } for (String mixin : facetFilter.required) { // every facet is required, not just any of them, // so do them one by one Predicate expr = new Predicate(new Reference(NXQL.ECM_MIXINTYPE), Operator.EQ, new StringLiteral(mixin)); clauses.add(expr); } if (!facetFilter.excluded.isEmpty()) { LiteralList list = new LiteralList(); for (String mixin : facetFilter.excluded) { list.add(new StringLiteral(mixin)); } Predicate expr = new Predicate(new Reference(NXQL.ECM_MIXINTYPE), Operator.NOTIN, list); clauses.add(expr); } }
public void addFacetFilterClauses(FacetFilter facetFilter) { for (String mixin : facetFilter.required) { // every facet is required, not just any of them, // so do them one by one // expr = getMixinsMatchExpression(Collections.singleton(facet), // true); Predicate predicate = new Predicate(new Reference(NXQL.ECM_MIXINTYPE), Operator.EQ, new StringLiteral(mixin)); toplevelPredicates.add(predicate); } if (!facetFilter.excluded.isEmpty()) { // expr = getMixinsMatchExpression(facetFilter.excluded, false); LiteralList list = new LiteralList(); for (String mixin : facetFilter.excluded) { list.add(new StringLiteral(mixin)); } Predicate predicate = new Predicate(new Reference(NXQL.ECM_MIXINTYPE), Operator.NOTIN, list); toplevelPredicates.add(predicate); } }
protected void visitExpressionStartsWithNonPath(Expression node, String path) { String name = ((Reference) node.lvalue).name; ColumnInfo info = getColumnInfo(name); if (info.needsSubSelect) { // use EXISTS with subselect clause generateExistsStart(buf, info.column.getTable()); } buf.append('('); visitExpressionEqOrIn(info.column, Operator.EQ, new StringLiteral(path), null, -1); visitOperator(Operator.OR); // TODO escape % chars... visitExpressionLike(info.column, Operator.LIKE, new StringLiteral(path + PATH_SEP + '%'), name, -1); buf.append(')'); if (info.needsSubSelect) { generateExistsEnd(buf); } }
if (primaryTypes.size() == 1) { String pt = primaryTypes.iterator().next(); predicate = new Predicate(new Reference(NXQL.ECM_PRIMARYTYPE), Operator.EQ, new StringLiteral(pt)); } else { // primaryTypes.size() > 1 LiteralList list = new LiteralList(); for (String pt : primaryTypes) { list.add(new StringLiteral(pt));
if (primaryTypes.size() == 1) { String pt = primaryTypes.iterator().next(); predicate = new Predicate(new Reference(NXQL.ECM_PRIMARYTYPE), Operator.EQ, new StringLiteral(pt)); } else { // primaryTypes.size() > 1 LiteralList list = new LiteralList(); for (String pt : primaryTypes) { list.add(new StringLiteral(pt));
rvalue = new StringLiteral(ft); return walkLike(new Reference(prop), rvalue, true, true);
/** * 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)); }
protected Document walkIsTrashed(Operator op, Operand rvalue) { if (op != Operator.EQ && op != Operator.NOTEQ) { throw new QueryParseException(NXQL.ECM_ISTRASHED + " requires = or <> operator"); } TrashService trashService = Framework.getService(TrashService.class); if (trashService.hasFeature(TRASHED_STATE_IS_DEDUCED_FROM_LIFECYCLE)) { return walkIsTrashed(new Reference(NXQL.ECM_LIFECYCLESTATE), op, rvalue, new StringLiteral(LifeCycleConstants.DELETED_STATE)); } else if (trashService.hasFeature(TRASHED_STATE_IN_MIGRATION)) { Document lifeCycleTrashed = walkIsTrashed(new Reference(NXQL.ECM_LIFECYCLESTATE), op, rvalue, new StringLiteral(LifeCycleConstants.DELETED_STATE)); Document propertyTrashed = walkIsTrashed(new Reference(NXQL.ECM_ISTRASHED), op, rvalue, new BooleanLiteral(true)); return new Document(QueryOperators.OR, new ArrayList<>(Arrays.asList(lifeCycleTrashed, propertyTrashed))); } else if (trashService.hasFeature(TRASHED_STATE_IS_DEDICATED_PROPERTY)) { return walkIsTrashed(new Reference(NXQL.ECM_ISTRASHED), op, rvalue, new BooleanLiteral(true)); } else { throw new UnsupportedOperationException("TrashService is in an unknown state"); } }
LiteralList list = new LiteralList(); for (String type : fromTypes) { list.add(new StringLiteral(type));
protected Boolean walkEcmFulltext(String name, Operator op, Operand rvalue) { if (op != Operator.EQ && op != Operator.LIKE) { throw new QueryParseException(NXQL.ECM_FULLTEXT + " requires = or LIKE operator"); } if (!(rvalue instanceof StringLiteral)) { throw new QueryParseException(NXQL.ECM_FULLTEXT + " requires literal string as right argument"); } if (fulltextSearchDisabled) { throw new QueryParseException("Fulltext search disabled by configuration"); } String query = ((StringLiteral) rvalue).value; if (name.equals(NXQL.ECM_FULLTEXT)) { // standard fulltext query hasFulltext = true; String simple = (String) walkReference(new Reference(NXQL_ECM_FULLTEXT_SIMPLE)); String binary = (String) walkReference(new Reference(NXQL_ECM_FULLTEXT_BINARY)); return fulltext(simple, binary, query); } else { // secondary index match with explicit field // do a regexp on the field if (name.charAt(NXQL.ECM_FULLTEXT.length()) != '.') { throw new QueryParseException(name + " has incorrect syntax for a secondary fulltext index"); } String prop = name.substring(NXQL.ECM_FULLTEXT.length() + 1); String ft = query.replace(" ", "%"); rvalue = new StringLiteral(ft); return walkLike(new Reference(prop), rvalue, true, true); } }
protected Boolean walkIsTrashed(Operator op, Operand rvalue) { if (op != Operator.EQ && op != Operator.NOTEQ) { throw new QueryParseException(NXQL.ECM_ISTRASHED + " requires = or <> operator"); } TrashService trashService = Framework.getService(TrashService.class); if (trashService.hasFeature(TRASHED_STATE_IS_DEDUCED_FROM_LIFECYCLE)) { return walkIsTrashed(new Reference(NXQL.ECM_LIFECYCLESTATE), op, rvalue, new StringLiteral(LifeCycleConstants.DELETED_STATE)); } else if (trashService.hasFeature(TRASHED_STATE_IN_MIGRATION)) { Boolean lifeCycleTrashed = walkIsTrashed(new Reference(NXQL.ECM_LIFECYCLESTATE), op, rvalue, new StringLiteral(LifeCycleConstants.DELETED_STATE)); Boolean propertyTrashed = walkIsTrashed(new Reference(NXQL.ECM_ISTRASHED), op, rvalue, new IntegerLiteral(1L)); return or(lifeCycleTrashed, propertyTrashed); } else if (trashService.hasFeature(TRASHED_STATE_IS_DEDICATED_PROPERTY)) { return walkIsTrashed(new Reference(NXQL.ECM_ISTRASHED), op, rvalue, new IntegerLiteral(1L)); } else { throw new UnsupportedOperationException("TrashService is in an unknown state"); } }