DRILL-5286: No need to convert when the relNode and target candidate set are 
the same

This closes #797


Project: http://git-wip-us.apache.org/repos/asf/drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/drill/commit/0b17fbf5
Tree: http://git-wip-us.apache.org/repos/asf/drill/tree/0b17fbf5
Diff: http://git-wip-us.apache.org/repos/asf/drill/diff/0b17fbf5

Branch: refs/heads/master
Commit: 0b17fbf5234e1c81bea821a3dcd181c8c2962438
Parents: 13a568a
Author: chunhui-shi <[email protected]>
Authored: Fri Mar 24 18:09:04 2017 -0700
Committer: Parth Chandra <[email protected]>
Committed: Mon Jan 8 17:28:15 2018 -0800

----------------------------------------------------------------------
 .../planner/physical/SubsetTransformer.java     | 35 ++++++++++++++++----
 1 file changed, 29 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/drill/blob/0b17fbf5/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/SubsetTransformer.java
----------------------------------------------------------------------
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/SubsetTransformer.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/SubsetTransformer.java
index 485885a..03283b1 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/SubsetTransformer.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/SubsetTransformer.java
@@ -17,6 +17,7 @@
  */
 package org.apache.drill.exec.planner.physical;
 
+import com.google.common.collect.Sets;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.plan.ConventionTraitDef;
 import org.apache.calcite.plan.RelOptRule;
@@ -25,6 +26,8 @@ import org.apache.calcite.plan.RelTrait;
 import org.apache.calcite.plan.RelTraitSet;
 import org.apache.calcite.plan.volcano.RelSubset;
 
+import java.util.Set;
+
 public abstract class SubsetTransformer<T extends RelNode, E extends 
Exception> {
   static final org.slf4j.Logger logger = 
org.slf4j.LoggerFactory.getLogger(SubsetTransformer.class);
 
@@ -45,23 +48,43 @@ public abstract class SubsetTransformer<T extends RelNode, 
E extends Exception>
 
   }
 
-  boolean go(T n, RelNode candidateSet) throws E {
+  public boolean go(T n, RelNode candidateSet) throws E {
     if ( !(candidateSet instanceof RelSubset) ) {
       return false;
     }
 
     boolean transform = false;
+    Set<RelNode> transformedRels = Sets.newIdentityHashSet();
+    Set<RelTraitSet> traitSets = Sets.newHashSet();
+
+    //1, get all the target traitsets from candidateSet's rel list,
     for (RelNode rel : ((RelSubset)candidateSet).getRelList()) {
       if (isPhysical(rel)) {
-        RelNode newRel = RelOptRule.convert(candidateSet, 
rel.getTraitSet().plus(Prel.DRILL_PHYSICAL));
-        RelNode out = convertChild(n, newRel);
-        if (out != null) {
-          call.transformTo(out);
-          transform = true;
+        final RelTraitSet relTraitSet = rel.getTraitSet();
+        if ( !traitSets.contains(relTraitSet) ) {
+          traitSets.add(relTraitSet);
+          logger.trace("{}.convertChild get traitSet {}", 
this.getClass().getSimpleName(), relTraitSet);
         }
       }
     }
 
+    //2, convert the candidateSet to targeted taitSets
+    for (RelTraitSet traitSet: traitSets) {
+      RelNode newRel = RelOptRule.convert(candidateSet, traitSet);
+      if(transformedRels.contains(newRel)) {
+        continue;
+      }
+      transformedRels.add(newRel);
+
+      logger.trace("{}.convertChild to convert NODE {} ,AND {}", 
this.getClass().getSimpleName(), n, newRel);
+      RelNode out = convertChild(n, newRel);
+
+      //RelNode out = convertChild(n, rel);
+      if (out != null) {
+        call.transformTo(out);
+        transform = true;
+      }
+    }
 
     return transform;
   }

Reply via email to