diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/reloperators/HiveJoinRel.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/reloperators/HiveJoinRel.java index 6bebcc2..fa73abf 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/reloperators/HiveJoinRel.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/reloperators/HiveJoinRel.java @@ -11,6 +11,7 @@ import org.eigenbase.rel.InvalidRelException; import org.eigenbase.rel.JoinRelBase; import org.eigenbase.rel.JoinRelType; +import org.eigenbase.rel.RelFactories.JoinFactory; import org.eigenbase.rel.RelNode; import org.eigenbase.relopt.RelOptCluster; import org.eigenbase.relopt.RelOptCost; @@ -35,6 +36,8 @@ public enum MapJoinStreamingRelation { NONE, LEFT_RELATION, RIGHT_RELATION } + + public static final JoinFactory HIVE_JOIN_FACTORY = new HiveJoinFactoryImpl(); private final boolean m_leftSemiJoin; private final JoinAlgorithm m_joinAlgorithm; @@ -121,4 +124,30 @@ public RelDataType deriveRowType() { } return super.deriveRowType(); } + + private static class HiveJoinFactoryImpl implements JoinFactory { + /** + * Creates a join. + * + * @param left + * Left input + * @param right + * Right input + * @param condition + * Join condition + * @param joinType + * Join type + * @param variablesStopped + * Set of names of variables which are set by the LHS and used by + * the RHS and are not available to nodes above this JoinRel in the + * tree + * @param semiJoinDone + * Whether this join has been translated to a semi-join + */ + @Override + public RelNode createJoin(RelNode left, RelNode right, RexNode condition, JoinRelType joinType, + Set variablesStopped, boolean semiJoinDone) { + return getJoin(left.getCluster(), left, right, condition, joinType, false); + } + } } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/DerivedTableInjector.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/DerivedTableInjector.java index 72dfbcd..2af707c 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/DerivedTableInjector.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/DerivedTableInjector.java @@ -5,7 +5,6 @@ import org.apache.hadoop.hive.metastore.api.FieldSchema; import org.apache.hadoop.hive.ql.optimizer.optiq.reloperators.HiveAggregateRel; -import org.apache.hadoop.hive.ql.optimizer.optiq.reloperators.HiveJoinRel; import org.apache.hadoop.hive.ql.optimizer.optiq.reloperators.HiveProjectRel; import org.apache.hadoop.hive.ql.optimizer.optiq.reloperators.HiveSortRel; import org.eigenbase.rel.AggregateRelBase; @@ -48,7 +47,7 @@ private static void convertOpTree(RelNode rel, RelNode parent) { // TODO: replace with null scan } else if (rel instanceof HepRelVertex) { // TODO: is this relevant? - } else if (rel instanceof HiveJoinRel) { + } else if (rel instanceof JoinRelBase) { if (!validJoinParent(rel, parent)) { introduceDerivedTable(rel, parent); } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java index 053984e..ee6e516 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java @@ -229,6 +229,7 @@ import org.eigenbase.rel.JoinRelType; import org.eigenbase.rel.RelCollation; import org.eigenbase.rel.RelCollationImpl; +import org.eigenbase.rel.RelFactories; import org.eigenbase.rel.RelFieldCollation; import org.eigenbase.rel.RelNode; import org.eigenbase.rel.metadata.CachingRelMetadataProvider; @@ -11869,7 +11870,7 @@ public RelNode apply(RelOptCluster cluster, RelOptSchema relOptSchema, SchemaPlu } else { final HepProgram hepPgm = new HepProgramBuilder().addMatchOrder(HepMatchOrder.BOTTOM_UP) .addRuleInstance(new ConvertMultiJoinRule(HiveJoinRel.class)) - .addRuleInstance(LoptOptimizeJoinRule.INSTANCE).build(); + .addRuleInstance(new LoptOptimizeJoinRule(HiveJoinRel.HIVE_JOIN_FACTORY)).build(); HepPlanner hepPlanner = new HepPlanner(hepPgm);