Adjust project's trait field id based on the mapping from input to output. Output Rel and Logicl Rel for debug purpose.
Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/342f3fd0 Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/342f3fd0 Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/342f3fd0 Branch: refs/heads/master Commit: 342f3fd0d5ded9063f4e8ecacdcf23f7c85b9fa7 Parents: d3c7abe Author: Jinfeng Ni <[email protected]> Authored: Tue Apr 1 11:17:52 2014 -0700 Committer: Jacques Nadeau <[email protected]> Committed: Sat Apr 19 18:07:10 2014 -0700 ---------------------------------------------------------------------- .../physical/DrillDistributionTrait.java | 3 + .../exec/planner/physical/ProjectPrule.java | 86 +++++++++++++++++++- .../drill/exec/planner/sql/DrillSqlWorker.java | 7 +- 3 files changed, 94 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/342f3fd0/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/DrillDistributionTrait.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/DrillDistributionTrait.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/DrillDistributionTrait.java index aa2dad5..018f548 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/DrillDistributionTrait.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/DrillDistributionTrait.java @@ -137,6 +137,9 @@ public class DrillDistributionTrait implements RelTrait { return this.fieldId; } + public String toString() { + return new Integer(fieldId).toString(); + } } } http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/342f3fd0/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ProjectPrule.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ProjectPrule.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ProjectPrule.java index 8c6a1e5..fd48058 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ProjectPrule.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ProjectPrule.java @@ -17,17 +17,36 @@ */ package org.apache.drill.exec.planner.physical; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import net.hydromatic.linq4j.Ord; + import org.apache.drill.exec.planner.common.DrillProjectRelBase; import org.apache.drill.exec.planner.logical.DrillProjectRel; import org.apache.drill.exec.planner.logical.DrillRel; import org.apache.drill.exec.planner.logical.RelOptHelper; +import org.apache.drill.exec.planner.physical.DrillDistributionTrait.DistributionField; +import org.apache.drill.exec.planner.physical.DrillDistributionTrait.DistributionType; import org.eigenbase.rel.ProjectRel; +import org.eigenbase.rel.RelCollation; +import org.eigenbase.rel.RelCollationImpl; +import org.eigenbase.rel.RelCollationTraitDef; +import org.eigenbase.rel.RelFieldCollation; import org.eigenbase.rel.RelNode; import org.eigenbase.relopt.Convention; import org.eigenbase.relopt.RelOptRule; import org.eigenbase.relopt.RelOptRuleCall; import org.eigenbase.relopt.RelTraitSet; import org.eigenbase.relopt.volcano.RelSubset; +import org.eigenbase.rex.RexCall; +import org.eigenbase.rex.RexInputRef; +import org.eigenbase.rex.RexNode; +import org.eigenbase.sql.SqlKind; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; public class ProjectPrule extends RelOptRule { public static final RelOptRule INSTANCE = new ProjectPrule(); @@ -44,11 +63,21 @@ public class ProjectPrule extends RelOptRule { RelTraitSet traits = input.getTraitSet().plus(Prel.DRILL_PHYSICAL); RelNode convertedInput = convert(input, traits); + Map<Integer, Integer> inToOut = getProjectMap(project); + if (convertedInput instanceof RelSubset) { RelSubset subset = (RelSubset) convertedInput; for (RelNode rel : subset.getRelList()) { if (!rel.getTraitSet().getTrait(DrillDistributionTraitDef.INSTANCE).equals(DrillDistributionTrait.DEFAULT)) { - call.transformTo(new ProjectPrel(project.getCluster(), rel.getTraitSet(), rel, project.getProjects(), project.getRowType())); + DrillDistributionTrait childDist = rel.getTraitSet().getTrait(DrillDistributionTraitDef.INSTANCE); + RelCollation childCollation = rel.getTraitSet().getTrait(RelCollationTraitDef.INSTANCE); + + + DrillDistributionTrait newDist = convertDist(childDist, inToOut); + RelCollation newCollation = convertRelCollation(childCollation, inToOut); + + call.transformTo(new ProjectPrel(project.getCluster(), project.getTraitSet().plus(newDist).plus(newCollation).plus(Prel.DRILL_PHYSICAL), + rel, project.getProjects(), project.getRowType())); } } @@ -56,4 +85,59 @@ public class ProjectPrule extends RelOptRule { call.transformTo(new ProjectPrel(project.getCluster(), convertedInput.getTraitSet(), convertedInput, project.getProjects(), project.getRowType())); } } + + private DrillDistributionTrait convertDist(DrillDistributionTrait srcDist, Map<Integer, Integer> inToOut) { + List<DistributionField> newFields = Lists.newArrayList(); + + for (DistributionField field : srcDist.getFields()) { + if (inToOut.containsKey(field.getFieldId())) { + newFields.add(new DistributionField(inToOut.get(field.getFieldId()))); + } + } + + if (newFields.isEmpty()) { + if (srcDist.getType() != DistributionType.SINGLETON) { + return DrillDistributionTrait.RANDOM_DISTRIBUTED; + } else { + return DrillDistributionTrait.SINGLETON; + } + } else { + return new DrillDistributionTrait(srcDist.getType(), ImmutableList.copyOf(newFields)); + } + } + + private RelCollation convertRelCollation(RelCollation src, Map<Integer, Integer> inToOut) { + List<RelFieldCollation> newFields = Lists.newArrayList(); + + for ( RelFieldCollation field : src.getFieldCollations()) { + if (inToOut.containsKey(field.getFieldIndex())) { + newFields.add(new RelFieldCollation(inToOut.get(field.getFieldIndex()))); + } + } + + if (newFields.isEmpty()) { + return RelCollationImpl.EMPTY; + } else { + return RelCollationImpl.of(newFields); + } + } + + private Map<Integer, Integer> getProjectMap(DrillProjectRel project) { + Map<Integer, Integer> m = new HashMap<Integer, Integer>(); + + for (Ord<RexNode> node : Ord.zip(project.getProjects())) { + if (node.e instanceof RexInputRef) { + m.put( ((RexInputRef) node.e).getIndex(), node.i); + } else if (node.e.isA(SqlKind.CAST)) { + RexNode operand = ((RexCall) node.e).getOperands().get(0); + if (operand instanceof RexInputRef) { + m.put( + ((RexInputRef) operand).getIndex(), node.i); + } + } + } + return m; + + } + } http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/342f3fd0/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillSqlWorker.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillSqlWorker.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillSqlWorker.java index 30eb605..c540066 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillSqlWorker.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillSqlWorker.java @@ -115,13 +115,18 @@ public class DrillSqlWorker { SqlNode validatedNode = planner.validate(sqlNode); RelNode relNode = planner.convert(validatedNode); + + System.out.println(RelOptUtil.toString(relNode, SqlExplainLevel.ALL_ATTRIBUTES)); + RelNode convertedRelNode = planner.transform(LOGICAL_RULES, planner.getEmptyTraitSet().plus(DrillRel.DRILL_LOGICAL), relNode); if(convertedRelNode instanceof DrillStoreRel){ throw new UnsupportedOperationException(); }else{ convertedRelNode = new DrillScreenRel(convertedRelNode.getCluster(), convertedRelNode.getTraitSet(), convertedRelNode); } - + + System.out.println(RelOptUtil.toString(convertedRelNode, SqlExplainLevel.ALL_ATTRIBUTES)); + return new RelResult(resultMode, convertedRelNode); }
