protected Result evalAndOr(Expression expr) { List<Predicate> predicates = Arrays.asList((Predicate) expr.lvalue, (Predicate) expr.rvalue); return evalMultiExpression(new MultiExpression(expr.operator, predicates)); }
/** * Makes a single AND predicate from several expressions known to have a common prefix. */ public static Predicate makeSingleAndPredicate(String prefix, List<Predicate> predicates) { if (predicates.size() == 1) { return predicates.get(0); } else { int count = prefix.isEmpty() ? 0 : predicates.stream().mapToInt(QueryOptimizer::getExpressionCount).sum(); Predicate e = new MultiExpression(Operator.AND, predicates); e.setInfo(new PrefixInfo(prefix, count)); return e; } }
protected SQLQuery addIsNotNullClauses(SQLQuery query, Collection<String> names) { List<Predicate> values = names.stream() .map(name -> new Predicate(new Reference(name), Operator.ISNOTNULL, null)) .collect(toList()); Predicate expr = new Predicate(query.where.predicate, Operator.AND, new MultiExpression(Operator.AND, values)); return query.withPredicate(expr); }
@Override public void visitWhereClause(WhereClause node) { if (node != null) { analyzeToplevelPredicates(node.predicate); } simplifyToplevelPredicates(); wherePredicate = new MultiExpression(Operator.AND, toplevelPredicates); super.visitMultiExpression(wherePredicate); }
/** * Adds the tenant id to the query if needed. * * @since 10.3 */ protected QueryBuilder addTenantId(QueryBuilder queryBuilder) { if (!isMultiTenant()) { return queryBuilder; } String tenantId = getCurrentTenantId(); if (StringUtils.isEmpty(tenantId)) { return queryBuilder; } // predicate to add Predicate predicate = Predicates.eq(TENANT_ID_FIELD, tenantId); // add to query queryBuilder = new QueryBuilder(queryBuilder); // copy MultiExpression multiExpression = queryBuilder.predicate(); if (multiExpression.predicates.isEmpty()) { queryBuilder.predicate(predicate); } else if (multiExpression.operator == Operator.AND || multiExpression.predicates.size() == 1) { queryBuilder.and(predicate); } else { // query is an OR multiexpression queryBuilder.filter( new MultiExpression(Operator.AND, new ArrayList<>(Arrays.asList(predicate, multiExpression)))); } return queryBuilder; }
addWhere(clauses, query.where); simplifyTypes(clauses); MultiExpression multiExpression = new MultiExpression(Operator.AND, clauses);