Search in sources :

Example 11 with RexVisitorImpl

use of org.apache.calcite.rex.RexVisitorImpl in project drill by apache.

the class DrillRelOptUtil method analyzeSimpleEquiJoin.

public static List<Pair<Integer, Integer>> analyzeSimpleEquiJoin(Join join) {
    List<Pair<Integer, Integer>> joinConditions = new ArrayList<>();
    try {
        RexVisitor<Void> visitor = new RexVisitorImpl<Void>(true) {

            @Override
            public Void visitCall(RexCall call) {
                if (call.getKind() == SqlKind.AND || call.getKind() == SqlKind.OR) {
                    super.visitCall(call);
                } else {
                    if (call.getKind() == SqlKind.EQUALS) {
                        RexNode leftComparand = call.operands.get(0);
                        RexNode rightComparand = call.operands.get(1);
                        // we bail out!
                        if (!(leftComparand instanceof RexInputRef && rightComparand instanceof RexInputRef)) {
                            joinConditions.clear();
                            throw new Util.FoundOne(call);
                        }
                        int leftFieldCount = join.getLeft().getRowType().getFieldCount();
                        int rightFieldCount = join.getRight().getRowType().getFieldCount();
                        RexInputRef leftFieldAccess = (RexInputRef) leftComparand;
                        RexInputRef rightFieldAccess = (RexInputRef) rightComparand;
                        if (leftFieldAccess.getIndex() >= leftFieldCount + rightFieldCount || rightFieldAccess.getIndex() >= leftFieldCount + rightFieldCount) {
                            joinConditions.clear();
                            throw new Util.FoundOne(call);
                        }
                        /* Both columns reference same table */
                        if ((leftFieldAccess.getIndex() >= leftFieldCount && rightFieldAccess.getIndex() >= leftFieldCount) || (leftFieldAccess.getIndex() < leftFieldCount && rightFieldAccess.getIndex() < leftFieldCount)) {
                            joinConditions.clear();
                            throw new Util.FoundOne(call);
                        } else {
                            if (leftFieldAccess.getIndex() < leftFieldCount) {
                                joinConditions.add(Pair.of(leftFieldAccess.getIndex(), rightFieldAccess.getIndex() - leftFieldCount));
                            } else {
                                joinConditions.add(Pair.of(rightFieldAccess.getIndex(), leftFieldAccess.getIndex() - leftFieldCount));
                            }
                        }
                    }
                }
                return null;
            }
        };
        join.getCondition().accept(visitor);
    } catch (Util.FoundOne ex) {
        Util.swallow(ex, null);
    }
    return joinConditions;
}
Also used : ArrayList(java.util.ArrayList) FieldsReWriterUtil(org.apache.drill.exec.planner.logical.FieldsReWriterUtil) SqlValidatorUtil(org.apache.calcite.sql.validate.SqlValidatorUtil) RelOptUtil(org.apache.calcite.plan.RelOptUtil) Util(org.apache.calcite.util.Util) RexCall(org.apache.calcite.rex.RexCall) RexInputRef(org.apache.calcite.rex.RexInputRef) RexVisitorImpl(org.apache.calcite.rex.RexVisitorImpl) Pair(org.apache.calcite.util.Pair) RexNode(org.apache.calcite.rex.RexNode)

Aggregations

RexVisitorImpl (org.apache.calcite.rex.RexVisitorImpl)11 RexNode (org.apache.calcite.rex.RexNode)9 RexCall (org.apache.calcite.rex.RexCall)8 RelOptUtil (org.apache.calcite.plan.RelOptUtil)7 RexInputRef (org.apache.calcite.rex.RexInputRef)7 Util (org.apache.calcite.util.Util)7 SqlValidatorUtil (org.apache.calcite.sql.validate.SqlValidatorUtil)5 RexUtil (org.apache.calcite.rex.RexUtil)3 ArrayList (java.util.ArrayList)2 HashSet (java.util.HashSet)2 RelNode (org.apache.calcite.rel.RelNode)2 RelMdUtil (org.apache.calcite.rel.metadata.RelMdUtil)2 RexSubQuery (org.apache.calcite.rex.RexSubQuery)2 Pair (org.apache.calcite.util.Pair)2 DrillRelOptUtil (org.apache.drill.exec.planner.common.DrillRelOptUtil)2 FieldsReWriterUtil (org.apache.drill.exec.planner.logical.FieldsReWriterUtil)2 PrelUtil (org.apache.drill.exec.planner.physical.PrelUtil)2 SlidingWindow (com.hazelcast.jet.sql.impl.opt.SlidingWindow)1 EnumSet (java.util.EnumSet)1 Set (java.util.Set)1