You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2015/09/04 09:35:07 UTC

[09/10] incubator-calcite git commit: Fix up [CALCITE-844], and enable ProjectWindowTransposeRule by default

Fix up [CALCITE-844], and enable ProjectWindowTransposeRule by default


Project: http://git-wip-us.apache.org/repos/asf/incubator-calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-calcite/commit/977206c5
Tree: http://git-wip-us.apache.org/repos/asf/incubator-calcite/tree/977206c5
Diff: http://git-wip-us.apache.org/repos/asf/incubator-calcite/diff/977206c5

Branch: refs/heads/master
Commit: 977206c5c0521f4e7aa3f18159b19a6467e0744c
Parents: 5219eb8
Author: Julian Hyde <jh...@apache.org>
Authored: Thu Sep 3 18:17:24 2015 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Fri Sep 4 00:34:00 2015 -0700

----------------------------------------------------------------------
 .../calcite/prepare/CalcitePrepareImpl.java     |  2 +
 .../rel/rules/ProjectWindowTransposeRule.java   | 86 +++++++++-----------
 2 files changed, 39 insertions(+), 49 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/977206c5/core/src/main/java/org/apache/calcite/prepare/CalcitePrepareImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/prepare/CalcitePrepareImpl.java b/core/src/main/java/org/apache/calcite/prepare/CalcitePrepareImpl.java
index 87bd09f..f761e3c 100644
--- a/core/src/main/java/org/apache/calcite/prepare/CalcitePrepareImpl.java
+++ b/core/src/main/java/org/apache/calcite/prepare/CalcitePrepareImpl.java
@@ -86,6 +86,7 @@ import org.apache.calcite.rel.rules.JoinPushThroughJoinRule;
 import org.apache.calcite.rel.rules.ProjectFilterTransposeRule;
 import org.apache.calcite.rel.rules.ProjectMergeRule;
 import org.apache.calcite.rel.rules.ProjectTableScanRule;
+import org.apache.calcite.rel.rules.ProjectWindowTransposeRule;
 import org.apache.calcite.rel.rules.ReduceExpressionsRule;
 import org.apache.calcite.rel.rules.SortProjectTransposeRule;
 import org.apache.calcite.rel.rules.TableScanRule;
@@ -222,6 +223,7 @@ public class CalcitePrepareImpl implements CalcitePrepare {
           AggregateExpandDistinctAggregatesRule.INSTANCE,
           AggregateReduceFunctionsRule.INSTANCE,
           FilterAggregateTransposeRule.INSTANCE,
+          ProjectWindowTransposeRule.INSTANCE,
           JoinCommuteRule.INSTANCE,
           JoinPushThroughJoinRule.RIGHT,
           JoinPushThroughJoinRule.LEFT,

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/977206c5/core/src/main/java/org/apache/calcite/rel/rules/ProjectWindowTransposeRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ProjectWindowTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ProjectWindowTransposeRule.java
index 2705420..c79c10c 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectWindowTransposeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectWindowTransposeRule.java
@@ -16,6 +16,7 @@
  */
 package org.apache.calcite.rel.rules;
 
+import org.apache.calcite.plan.RelOptCluster;
 import org.apache.calcite.plan.RelOptRule;
 import org.apache.calcite.plan.RelOptRuleCall;
 import org.apache.calcite.rel.RelCollations;
@@ -23,17 +24,17 @@ import org.apache.calcite.rel.RelFieldCollation;
 import org.apache.calcite.rel.core.Window;
 import org.apache.calcite.rel.logical.LogicalProject;
 import org.apache.calcite.rel.logical.LogicalWindow;
+import org.apache.calcite.rel.type.RelDataTypeFactory;
 import org.apache.calcite.rel.type.RelDataTypeField;
-import org.apache.calcite.rel.type.RelRecordType;
 import org.apache.calcite.rex.RexCall;
 import org.apache.calcite.rex.RexInputRef;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.rex.RexShuttle;
 import org.apache.calcite.sql.SqlAggFunction;
+import org.apache.calcite.util.BitSets;
 import org.apache.calcite.util.ImmutableBitSet;
 
 import java.util.ArrayList;
-import java.util.BitSet;
 import java.util.List;
 
 /**
@@ -44,26 +45,26 @@ import java.util.List;
 public class ProjectWindowTransposeRule extends RelOptRule {
   /** The default instance of
    * {@link org.apache.calcite.rel.rules.ProjectWindowTransposeRule}. */
-  public static final ProjectWindowTransposeRule INSTANCE = new ProjectWindowTransposeRule();
+  public static final ProjectWindowTransposeRule INSTANCE =
+      new ProjectWindowTransposeRule();
 
   private ProjectWindowTransposeRule() {
     super(
-        operand(
-            LogicalProject.class,
-                operand(LogicalWindow.class,
-                    any())));
+        operand(LogicalProject.class,
+            operand(LogicalWindow.class, any())));
   }
 
-  @Override
-  public void onMatch(RelOptRuleCall call) {
+  @Override public void onMatch(RelOptRuleCall call) {
     final LogicalProject project = call.rel(0);
     final LogicalWindow window = call.rel(1);
-    final List<RelDataTypeField> rowTypeWindowInput = window.getInput().getRowType().getFieldList();
+    final RelOptCluster cluster = window.getCluster();
+    final List<RelDataTypeField> rowTypeWindowInput =
+        window.getInput().getRowType().getFieldList();
     final int windowInputColumn = rowTypeWindowInput.size();
 
     // Record the window input columns which are actually referred
     // either in the LogicalProject above LogicalWindow or LogicalWindow itself
-    final BitSet beReferred = findReference(project, window);
+    final ImmutableBitSet beReferred = findReference(project, window);
 
     // If all the the window input columns are referred,
     // it is impossible to trim anyone of them out
@@ -73,40 +74,33 @@ public class ProjectWindowTransposeRule extends RelOptRule {
 
     // Put a DrillProjectRel below LogicalWindow
     final List<RexNode> exps = new ArrayList<>();
-    final List<RelDataTypeField> fields = new ArrayList<>();
+    final RelDataTypeFactory.FieldInfoBuilder builder =
+        cluster.getTypeFactory().builder();
 
     // Keep only the fields which are referred
-    for  (int index = beReferred.nextSetBit(0); index >= 0;
-        index = beReferred.nextSetBit(index + 1)) {
+    for (int index : BitSets.toIter(beReferred)) {
       final RelDataTypeField relDataTypeField = rowTypeWindowInput.get(index);
       exps.add(new RexInputRef(index, relDataTypeField.getType()));
-      fields.add(relDataTypeField);
+      builder.add(relDataTypeField);
     }
 
-    final LogicalProject projectBelowWindow = new LogicalProject(
-        window.getCluster(),
-        window.getTraitSet(),
-        window.getInput(),
-        exps,
-        new RelRecordType(fields));
+    final LogicalProject projectBelowWindow =
+        new LogicalProject(cluster, window.getTraitSet(),
+            window.getInput(), exps, builder.build());
 
     // Create a new LogicalWindow with necessary inputs only
-    final List<RelDataTypeField> inputWinFields = fields;
-    final List<RelDataTypeField> outputWindFields = new ArrayList<>(inputWinFields);
     final List<Window.Group> groups = new ArrayList<>();
 
     // As the un-referred columns are trimmed by the LogicalProject,
     // the indices specified in LogicalWindow would need to be adjusted
     final RexShuttle indexAdjustment = new RexShuttle() {
-      @Override
-      public RexNode visitInputRef(RexInputRef inputRef) {
+      @Override public RexNode visitInputRef(RexInputRef inputRef) {
         final int index = inputRef.getIndex();
         final int newIndex = beReferred.get(0, index).cardinality();
         return new RexInputRef(newIndex, inputRef.getType());
       }
 
-      @Override
-      public RexNode visitCall(final RexCall call) {
+      @Override public RexNode visitCall(final RexCall call) {
         final List<RexNode> clonedOperands = visitList(call.operands, new boolean[]{false});
         if (call instanceof Window.RexWinAggCall) {
           return new Window.RexWinAggCall(
@@ -121,6 +115,9 @@ public class ProjectWindowTransposeRule extends RelOptRule {
     };
 
     int aggCallIndex = windowInputColumn;
+    final RelDataTypeFactory.FieldInfoBuilder outputBuilder =
+        cluster.getTypeFactory().builder();
+    outputBuilder.addAll(projectBelowWindow.getRowType().getFieldList());
     for (Window.Group group : window.groups) {
       final ImmutableBitSet.Builder keys = ImmutableBitSet.builder();
       final List<RelFieldCollation> orderKeys = new ArrayList<>();
@@ -143,32 +140,23 @@ public class ProjectWindowTransposeRule extends RelOptRule {
 
         final RelDataTypeField relDataTypeField =
             window.getRowType().getFieldList().get(aggCallIndex);
-        outputWindFields.add(relDataTypeField);
+        outputBuilder.add(relDataTypeField);
         ++aggCallIndex;
       }
 
-      groups.add(new Window.Group(
-          keys.build(),
-          group.isRows,
-          group.lowerBound,
-          group.upperBound,
-          RelCollations.of(orderKeys),
-          aggCalls));
+      groups.add(
+          new Window.Group(keys.build(), group.isRows, group.lowerBound,
+              group.upperBound, RelCollations.of(orderKeys), aggCalls));
     }
 
-    final LogicalWindow newLogicalWindow = new LogicalWindow(
-        window.getCluster(),
-        window.getTraitSet(),
-        projectBelowWindow,
-        window.constants,
-        new RelRecordType(outputWindFields),
-        groups);
+    final LogicalWindow newLogicalWindow =
+        LogicalWindow.create(window.getTraitSet(), projectBelowWindow,
+        window.constants, outputBuilder.build(), groups);
 
     // Modify the top LogicalProject
     final List<RexNode> topProjExps = new ArrayList<>();
     final RexShuttle topProjAdjustment = new RexShuttle() {
-      @Override
-      public RexNode visitInputRef(RexInputRef inputRef) {
+      @Override public RexNode visitInputRef(RexInputRef inputRef) {
         final int index = inputRef.getIndex();
         final int newIndex;
         if (index >= windowInputColumn) {
@@ -197,13 +185,13 @@ public class ProjectWindowTransposeRule extends RelOptRule {
     }
   }
 
-  private BitSet findReference(final LogicalProject project, final LogicalWindow window) {
+  private ImmutableBitSet findReference(final LogicalProject project,
+      final LogicalWindow window) {
     final int windowInputColumn = window.getInput().getRowType().getFieldCount();
-    final BitSet beReferred = new BitSet(window.getInput().getRowType().getFieldCount());
+    final ImmutableBitSet.Builder beReferred = ImmutableBitSet.builder();
 
     final RexShuttle referenceFinder = new RexShuttle() {
-      @Override
-      public RexNode visitInputRef(RexInputRef inputRef) {
+      @Override public RexNode visitInputRef(RexInputRef inputRef) {
         final int index = inputRef.getIndex();
         if (index < windowInputColumn) {
           beReferred.set(index);
@@ -238,7 +226,7 @@ public class ProjectWindowTransposeRule extends RelOptRule {
         rexWinAggCall.accept(referenceFinder);
       }
     }
-    return beReferred;
+    return beReferred.build();
   }
 }