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; }
