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 2018/10/31 21:34:28 UTC
[4/7] calcite git commit: [CALCITE-2647] In RelBuilder,
add a groupKey method that assumes only one grouping set
[CALCITE-2647] In RelBuilder, add a groupKey method that assumes only one grouping set
Deprecate RelBuilder.groupKey(nodes, boolean, nodeList) (indicator is obsolete).
Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/0b7b24a6
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/0b7b24a6
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/0b7b24a6
Branch: refs/heads/master
Commit: 0b7b24a689d1791ad5c8127f02f69a3dba124689
Parents: b47413a
Author: Julian Hyde <jh...@apache.org>
Authored: Fri Sep 28 14:51:24 2018 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Wed Oct 31 12:00:51 2018 -0700
----------------------------------------------------------------------
.../rel/rules/AbstractMaterializedViewRule.java | 4 +-
.../rel/rules/AggregateExtractProjectRule.java | 7 ++-
.../rel/rules/AggregateJoinTransposeRule.java | 3 +-
.../AggregateProjectPullUpConstantsRule.java | 2 +-
.../rel/rules/AggregateUnionAggregateRule.java | 2 +-
.../rel/rules/AggregateUnionTransposeRule.java | 2 +-
.../rel/rules/IntersectToDistinctRule.java | 2 +-
.../org/apache/calcite/tools/RelBuilder.java | 51 ++++++++++++++++----
.../org/apache/calcite/test/RelBuilderTest.java | 2 +-
site/_docs/algebra.md | 2 +-
10 files changed, 54 insertions(+), 23 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/calcite/blob/0b7b24a6/core/src/main/java/org/apache/calcite/rel/rules/AbstractMaterializedViewRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/AbstractMaterializedViewRule.java b/core/src/main/java/org/apache/calcite/rel/rules/AbstractMaterializedViewRule.java
index cb34dc8..3a82f95 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/AbstractMaterializedViewRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/AbstractMaterializedViewRule.java
@@ -1204,7 +1204,7 @@ public abstract class AbstractMaterializedViewRule extends RelOptRule {
}
RelNode prevNode = relBuilder.peek();
RelNode result = relBuilder
- .aggregate(relBuilder.groupKey(groupSet, null), aggregateCalls)
+ .aggregate(relBuilder.groupKey(groupSet), aggregateCalls)
.build();
if (prevNode == result && groupSet.cardinality() != result.getRowType().getFieldCount()) {
// Aggregate was not inserted but we need to prune columns
@@ -1486,7 +1486,7 @@ public abstract class AbstractMaterializedViewRule extends RelOptRule {
relBuilder.project(inputViewExprs);
}
result = relBuilder
- .aggregate(relBuilder.groupKey(groupSet, null), aggregateCalls)
+ .aggregate(relBuilder.groupKey(groupSet), aggregateCalls)
.build();
if (prevNode == result && groupSet.cardinality() != result.getRowType().getFieldCount()) {
// Aggregate was not inserted but we need to prune columns
http://git-wip-us.apache.org/repos/asf/calcite/blob/0b7b24a6/core/src/main/java/org/apache/calcite/rel/rules/AggregateExtractProjectRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/AggregateExtractProjectRule.java b/core/src/main/java/org/apache/calcite/rel/rules/AggregateExtractProjectRule.java
index 23e1425..5559c97 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/AggregateExtractProjectRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/AggregateExtractProjectRule.java
@@ -105,10 +105,9 @@ public class AggregateExtractProjectRule extends RelOptRule {
final ImmutableBitSet newGroupSet =
Mappings.apply(mapping, aggregate.getGroupSet());
- final ImmutableList<ImmutableBitSet> newGroupSets =
- ImmutableList.copyOf(
- Iterables.transform(aggregate.getGroupSets(),
- bitSet -> Mappings.apply(mapping, bitSet)));
+ final Iterable<ImmutableBitSet> newGroupSets =
+ Iterables.transform(aggregate.getGroupSets(),
+ bitSet -> Mappings.apply(mapping, bitSet));
final List<RelBuilder.AggCall> newAggCallList = new ArrayList<>();
for (AggregateCall aggCall : aggregate.getAggCallList()) {
final ImmutableList<RexNode> args =
http://git-wip-us.apache.org/repos/asf/calcite/blob/0b7b24a6/core/src/main/java/org/apache/calcite/rel/rules/AggregateJoinTransposeRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/AggregateJoinTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/AggregateJoinTransposeRule.java
index e841952..9d6cf67 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/AggregateJoinTransposeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/AggregateJoinTransposeRule.java
@@ -285,8 +285,7 @@ public class AggregateJoinTransposeRule extends RelOptRule {
}
}
side.newInput = relBuilder.push(joinInput)
- .aggregate(relBuilder.groupKey(belowAggregateKey, null),
- belowAggCalls)
+ .aggregate(relBuilder.groupKey(belowAggregateKey), belowAggCalls)
.build();
}
offset += fieldCount;
http://git-wip-us.apache.org/repos/asf/calcite/blob/0b7b24a6/core/src/main/java/org/apache/calcite/rel/rules/AggregateProjectPullUpConstantsRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/AggregateProjectPullUpConstantsRule.java b/core/src/main/java/org/apache/calcite/rel/rules/AggregateProjectPullUpConstantsRule.java
index 8686db2..a12e6d1 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/AggregateProjectPullUpConstantsRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/AggregateProjectPullUpConstantsRule.java
@@ -154,7 +154,7 @@ public class AggregateProjectPullUpConstantsRule extends RelOptRule {
aggCall.adaptTo(input, aggCall.getArgList(), aggCall.filterArg,
groupCount, newGroupCount));
}
- relBuilder.aggregate(relBuilder.groupKey(newGroupSet, null), newAggCalls);
+ relBuilder.aggregate(relBuilder.groupKey(newGroupSet), newAggCalls);
// Create a projection back again.
List<Pair<RexNode, String>> projects = new ArrayList<>();
http://git-wip-us.apache.org/repos/asf/calcite/blob/0b7b24a6/core/src/main/java/org/apache/calcite/rel/rules/AggregateUnionAggregateRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/AggregateUnionAggregateRule.java b/core/src/main/java/org/apache/calcite/rel/rules/AggregateUnionAggregateRule.java
index f65bb7f..5f1e22d 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/AggregateUnionAggregateRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/AggregateUnionAggregateRule.java
@@ -128,7 +128,7 @@ public class AggregateUnionAggregateRule extends RelOptRule {
}
relBuilder.union(true);
- relBuilder.aggregate(relBuilder.groupKey(topAggRel.getGroupSet(), null),
+ relBuilder.aggregate(relBuilder.groupKey(topAggRel.getGroupSet()),
topAggRel.getAggCallList());
call.transformTo(relBuilder.build());
}
http://git-wip-us.apache.org/repos/asf/calcite/blob/0b7b24a6/core/src/main/java/org/apache/calcite/rel/rules/AggregateUnionTransposeRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/AggregateUnionTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/AggregateUnionTransposeRule.java
index 1025753..d6fd60e 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/AggregateUnionTransposeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/AggregateUnionTransposeRule.java
@@ -127,7 +127,7 @@ public class AggregateUnionTransposeRule extends RelOptRule {
relBuilder.push(input);
if (!alreadyUnique) {
++transformCount;
- relBuilder.aggregate(relBuilder.groupKey(aggRel.getGroupSet(), null),
+ relBuilder.aggregate(relBuilder.groupKey(aggRel.getGroupSet()),
aggRel.getAggCallList());
}
}
http://git-wip-us.apache.org/repos/asf/calcite/blob/0b7b24a6/core/src/main/java/org/apache/calcite/rel/rules/IntersectToDistinctRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/IntersectToDistinctRule.java b/core/src/main/java/org/apache/calcite/rel/rules/IntersectToDistinctRule.java
index 2b4bfbb..cf16557 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/IntersectToDistinctRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/IntersectToDistinctRule.java
@@ -107,7 +107,7 @@ public class IntersectToDistinctRule extends RelOptRule {
final ImmutableBitSet groupSet =
ImmutableBitSet.range(fieldCount - 1);
- relBuilder.aggregate(relBuilder.groupKey(groupSet, null),
+ relBuilder.aggregate(relBuilder.groupKey(groupSet),
relBuilder.countStar(null));
// add a filter count(c) = #branches
http://git-wip-us.apache.org/repos/asf/calcite/blob/0b7b24a6/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/tools/RelBuilder.java b/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
index 749fb9c..9a42e58 100644
--- a/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
+++ b/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
@@ -104,6 +104,7 @@ import java.util.Objects;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
+import javax.annotation.Nonnull;
import static org.apache.calcite.util.Static.RESOURCE;
@@ -664,8 +665,23 @@ public class RelBuilder {
}
/** Creates a group key with grouping sets. */
+ public GroupKey groupKey(Iterable<? extends RexNode> nodes,
+ Iterable<? extends Iterable<? extends RexNode>> nodeLists) {
+ return groupKey_(nodes, false, nodeLists);
+ }
+
+ /** @deprecated Now that indicator is deprecated, use
+ * {@link #groupKey(Iterable, Iterable)}, which has the same behavior as
+ * calling this method with {@code indicator = false}. */
+ @Deprecated // to be removed before 2.0
public GroupKey groupKey(Iterable<? extends RexNode> nodes, boolean indicator,
Iterable<? extends Iterable<? extends RexNode>> nodeLists) {
+ return groupKey_(nodes, indicator, nodeLists);
+ }
+
+ private GroupKey groupKey_(Iterable<? extends RexNode> nodes,
+ boolean indicator,
+ Iterable<? extends Iterable<? extends RexNode>> nodeLists) {
final ImmutableList.Builder<ImmutableList<RexNode>> builder =
ImmutableList.builder();
for (Iterable<? extends RexNode> nodeList : nodeLists) {
@@ -684,6 +700,16 @@ public class RelBuilder {
return groupKey(fields(ImmutableList.copyOf(fieldNames)));
}
+ /** Creates a group key, identified by field positions
+ * in the underlying relational expression.
+ *
+ * <p>This method of creating a group key does not allow you to group on new
+ * expressions, only column projections, but is efficient, especially when you
+ * are coming from an existing {@link Aggregate}. */
+ public GroupKey groupKey(@Nonnull ImmutableBitSet groupSet) {
+ return groupKey(groupSet, ImmutableList.of(groupSet));
+ }
+
/** Creates a group key with grouping sets, both identified by field positions
* in the underlying relational expression.
*
@@ -691,31 +717,38 @@ public class RelBuilder {
* expressions, only column projections, but is efficient, especially when you
* are coming from an existing {@link Aggregate}. */
public GroupKey groupKey(ImmutableBitSet groupSet,
+ @Nonnull Iterable<? extends ImmutableBitSet> groupSets) {
+ return groupKey_(groupSet, false, ImmutableList.copyOf(groupSets));
+ }
+
+ /** As {@link #groupKey(ImmutableBitSet, Iterable)}. */
+ // deprecated, to be removed before 2.0
+ public GroupKey groupKey(ImmutableBitSet groupSet,
ImmutableList<ImmutableBitSet> groupSets) {
- return groupKey_(groupSet, false, groupSets);
+ return groupKey_(groupSet, false, groupSets == null
+ ? ImmutableList.of(groupSet) : ImmutableList.copyOf(groupSets));
}
- /** @deprecated Use {@link #groupKey(ImmutableBitSet, ImmutableList)}. */
+ /** @deprecated Use {@link #groupKey(ImmutableBitSet, Iterable)}. */
@Deprecated // to be removed before 2.0
public GroupKey groupKey(ImmutableBitSet groupSet, boolean indicator,
ImmutableList<ImmutableBitSet> groupSets) {
- return groupKey_(groupSet, indicator, groupSets);
+ return groupKey_(groupSet, indicator, groupSets == null
+ ? ImmutableList.of(groupSet) : ImmutableList.copyOf(groupSets));
}
private GroupKey groupKey_(ImmutableBitSet groupSet, boolean indicator,
- ImmutableList<ImmutableBitSet> groupSets) {
+ @Nonnull ImmutableList<ImmutableBitSet> groupSets) {
if (groupSet.length() > peek().getRowType().getFieldCount()) {
throw new IllegalArgumentException("out of bounds: " + groupSet);
}
- if (groupSets == null) {
- groupSets = ImmutableList.of(groupSet);
- }
+ Objects.requireNonNull(groupSets);
final ImmutableList<RexNode> nodes =
fields(ImmutableIntList.of(groupSet.toArray()));
final List<ImmutableList<RexNode>> nodeLists =
- Lists.transform(groupSets,
+ Util.transform(groupSets,
bitSet -> fields(ImmutableIntList.of(bitSet.toArray())));
- return groupKey(nodes, indicator, nodeLists);
+ return groupKey_(nodes, indicator, nodeLists);
}
@Deprecated // to be removed before 2.0
http://git-wip-us.apache.org/repos/asf/calcite/blob/0b7b24a6/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java b/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java
index c4a49fa..e89026a 100644
--- a/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java
@@ -838,7 +838,7 @@ public class RelBuilderTest {
try {
RelNode root =
builder.scan("EMP")
- .aggregate(builder.groupKey(ImmutableBitSet.of(17), null))
+ .aggregate(builder.groupKey(ImmutableBitSet.of(17)))
.build();
fail("expected error, got " + root);
} catch (IllegalArgumentException e) {
http://git-wip-us.apache.org/repos/asf/calcite/blob/0b7b24a6/site/_docs/algebra.md
----------------------------------------------------------------------
diff --git a/site/_docs/algebra.md b/site/_docs/algebra.md
index 003255c..2b5c66a 100644
--- a/site/_docs/algebra.md
+++ b/site/_docs/algebra.md
@@ -381,7 +381,7 @@ The following methods return a
|:------------------- |:-----------
| `groupKey(fieldName...)`<br/>`groupKey(fieldOrdinal...)`<br/>`groupKey(expr...)`<br/>`groupKey(exprList)` | Creates a group key of the given expressions
| `groupKey(exprList, exprListList)` | Creates a group key of the given expressions with grouping sets
-| `groupKey(bitSet, bitSets)` | Creates a group key of the given input columns with grouping sets
+| `groupKey(bitSet [, bitSets])` | Creates a group key of the given input columns, with multiple grouping sets if `bitSets` is specified
### Aggregate call methods