From 5a3166deab470b4e287cd5a78f9cc7583648de47 Mon Sep 17 00:00:00 2001 From: chunhui-shi Date: Fri, 24 Mar 2017 18:09:04 -0700 Subject: [PATCH] DRILL-5286: No need to convert when the relNode and target candidate set are the same --- .../planner/physical/SubsetTransformer.java | 35 +++++++++++++++---- 1 file changed, 29 insertions(+), 6 deletions(-) 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 485885a013b..03283b13863 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.RelTraitSet; import org.apache.calcite.plan.volcano.RelSubset; +import java.util.Set; + public abstract class SubsetTransformer { static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(SubsetTransformer.class); @@ -45,23 +48,43 @@ public RelTraitSet newTraitSet(RelTrait... traits) { } - 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 transformedRels = Sets.newIdentityHashSet(); + Set 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; }