You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@drill.apache.org by ja...@apache.org on 2014/04/20 03:18:35 UTC

[27/51] [abbrv] git commit: Adjust project's trait field id based on the mapping from input to output. Output Rel and Logicl Rel for debug purpose.

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 <jn...@maprtech.com>
Authored: Tue Apr 1 11:17:52 2014 -0700
Committer: Jacques Nadeau <ja...@apache.org>
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);
   }