diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/HiveOpConverter.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/HiveOpConverter.java index d15520c..760491f 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/HiveOpConverter.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/HiveOpConverter.java @@ -147,6 +147,10 @@ public Operator convert(RelNode root) throws SemanticException { } OpAttr dispatch(RelNode rn) throws SemanticException { + return dispatch(rn, null); + } + + OpAttr dispatch(RelNode rn, ExprNodeDesc[] exprNodeDescs) throws SemanticException { if (rn instanceof HiveTableScan) { return visit((HiveTableScan) rn); } else if (rn instanceof HiveProject) { @@ -165,7 +169,7 @@ OpAttr dispatch(RelNode rn) throws SemanticException { } else if (rn instanceof HiveUnion) { return visit((HiveUnion) rn); } else if (rn instanceof SortExchange) { - return visit((SortExchange) rn); + return visit((SortExchange) rn, exprNodeDescs); } else if (rn instanceof HiveAggregate) { return visit((HiveAggregate) rn); } @@ -295,11 +299,17 @@ OpAttr visit(HiveProject projectRel) throws SemanticException { } OpAttr visit(HiveJoin joinRel) throws SemanticException { - // 1. Convert inputs + // 1. Convert join condition + JoinPredicateInfo joinPredInfo = JoinPredicateInfo.constructJoinPredicateInfo(joinRel); + + // 2. Extract join keys from condition + ExprNodeDesc[][] joinKeys = extractJoinKeys(joinPredInfo, joinRel.getInputs()); + + // 3. Convert inputs OpAttr[] inputs = new OpAttr[joinRel.getInputs().size()]; List> children = new ArrayList>(joinRel.getInputs().size()); for (int i = 0; i < inputs.length; i++) { - inputs[i] = dispatch(joinRel.getInput(i)); + inputs[i] = dispatch(joinRel.getInput(i), joinKeys[i]); children.add(inputs[i].inputs.get(0)); } @@ -308,12 +318,6 @@ OpAttr visit(HiveJoin joinRel) throws SemanticException { + " with row type: [" + joinRel.getRowType() + "]"); } - // 2. Convert join condition - JoinPredicateInfo joinPredInfo = JoinPredicateInfo.constructJoinPredicateInfo(joinRel); - - // 3. Extract join keys from condition - ExprNodeDesc[][] joinKeys = extractJoinKeys(joinPredInfo, joinRel.getInputs()); - // 4.a Generate tags for (int tag=0; tag inputs) { ExprNodeDesc[][] joinKeys = new ExprNodeDesc[inputs.size()][]; - for (int i = 0; i < inputs.size(); i++) { - joinKeys[i] = new ExprNodeDesc[joinPredInfo.getEquiJoinPredicateElements().size()]; - for (int j = 0; j < joinPredInfo.getEquiJoinPredicateElements().size(); j++) { - JoinLeafPredicateInfo joinLeafPredInfo = joinPredInfo.getEquiJoinPredicateElements().get(j); - RexNode key = joinLeafPredInfo.getJoinKeyExprs(j).get(0); - joinKeys[i][j] = convertToExprNode(key, inputs.get(j), null); + // Assumption here is that inputs only contains 2 inputs. input=0 is left, input=1 is right + for (int input = 0; input < inputs.size(); input++) { + joinKeys[input] = new ExprNodeDesc[joinPredInfo.getEquiJoinPredicateElements().size()]; + for (int element = 0; element < joinPredInfo.getEquiJoinPredicateElements().size(); element++) { + JoinLeafPredicateInfo joinLeafPredInfo = joinPredInfo.getEquiJoinPredicateElements().get(element); + //getJoinKeyExprs(0) is left, getJoinKeyExprs(1) is right + RexNode key = joinLeafPredInfo.getJoinKeyExprs(input).get(0); + joinKeys[input][element] = convertToExprNode(key, inputs.get(input), null); } } return joinKeys;