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

Reply via email to