You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by gu...@apache.org on 2014/08/01 03:48:06 UTC

svn commit: r1615021 - /hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java

Author: gunther
Date: Fri Aug  1 01:48:06 2014
New Revision: 1615021

URL: http://svn.apache.org/r1615021
Log:
HIVE-7577: Introduce Bushy Join Re order Algo (Laljo John Pullokkaran via Gunther Hagleitner)

Modified:
    hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java

Modified: hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
URL: http://svn.apache.org/viewvc/hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java?rev=1615021&r1=1615020&r2=1615021&view=diff
==============================================================================
--- hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java (original)
+++ hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java Fri Aug  1 01:48:06 2014
@@ -237,11 +237,13 @@ import org.eigenbase.rel.metadata.Chaine
 import org.eigenbase.rel.metadata.RelMetadataProvider;
 import org.eigenbase.rel.rules.ConvertMultiJoinRule;
 import org.eigenbase.rel.rules.LoptOptimizeJoinRule;
+import org.eigenbase.rel.rules.OptimizeBushyJoinRule;
 import org.eigenbase.relopt.RelOptCluster;
 import org.eigenbase.relopt.RelOptPlanner;
 import org.eigenbase.relopt.RelOptQuery;
 import org.eigenbase.relopt.RelOptRule;
 import org.eigenbase.relopt.RelOptSchema;
+import org.eigenbase.relopt.RelOptUtil;
 import org.eigenbase.relopt.RelTraitSet;
 import org.eigenbase.relopt.hep.HepMatchOrder;
 import org.eigenbase.relopt.hep.HepPlanner;
@@ -11843,8 +11845,9 @@ public class SemanticAnalyzer extends Ba
       List<RelMetadataProvider> list = Lists.newArrayList();
       list.add(HiveDefaultRelMetadataProvider.INSTANCE);
       RelTraitSet desiredTraits = cluster.traitSetOf(HiveRel.CONVENTION, RelCollationImpl.EMPTY);
+      final boolean bushy = RelOptUtil.countJoins(optiqPreCboPlan) > 3 ? true : false;
 
-      if (!HiveConf.getBoolVar(conf, HiveConf.ConfVars.HIVE_CBO_GREEDY_JOIN_ORDER)) {
+      if (!bushy) {
         planner.registerMetadataProviders(list);
 
         RelMetadataProvider chainedProvider = ChainedRelMetadataProvider.of(list);
@@ -11868,10 +11871,16 @@ public class SemanticAnalyzer extends Ba
 
         optiqOptimizedPlan = planner.findBestExp();
       } else {
-        final HepProgram hepPgm = new HepProgramBuilder().addMatchOrder(HepMatchOrder.BOTTOM_UP)
-            .addRuleInstance(new ConvertMultiJoinRule(HiveJoinRel.class))
-            .addRuleInstance(new LoptOptimizeJoinRule(HiveJoinRel.HIVE_JOIN_FACTORY)).build();
-
+        HepProgram hepPgm = null;
+        HepProgramBuilder hepPgmBldr = new HepProgramBuilder().addMatchOrder(
+            HepMatchOrder.BOTTOM_UP).addRuleInstance(new ConvertMultiJoinRule(HiveJoinRel.class));
+        if (HiveConf.getBoolVar(conf, HiveConf.ConfVars.HIVE_CBO_GREEDY_JOIN_ORDER)) {
+          hepPgmBldr.addRuleInstance(new LoptOptimizeJoinRule(HiveJoinRel.HIVE_JOIN_FACTORY));
+        } else {
+          hepPgmBldr.addRuleInstance(new OptimizeBushyJoinRule(HiveJoinRel.HIVE_JOIN_FACTORY,
+              HiveProjectRel.DEFAULT_PROJECT_FACTORY));
+        }
+        hepPgm = hepPgmBldr.build();
         HepPlanner hepPlanner = new HepPlanner(hepPgm);
 
         hepPlanner.registerMetadataProviders(list);