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