@Override public LogicalExpression visitBooleanOperator(BooleanOperator op, Void value) throws RuntimeException { List<LogicalExpression> newArgs = Lists.newArrayList(); newArgs.addAll(op.args); Collections.sort(newArgs, costComparator); return new BooleanOperator(op.getName(), newArgs, op.getPosition()); }
@Override public LogicalExpression visitBooleanOperator(BooleanOperator op, Void value) throws RuntimeException { List<LogicalExpression> newArgs = Lists.newArrayList(); newArgs.addAll(op.args); Collections.sort(newArgs, costComparator); return new BooleanOperator(op.getName(), newArgs, op.getPosition()); }
@Override public LogicalExpression visitBooleanOperator(BooleanOperator op, Set<LogicalExpression> value) { List<LogicalExpression> childPredicates = new ArrayList<>(); String functionName = op.getName(); for (LogicalExpression arg : op.args) { LogicalExpression childPredicate = arg.accept(this, value); if (childPredicate == null) { if (functionName.equals("booleanOr") || !omitUnsupportedExprs) { // we can't include any leg of the OR if any of the predicates cannot be converted // or prohibited omitting of unconverted operands return null; } } else { if (childPredicate instanceof TypedFieldExpr) { // Calcite simplifies `= true` expression to field name, wrap it with is true predicate childPredicate = ParquetIsPredicate.createIsPredicate(FunctionGenerationHelper.IS_TRUE, childPredicate); } childPredicates.add(childPredicate); } } if (childPredicates.size() == 0) { return null; // none leg is qualified, return null. } else if (childPredicates.size() == 1) { return childPredicates.get(0); // only one leg is qualified, remove boolean op. } else { return ParquetBooleanPredicate.createBooleanPredicate(functionName, op.getName(), childPredicates, op.getPosition()); } }
@Override public LogicalExpression visitBooleanOperator(BooleanOperator op, FunctionLookupContext functionLookupContext) { List<LogicalExpression> args = Lists.newArrayList(); for (int i = 0; i < op.args.size(); ++i) { LogicalExpression newExpr = op.args.get(i).accept(this, functionLookupContext); assert newExpr != null : String.format("Materialization of %s return a null expression.", op.args.get(i)); args.add(newExpr); } //replace with a new function call, since its argument could be changed. return new BooleanOperator(op.getName(), args, op.getPosition()); }