You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by hy...@apache.org on 2019/05/31 18:41:28 UTC
[calcite] branch master updated: [CALCITE-2944] Deprecate Aggregate
indicator and remove fields where possible
This is an automated email from the ASF dual-hosted git repository.
hyuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/master by this push:
new 8a25787 [CALCITE-2944] Deprecate Aggregate indicator and remove fields where possible
8a25787 is described below
commit 8a2578787910e3c05c4d17006439de1940c0b195
Author: Haisheng Yuan <h....@alibaba-inc.com>
AuthorDate: Thu May 30 12:41:41 2019 -0500
[CALCITE-2944] Deprecate Aggregate indicator and remove fields where possible
---
.../adapter/enumerable/EnumerableAggregate.java | 2 +-
.../enumerable/EnumerableAggregateRule.java | 2 +-
.../org/apache/calcite/adapter/jdbc/JdbcRules.java | 6 +-
.../apache/calcite/interpreter/AggregateNode.java | 4 --
.../org/apache/calcite/interpreter/Bindables.java | 6 +-
.../org/apache/calcite/rel/core/Aggregate.java | 77 ++++++++++------------
.../calcite/rel/logical/LogicalAggregate.java | 9 ++-
.../calcite/rel/metadata/RelMdColumnOrigins.java | 11 +---
.../org/apache/calcite/rel/metadata/RelMdUtil.java | 3 +-
.../rel/rules/AbstractMaterializedViewRule.java | 2 +-
.../AggregateExpandDistinctAggregatesRule.java | 31 ++++-----
.../rel/rules/AggregateFilterTransposeRule.java | 2 +-
.../calcite/rel/rules/AggregateJoinRemoveRule.java | 2 +-
.../rel/rules/AggregateJoinTransposeRule.java | 5 +-
.../calcite/rel/rules/AggregateMergeRule.java | 2 +-
.../rel/rules/AggregateProjectMergeRule.java | 10 +--
.../rules/AggregateProjectPullUpConstantsRule.java | 1 -
.../rel/rules/AggregateReduceFunctionsRule.java | 16 +----
.../calcite/rel/rules/AggregateStarTableRule.java | 1 -
.../org/apache/calcite/rel/stream/StreamRules.java | 2 +-
.../java/org/apache/calcite/rex/RexBuilder.java | 20 +++++-
.../apache/calcite/sql2rel/RelFieldTrimmer.java | 13 ++--
.../apache/calcite/sql2rel/SqlToRelConverter.java | 1 -
.../calcite/plan/volcano/TraitPropagationTest.java | 8 ++-
24 files changed, 101 insertions(+), 135 deletions(-)
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregate.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregate.java
index 988e753..8605409 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregate.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregate.java
@@ -68,7 +68,7 @@ public class EnumerableAggregate extends Aggregate implements EnumerableRel {
List<ImmutableBitSet> groupSets,
List<AggregateCall> aggCalls)
throws InvalidRelException {
- super(cluster, traitSet, child, indicator, groupSet, groupSets, aggCalls);
+ super(cluster, traitSet, child, groupSet, groupSets, aggCalls);
Preconditions.checkArgument(!indicator,
"EnumerableAggregate no longer supports indicator fields");
assert getConvention() instanceof EnumerableConvention;
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregateRule.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregateRule.java
index e29b9fc..b640314 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregateRule.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregateRule.java
@@ -42,7 +42,7 @@ class EnumerableAggregateRule extends ConverterRule {
rel.getCluster(),
traitSet,
convert(agg.getInput(), EnumerableConvention.INSTANCE),
- agg.indicator,
+ false,
agg.getGroupSet(),
agg.getGroupSets(),
agg.getAggCallList());
diff --git a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcRules.java b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcRules.java
index 0445ac1..85575ba 100644
--- a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcRules.java
+++ b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcRules.java
@@ -662,7 +662,7 @@ public class JdbcRules {
agg.getTraitSet().replace(out);
try {
return new JdbcAggregate(rel.getCluster(), traitSet,
- convert(agg.getInput(), out), agg.indicator, agg.getGroupSet(),
+ convert(agg.getInput(), out), false, agg.getGroupSet(),
agg.getGroupSets(), agg.getAggCallList());
} catch (InvalidRelException e) {
LOGGER.debug(e.toString());
@@ -688,10 +688,10 @@ public class JdbcRules {
List<ImmutableBitSet> groupSets,
List<AggregateCall> aggCalls)
throws InvalidRelException {
- super(cluster, traitSet, input, indicator, groupSet, groupSets, aggCalls);
+ super(cluster, traitSet, input, groupSet, groupSets, aggCalls);
assert getConvention() instanceof JdbcConvention;
assert this.groupSets.size() == 1 : "Grouping sets not supported";
- assert !this.indicator;
+ assert !indicator;
final SqlDialect dialect = ((JdbcConvention) getConvention()).dialect;
for (AggregateCall aggCall : aggCalls) {
if (!canImplement(aggCall.getAggregation(), dialect)) {
diff --git a/core/src/main/java/org/apache/calcite/interpreter/AggregateNode.java b/core/src/main/java/org/apache/calcite/interpreter/AggregateNode.java
index ca0e078..401edf8 100644
--- a/core/src/main/java/org/apache/calcite/interpreter/AggregateNode.java
+++ b/core/src/main/java/org/apache/calcite/interpreter/AggregateNode.java
@@ -80,7 +80,6 @@ public class AggregateNode extends AbstractSingleNode<Aggregate> {
this.unionGroups = union;
this.outputRowLength = unionGroups.cardinality()
- + (rel.indicator ? unionGroups.cardinality() : 0)
+ rel.getAggCallList().size();
ImmutableList.Builder<AccumulatorFactory> builder = ImmutableList.builder();
@@ -374,9 +373,6 @@ public class AggregateNode extends AbstractSingleNode<Aggregate> {
for (Integer groupPos : unionGroups) {
if (grouping.get(groupPos)) {
rb.set(index, key.getObject(index));
- if (rel.indicator) {
- rb.set(unionGroups.cardinality() + index, true);
- }
}
// need to set false when not part of grouping set.
diff --git a/core/src/main/java/org/apache/calcite/interpreter/Bindables.java b/core/src/main/java/org/apache/calcite/interpreter/Bindables.java
index c7df83b..3541bfa 100644
--- a/core/src/main/java/org/apache/calcite/interpreter/Bindables.java
+++ b/core/src/main/java/org/apache/calcite/interpreter/Bindables.java
@@ -617,9 +617,11 @@ public class Bindables {
List<ImmutableBitSet> groupSets,
List<AggregateCall> aggCalls)
throws InvalidRelException {
- super(cluster, traitSet, input, indicator, groupSet, groupSets, aggCalls);
+ super(cluster, traitSet, input, groupSet, groupSets, aggCalls);
assert getConvention() instanceof BindableConvention;
+ Preconditions.checkArgument(!indicator,
+ "indicator is not supported, use GROUPING function instead");
for (AggregateCall aggCall : aggCalls) {
if (aggCall.isDistinct()) {
throw new InvalidRelException(
@@ -680,7 +682,7 @@ public class Bindables {
agg.getTraitSet().replace(BindableConvention.INSTANCE);
try {
return new BindableAggregate(rel.getCluster(), traitSet,
- convert(agg.getInput(), traitSet), agg.indicator, agg.getGroupSet(),
+ convert(agg.getInput(), traitSet), false, agg.getGroupSet(),
agg.getGroupSets(), agg.getAggCallList());
} catch (InvalidRelException e) {
RelOptPlanner.LOGGER.debug(e.toString());
diff --git a/core/src/main/java/org/apache/calcite/rel/core/Aggregate.java b/core/src/main/java/org/apache/calcite/rel/core/Aggregate.java
index 82b4f70..55eafd1 100644
--- a/core/src/main/java/org/apache/calcite/rel/core/Aggregate.java
+++ b/core/src/main/java/org/apache/calcite/rel/core/Aggregate.java
@@ -92,12 +92,9 @@ public abstract class Aggregate extends SingleRel {
//~ Instance fields --------------------------------------------------------
- /** Whether there are indicator fields.
- *
- * <p>We strongly discourage the use indicator fields, because they cause the
- * output row type of GROUPING SETS queries to be different from regular GROUP
- * BY queries, and recommend that you set this field to {@code false}. */
- public final boolean indicator;
+ @Deprecated // unused field, to be removed before 2.0
+ public final boolean indicator = false;
+
protected final List<AggregateCall> aggCalls;
protected final ImmutableBitSet groupSet;
public final ImmutableList<ImmutableBitSet> groupSets;
@@ -125,8 +122,6 @@ public abstract class Aggregate extends SingleRel {
* @param cluster Cluster
* @param traits Traits
* @param child Child
- * @param indicator Whether row type should include indicator fields to
- * indicate which grouping set is active; true is deprecated
* @param groupSet Bit set of grouping fields
* @param groupSets List of all grouping sets; null for just {@code groupSet}
* @param aggCalls Collection of calls to aggregate functions
@@ -135,12 +130,10 @@ public abstract class Aggregate extends SingleRel {
RelOptCluster cluster,
RelTraitSet traits,
RelNode child,
- boolean indicator,
ImmutableBitSet groupSet,
List<ImmutableBitSet> groupSets,
List<AggregateCall> aggCalls) {
super(cluster, traits, child);
- this.indicator = indicator; // true is allowed, but discouraged
this.aggCalls = ImmutableList.copyOf(aggCalls);
this.groupSet = Objects.requireNonNull(groupSet);
if (groupSets == null) {
@@ -161,12 +154,30 @@ public abstract class Aggregate extends SingleRel {
}
}
+ /**
+ * Creates an Aggregate.
+ */
+ @Deprecated // to be removed before 2.0
+ protected Aggregate(
+ RelOptCluster cluster,
+ RelTraitSet traits,
+ RelNode child,
+ boolean indicator,
+ ImmutableBitSet groupSet,
+ List<ImmutableBitSet> groupSets,
+ List<AggregateCall> aggCalls) {
+ this(cluster, traits, child, groupSet, groupSets, aggCalls);
+ Preconditions.checkArgument(!indicator,
+ "indicator is not supported, use GROUPING function instead");
+ }
+
public static boolean isNotGrandTotal(Aggregate aggregate) {
return aggregate.getGroupCount() > 0;
}
+ @Deprecated // to be removed before 2.0
public static boolean noIndicator(Aggregate aggregate) {
- return !aggregate.indicator;
+ return true;
}
private boolean isPredicate(RelNode input, int index) {
@@ -181,7 +192,6 @@ public abstract class Aggregate extends SingleRel {
*/
protected Aggregate(RelInput input) {
this(input.getCluster(), input.getTraitSet(), input.getInput(),
- input.getBoolean("indicator", false),
input.getBitSet("group"), input.getBitSetList("groups"),
input.getAggregateCalls("aggs"));
}
@@ -190,7 +200,7 @@ public abstract class Aggregate extends SingleRel {
@Override public final RelNode copy(RelTraitSet traitSet,
List<RelNode> inputs) {
- return copy(traitSet, sole(inputs), indicator, groupSet, groupSets,
+ return copy(traitSet, sole(inputs), false, groupSet, groupSets,
aggCalls);
}
@@ -198,9 +208,7 @@ public abstract class Aggregate extends SingleRel {
*
* @param traitSet Traits
* @param input Input
- * @param indicator Whether row type should include indicator fields to
- * indicate which grouping set is active; must be true if
- * aggregate is not simple
+ * @param indicator Deprecated, always false
* @param groupSet Bit set of grouping fields
* @param groupSets List of all grouping sets; null for just {@code groupSet}
* @param aggCalls Collection of calls to aggregate functions
@@ -230,7 +238,7 @@ public abstract class Aggregate extends SingleRel {
* @return list of calls to aggregate functions and their output field names
*/
public List<Pair<AggregateCall, String>> getNamedAggCalls() {
- final int offset = getGroupCount() + getIndicatorCount();
+ final int offset = getGroupCount();
return Pair.zip(aggCalls, Util.skip(getRowType().getFieldNames(), offset));
}
@@ -253,16 +261,13 @@ public abstract class Aggregate extends SingleRel {
/**
* Returns the number of indicator fields.
*
- * <p>This is the same as {@link #getGroupCount()} if {@link #indicator} is
- * true, zero if {@code indicator} is false.
- *
- * <p>The offset of the first aggregate call in the output record is always
- * <i>groupCount + indicatorCount</i>.
+ * <p>Always zero.
*
- * @return number of indicator fields
+ * @return number of indicator fields, always zero
*/
+ @Deprecated // to be removed before 2.0
public int getIndicatorCount() {
- return indicator ? getGroupCount() : 0;
+ return 0;
}
/**
@@ -288,7 +293,6 @@ public abstract class Aggregate extends SingleRel {
super.explainTerms(pw)
.item("group", groupSet)
.itemIf("groups", groupSets, getGroupType() != Group.SIMPLE)
- .itemIf("indicator", indicator, indicator)
.itemIf("aggs", aggCalls, pw.nest());
if (!pw.nest()) {
for (Ord<AggregateCall> ord : Ord.zip(aggCalls)) {
@@ -332,7 +336,7 @@ public abstract class Aggregate extends SingleRel {
protected RelDataType deriveRowType() {
return deriveRowType(getCluster().getTypeFactory(), getInput().getRowType(),
- indicator, groupSet, groupSets, aggCalls);
+ false, groupSet, groupSets, aggCalls);
}
/**
@@ -340,9 +344,7 @@ public abstract class Aggregate extends SingleRel {
*
* @param typeFactory Type factory
* @param inputRowType Input row type
- * @param indicator Whether row type should include indicator fields to
- * indicate which grouping set is active; must be true if
- * aggregate is not simple
+ * @param indicator Deprecated, always false
* @param groupSet Bit set of grouping fields
* @param groupSets List of all grouping sets; null for just {@code groupSet}
* @param aggCalls Collection of calls to aggregate functions
@@ -365,21 +367,8 @@ public abstract class Aggregate extends SingleRel {
builder.nullable(true);
}
}
- if (indicator) {
- for (int groupKey : groupList) {
- final RelDataType booleanType =
- typeFactory.createTypeWithNullability(
- typeFactory.createSqlType(SqlTypeName.BOOLEAN), false);
- final String base = "i$" + fieldList.get(groupKey).getName();
- String name = base;
- int i = 0;
- while (containedNames.contains(name)) {
- name = base + "_" + i++;
- }
- containedNames.add(name);
- builder.add(name, booleanType);
- }
- }
+ Preconditions.checkArgument(!indicator,
+ "indicator is not supported, use GROUPING function instead");
for (Ord<AggregateCall> aggCall : Ord.zip(aggCalls)) {
final String base;
if (aggCall.e.name != null) {
diff --git a/core/src/main/java/org/apache/calcite/rel/logical/LogicalAggregate.java b/core/src/main/java/org/apache/calcite/rel/logical/LogicalAggregate.java
index eda72d2..3ddcbe1 100644
--- a/core/src/main/java/org/apache/calcite/rel/logical/LogicalAggregate.java
+++ b/core/src/main/java/org/apache/calcite/rel/logical/LogicalAggregate.java
@@ -26,6 +26,8 @@ import org.apache.calcite.rel.core.Aggregate;
import org.apache.calcite.rel.core.AggregateCall;
import org.apache.calcite.util.ImmutableBitSet;
+import com.google.common.base.Preconditions;
+
import java.util.List;
/**
@@ -51,8 +53,7 @@ public final class LogicalAggregate extends Aggregate {
* @param cluster Cluster that this relational expression belongs to
* @param traitSet Traits
* @param child input relational expression
- * @param indicator Whether row type should include indicator fields to
- * indicate which grouping set is active
+ * @param indicator Unused field, alway false
* @param groupSet Bit set of grouping fields
* @param groupSets Grouping sets, or null to use just {@code groupSet}
* @param aggCalls Array of aggregates to compute, not null
@@ -65,7 +66,9 @@ public final class LogicalAggregate extends Aggregate {
ImmutableBitSet groupSet,
List<ImmutableBitSet> groupSets,
List<AggregateCall> aggCalls) {
- super(cluster, traitSet, child, indicator, groupSet, groupSets, aggCalls);
+ super(cluster, traitSet, child, groupSet, groupSets, aggCalls);
+ Preconditions.checkArgument(!indicator,
+ "indicator is not supported, use GROUPING function instead");
}
@Deprecated // to be removed before 2.0
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnOrigins.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnOrigins.java
index 9944b17..1cfeb65 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnOrigins.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnOrigins.java
@@ -33,8 +33,6 @@ import org.apache.calcite.rex.RexVisitor;
import org.apache.calcite.rex.RexVisitorImpl;
import org.apache.calcite.util.BuiltInMethod;
-import com.google.common.collect.ImmutableSet;
-
import java.util.HashSet;
import java.util.Set;
@@ -65,17 +63,10 @@ public class RelMdColumnOrigins
return mq.getColumnOrigins(rel.getInput(), iOutputColumn);
}
- if (rel.indicator) {
- if (iOutputColumn < rel.getGroupCount() + rel.getIndicatorCount()) {
- // The indicator column is originated here.
- return ImmutableSet.of();
- }
- }
-
// Aggregate columns are derived from input columns
AggregateCall call =
rel.getAggCallList().get(iOutputColumn
- - rel.getGroupCount() - rel.getIndicatorCount());
+ - rel.getGroupCount());
final Set<RelColumnOrigin> set = new HashSet<>();
for (Integer iInput : call.getArgList()) {
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUtil.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUtil.java
index e9123c6..2d308da 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUtil.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUtil.java
@@ -462,8 +462,7 @@ public class RelMdUtil {
} else {
// aggregate column -- set a bit for each argument being
// aggregated
- AggregateCall agg = aggCalls.get(bit
- - (aggRel.getGroupCount() + aggRel.getIndicatorCount()));
+ AggregateCall agg = aggCalls.get(bit - aggRel.getGroupCount());
for (Integer arg : agg.getArgList()) {
childKey.set(arg);
}
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 897852a..60f3f7b 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
@@ -1035,7 +1035,7 @@ public abstract class AbstractMaterializedViewRule extends RelOptRule {
aggregateViewNode.getInput().getRowType().getFieldCount(),
aggregateViewNode.getInput().getRowType().getFieldCount() + offset));
final Aggregate newViewNode = aggregateViewNode.copy(
- aggregateViewNode.getTraitSet(), relBuilder.build(), aggregateViewNode.indicator,
+ aggregateViewNode.getTraitSet(), relBuilder.build(), false,
groupSet.build(), null, aggregateViewNode.getAggCallList());
relBuilder.push(newViewNode);
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/AggregateExpandDistinctAggregatesRule.java b/core/src/main/java/org/apache/calcite/rel/rules/AggregateExpandDistinctAggregatesRule.java
index 5538449..3cb63be 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/AggregateExpandDistinctAggregatesRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/AggregateExpandDistinctAggregatesRule.java
@@ -193,9 +193,8 @@ public final class AggregateExpandDistinctAggregatesRule extends RelOptRule {
final List<RexInputRef> refs = new ArrayList<>();
final List<String> fieldNames = aggregate.getRowType().getFieldNames();
final ImmutableBitSet groupSet = aggregate.getGroupSet();
- final int groupAndIndicatorCount =
- aggregate.getGroupCount() + aggregate.getIndicatorCount();
- for (int i : Util.range(groupAndIndicatorCount)) {
+ final int groupCount = aggregate.getGroupCount();
+ for (int i : Util.range(groupCount)) {
refs.add(RexInputRef.of(i, aggFields));
}
@@ -210,8 +209,8 @@ public final class AggregateExpandDistinctAggregatesRule extends RelOptRule {
}
refs.add(
new RexInputRef(
- groupAndIndicatorCount + newAggCallList.size(),
- aggFields.get(groupAndIndicatorCount + i).getType()));
+ groupCount + newAggCallList.size(),
+ aggFields.get(groupCount + i).getType()));
newAggCallList.add(aggCall);
}
@@ -371,7 +370,7 @@ public final class AggregateExpandDistinctAggregatesRule extends RelOptRule {
}
relBuilder.push(
aggregate.copy(aggregate.getTraitSet(),
- relBuilder.build(), aggregate.indicator,
+ relBuilder.build(), false,
ImmutableBitSet.of(topGroupSet), null, topAggregateCalls));
return relBuilder;
}
@@ -553,7 +552,7 @@ public final class AggregateExpandDistinctAggregatesRule extends RelOptRule {
final int cardinality = aggregate.getGroupSet().cardinality();
relBuilder.push(
aggregate.copy(aggregate.getTraitSet(), relBuilder.build(),
- aggregate.indicator, ImmutableBitSet.range(cardinality), null,
+ false, ImmutableBitSet.range(cardinality), null,
newAggCalls));
return relBuilder;
}
@@ -643,9 +642,8 @@ public final class AggregateExpandDistinctAggregatesRule extends RelOptRule {
final List<AggregateCall> aggCallList = new ArrayList<>();
final List<AggregateCall> aggCalls = aggregate.getAggCallList();
- final int groupAndIndicatorCount =
- aggregate.getGroupCount() + aggregate.getIndicatorCount();
- int i = groupAndIndicatorCount - 1;
+ final int groupCount = aggregate.getGroupCount();
+ int i = groupCount - 1;
for (AggregateCall aggCall : aggCalls) {
++i;
@@ -677,11 +675,11 @@ public final class AggregateExpandDistinctAggregatesRule extends RelOptRule {
assert refs.get(i) == null;
if (n == 0) {
refs.set(i,
- new RexInputRef(groupAndIndicatorCount + aggCallList.size(),
+ new RexInputRef(groupCount + aggCallList.size(),
newAggCall.getType()));
} else {
refs.set(i,
- new RexInputRef(leftFields.size() + groupAndIndicatorCount
+ new RexInputRef(leftFields.size() + groupCount
+ aggCallList.size(), newAggCall.getType()));
}
aggCallList.add(newAggCall);
@@ -695,15 +693,10 @@ public final class AggregateExpandDistinctAggregatesRule extends RelOptRule {
assert newGroupSet
.equals(ImmutableBitSet.range(aggregate.getGroupSet().cardinality()));
ImmutableList<ImmutableBitSet> newGroupingSets = null;
- if (aggregate.indicator) {
- newGroupingSets =
- ImmutableBitSet.ORDERING.immutableSortedCopy(
- ImmutableBitSet.permute(aggregate.getGroupSets(), map));
- }
relBuilder.push(
aggregate.copy(aggregate.getTraitSet(), relBuilder.build(),
- aggregate.indicator, newGroupSet, newGroupingSets, aggCallList));
+ false, newGroupSet, newGroupingSets, aggCallList));
// If there's no left child yet, no need to create the join
if (n == 0) {
@@ -716,7 +709,7 @@ public final class AggregateExpandDistinctAggregatesRule extends RelOptRule {
final List<RelDataTypeField> distinctFields =
relBuilder.peek().getRowType().getFieldList();
final List<RexNode> conditions = new ArrayList<>();
- for (i = 0; i < groupAndIndicatorCount; ++i) {
+ for (i = 0; i < groupCount; ++i) {
// null values form its own group
// use "is not distinct from" so that the join condition
// allows null values to match.
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/AggregateFilterTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/AggregateFilterTransposeRule.java
index 50c8aa2..a7bd0c3 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/AggregateFilterTransposeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/AggregateFilterTransposeRule.java
@@ -150,7 +150,7 @@ public class AggregateFilterTransposeRule extends RelOptRule {
}
final Aggregate topAggregate =
aggregate.copy(aggregate.getTraitSet(), newFilter,
- aggregate.indicator, topGroupSet.build(),
+ false, topGroupSet.build(),
newGroupingSets, topAggCallList);
call.transformTo(topAggregate);
}
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/AggregateJoinRemoveRule.java b/core/src/main/java/org/apache/calcite/rel/rules/AggregateJoinRemoveRule.java
index 84e5597..1c98e9f 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/AggregateJoinRemoveRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/AggregateJoinRemoveRule.java
@@ -99,7 +99,7 @@ public class AggregateJoinRemoveRule extends RelOptRule {
RelNode node;
if (isLeftJoin) {
node = aggregate
- .copy(aggregate.getTraitSet(), join.getLeft(), aggregate.indicator,
+ .copy(aggregate.getTraitSet(), join.getLeft(), false,
aggregate.getGroupSet(), aggregate.getGroupSets(),
aggregate.getAggCallList());
} else {
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 22a77af..622ada3 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
@@ -326,8 +326,7 @@ public class AggregateJoinTransposeRule extends RelOptRule {
// Aggregate above to sum up the sub-totals
final List<AggregateCall> newAggCalls = new ArrayList<>();
- final int groupIndicatorCount =
- aggregate.getGroupCount() + aggregate.getIndicatorCount();
+ final int groupCount = aggregate.getGroupCount();
final int newLeftWidth = sides.get(0).newInput.getRowType().getFieldCount();
final List<RexNode> projects =
new ArrayList<>(
@@ -341,7 +340,7 @@ public class AggregateJoinTransposeRule extends RelOptRule {
final Integer rightSubTotal = sides.get(1).split.get(aggCall.i);
newAggCalls.add(
splitter.topSplit(rexBuilder, registry(projects),
- groupIndicatorCount, relBuilder.peek().getRowType(), aggCall.e,
+ groupCount, relBuilder.peek().getRowType(), aggCall.e,
leftSubTotal == null ? -1 : leftSubTotal,
rightSubTotal == null ? -1 : rightSubTotal + newLeftWidth));
}
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/AggregateMergeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/AggregateMergeRule.java
index 8daca31..cd14a9d 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/AggregateMergeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/AggregateMergeRule.java
@@ -143,7 +143,7 @@ public class AggregateMergeRule extends RelOptRule {
final Aggregate finalAgg =
topAgg.copy(topAgg.getTraitSet(), bottomAgg.getInput(),
- topAgg.indicator, topGroupSet,
+ false, topGroupSet,
newGroupingSets, finalCalls);
call.transformTo(finalAgg);
}
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/AggregateProjectMergeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/AggregateProjectMergeRule.java
index 411d6af..4ad690d 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/AggregateProjectMergeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/AggregateProjectMergeRule.java
@@ -111,7 +111,7 @@ public class AggregateProjectMergeRule extends RelOptRule {
final Aggregate newAggregate =
aggregate.copy(aggregate.getTraitSet(), project.getInput(),
- aggregate.indicator, newGroupSet, newGroupingSets,
+ false, newGroupSet, newGroupingSets,
aggCalls.build());
// Add a project if the group set is not in the same order or
@@ -125,13 +125,7 @@ public class AggregateProjectMergeRule extends RelOptRule {
for (int newKey : newKeys) {
posList.add(newGroupSet.indexOf(newKey));
}
- if (aggregate.indicator) {
- for (int newKey : newKeys) {
- posList.add(aggregate.getGroupCount() + newGroupSet.indexOf(newKey));
- }
- }
- for (int i = newAggregate.getGroupCount()
- + newAggregate.getIndicatorCount();
+ for (int i = newAggregate.getGroupCount();
i < newAggregate.getRowType().getFieldCount(); i++) {
posList.add(i);
}
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 a12e6d1..82da6c8 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
@@ -98,7 +98,6 @@ public class AggregateProjectPullUpConstantsRule extends RelOptRule {
final Aggregate aggregate = call.rel(0);
final RelNode input = call.rel(1);
- assert !aggregate.indicator : "predicate ensured no grouping sets";
final int groupCount = aggregate.getGroupCount();
if (groupCount == 1) {
// No room for optimization since we cannot convert from non-empty
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/AggregateReduceFunctionsRule.java b/core/src/main/java/org/apache/calcite/rel/rules/AggregateReduceFunctionsRule.java
index b2f416f..b97a9bb 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/AggregateReduceFunctionsRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/AggregateReduceFunctionsRule.java
@@ -201,15 +201,14 @@ public class AggregateReduceFunctionsRule extends RelOptRule {
List<AggregateCall> oldCalls = oldAggRel.getAggCallList();
final int groupCount = oldAggRel.getGroupCount();
- final int indicatorCount = oldAggRel.getIndicatorCount();
final List<AggregateCall> newCalls = new ArrayList<>();
final Map<AggregateCall, RexNode> aggCallMapping = new HashMap<>();
final List<RexNode> projList = new ArrayList<>();
- // pass through group key (+ indicators if present)
- for (int i = 0; i < groupCount + indicatorCount; ++i) {
+ // pass through group key
+ for (int i = 0; i < groupCount; ++i) {
projList.add(
rexBuilder.makeInputRef(
getFieldType(oldAggRel, i),
@@ -330,7 +329,6 @@ public class AggregateReduceFunctionsRule extends RelOptRule {
oldAggRel.getInput().getRowType(), oldCall.getArgList());
return rexBuilder.addAggCall(oldCall,
nGroups,
- oldAggRel.indicator,
newCalls,
aggCallMapping,
oldArgTypes);
@@ -403,14 +401,12 @@ public class AggregateReduceFunctionsRule extends RelOptRule {
RexNode numeratorRef =
rexBuilder.addAggCall(sumCall,
nGroups,
- oldAggRel.indicator,
newCalls,
aggCallMapping,
ImmutableList.of(avgInputType));
final RexNode denominatorRef =
rexBuilder.addAggCall(countCall,
nGroups,
- oldAggRel.indicator,
newCalls,
aggCallMapping,
ImmutableList.of(avgInputType));
@@ -461,7 +457,6 @@ public class AggregateReduceFunctionsRule extends RelOptRule {
RexNode sumZeroRef =
rexBuilder.addAggCall(sumZeroCall,
nGroups,
- oldAggRel.indicator,
newCalls,
aggCallMapping,
ImmutableList.of(argType));
@@ -474,7 +469,6 @@ public class AggregateReduceFunctionsRule extends RelOptRule {
RexNode countRef =
rexBuilder.addAggCall(countCall,
nGroups,
- oldAggRel.indicator,
newCalls,
aggCallMapping,
ImmutableList.of(argType));
@@ -530,7 +524,6 @@ public class AggregateReduceFunctionsRule extends RelOptRule {
final RexNode sumArgSquared =
rexBuilder.addAggCall(sumArgSquaredAggCall,
nGroups,
- oldAggRel.indicator,
newCalls,
aggCallMapping,
ImmutableList.of(sumArgSquaredAggCall.getType()));
@@ -551,7 +544,6 @@ public class AggregateReduceFunctionsRule extends RelOptRule {
final RexNode sumArg =
rexBuilder.addAggCall(sumArgAggCall,
nGroups,
- oldAggRel.indicator,
newCalls,
aggCallMapping,
ImmutableList.of(sumArgAggCall.getType()));
@@ -576,7 +568,6 @@ public class AggregateReduceFunctionsRule extends RelOptRule {
final RexNode countArg =
rexBuilder.addAggCall(countArgAggCall,
nGroups,
- oldAggRel.indicator,
newCalls,
aggCallMapping,
ImmutableList.of(argOrdinalType));
@@ -648,7 +639,6 @@ public class AggregateReduceFunctionsRule extends RelOptRule {
null);
return rexBuilder.addAggCall(aggregateCall,
oldAggRel.getGroupCount(),
- oldAggRel.indicator,
newCalls,
aggCallMapping,
ImmutableList.of(aggregateCall.getType()));
@@ -668,7 +658,6 @@ public class AggregateReduceFunctionsRule extends RelOptRule {
return cluster.getRexBuilder().addAggCall(sumArgSquaredAggCall,
oldAggRel.getGroupCount(),
- oldAggRel.indicator,
newCalls,
aggCallMapping,
ImmutableList.of(sumArgSquaredAggCall.getType()));
@@ -696,7 +685,6 @@ public class AggregateReduceFunctionsRule extends RelOptRule {
return oldAggRel.getCluster().getRexBuilder().addAggCall(countArgAggCall,
oldAggRel.getGroupCount(),
- oldAggRel.indicator,
newCalls,
aggCallMapping,
operandTypes);
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/AggregateStarTableRule.java b/core/src/main/java/org/apache/calcite/rel/rules/AggregateStarTableRule.java
index 069b238..f257609 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/AggregateStarTableRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/AggregateStarTableRule.java
@@ -193,7 +193,6 @@ public class AggregateStarTableRule extends RelOptRule {
tileKey.dimensions.cardinality() + tileKey.measures.size(),
aggregate.getRowType().getFieldCount()) {
public int getSourceOpt(int source) {
- assert aggregate.getIndicatorCount() == 0;
if (source < aggregate.getGroupCount()) {
int in = tileKey.dimensions.nth(source);
return aggregate.getGroupSet().indexOf(in);
diff --git a/core/src/main/java/org/apache/calcite/rel/stream/StreamRules.java b/core/src/main/java/org/apache/calcite/rel/stream/StreamRules.java
index 02d8e68..6ceed03 100644
--- a/core/src/main/java/org/apache/calcite/rel/stream/StreamRules.java
+++ b/core/src/main/java/org/apache/calcite/rel/stream/StreamRules.java
@@ -130,7 +130,7 @@ public class StreamRules {
public DeltaAggregateTransposeRule(RelBuilderFactory relBuilderFactory) {
super(
operand(Delta.class,
- operandJ(Aggregate.class, null, Aggregate::noIndicator,
+ operandJ(Aggregate.class, null, Aggregate::isSimple,
any())),
relBuilderFactory, null);
}
diff --git a/core/src/main/java/org/apache/calcite/rex/RexBuilder.java b/core/src/main/java/org/apache/calcite/rex/RexBuilder.java
index 5425ffb..5a0104b 100644
--- a/core/src/main/java/org/apache/calcite/rex/RexBuilder.java
+++ b/core/src/main/java/org/apache/calcite/rex/RexBuilder.java
@@ -286,7 +286,6 @@ public class RexBuilder {
*
* @param aggCall aggregate call to be added
* @param groupCount number of groups in the aggregate relation
- * @param indicator Whether the Aggregate has indicator (GROUPING) columns
* @param aggCalls destination list of aggregate calls
* @param aggCallMapping the dictionary of already added calls
* @param aggArgTypes Argument types, not null
@@ -294,7 +293,7 @@ public class RexBuilder {
* @return Rex expression for the given aggregate call
*/
public RexNode addAggCall(AggregateCall aggCall, int groupCount,
- boolean indicator, List<AggregateCall> aggCalls,
+ List<AggregateCall> aggCalls,
Map<AggregateCall, RexNode> aggCallMapping,
final List<RelDataType> aggArgTypes) {
if (aggCall.getAggregation() instanceof SqlCountAggFunction
@@ -308,7 +307,7 @@ public class RexBuilder {
}
RexNode rex = aggCallMapping.get(aggCall);
if (rex == null) {
- int index = aggCalls.size() + groupCount * (indicator ? 2 : 1);
+ int index = aggCalls.size() + groupCount;
aggCalls.add(aggCall);
rex = makeInputRef(aggCall.getType(), index);
aggCallMapping.put(aggCall, rex);
@@ -316,6 +315,21 @@ public class RexBuilder {
return rex;
}
+ /**
+ * Creates a reference to an aggregate call, checking for repeated calls.
+ */
+ @Deprecated // to be removed before 2.0
+ public RexNode addAggCall(AggregateCall aggCall, int groupCount,
+ boolean indicator, List<AggregateCall> aggCalls,
+ Map<AggregateCall, RexNode> aggCallMapping,
+ final List<RelDataType> aggArgTypes) {
+ Preconditions.checkArgument(!indicator,
+ "indicator is deprecated, use GROUPING function instead");
+ return addAggCall(aggCall, groupCount, aggCalls,
+ aggCallMapping, aggArgTypes);
+
+ }
+
private static List<Integer> nullableArgs(List<Integer> list0,
List<RelDataType> types) {
final List<Integer> list = new ArrayList<>();
diff --git a/core/src/main/java/org/apache/calcite/sql2rel/RelFieldTrimmer.java b/core/src/main/java/org/apache/calcite/sql2rel/RelFieldTrimmer.java
index 89ccd6a..9029765 100644
--- a/core/src/main/java/org/apache/calcite/sql2rel/RelFieldTrimmer.java
+++ b/core/src/main/java/org/apache/calcite/sql2rel/RelFieldTrimmer.java
@@ -811,9 +811,8 @@ public class RelFieldTrimmer implements ReflectiveVisitor {
// We have to return group keys and (if present) indicators.
// So, pretend that the consumer asked for them.
final int groupCount = aggregate.getGroupSet().cardinality();
- final int indicatorCount = aggregate.getIndicatorCount();
fieldsUsed =
- fieldsUsed.union(ImmutableBitSet.range(groupCount + indicatorCount));
+ fieldsUsed.union(ImmutableBitSet.range(groupCount));
// If the input is unchanged, and we need to project all columns,
// there's nothing to do.
@@ -824,7 +823,7 @@ public class RelFieldTrimmer implements ReflectiveVisitor {
}
// Which agg calls are used by our consumer?
- int j = groupCount + indicatorCount;
+ int j = groupCount;
int usedAggCallCount = 0;
for (int i = 0; i < aggregate.getAggCallList().size(); i++) {
if (fieldsUsed.get(j++)) {
@@ -837,7 +836,7 @@ public class RelFieldTrimmer implements ReflectiveVisitor {
Mappings.create(
MappingType.INVERSE_SURJECTION,
rowType.getFieldCount(),
- groupCount + indicatorCount + usedAggCallCount);
+ groupCount + usedAggCallCount);
final ImmutableBitSet newGroupSet =
Mappings.apply(inputMapping, aggregate.getGroupSet());
@@ -849,14 +848,14 @@ public class RelFieldTrimmer implements ReflectiveVisitor {
// Populate mapping of where to find the fields. System, group key and
// indicator fields first.
- for (j = 0; j < groupCount + indicatorCount; j++) {
+ for (j = 0; j < groupCount; j++) {
mapping.set(j, j);
}
// Now create new agg calls, and populate mapping for them.
relBuilder.push(newInput);
final List<RelBuilder.AggCall> newAggCallList = new ArrayList<>();
- j = groupCount + indicatorCount;
+ j = groupCount;
for (AggregateCall aggCall : aggregate.getAggCallList()) {
if (fieldsUsed.get(j)) {
final ImmutableList<RexNode> args =
@@ -871,7 +870,7 @@ public class RelFieldTrimmer implements ReflectiveVisitor {
.approximate(aggCall.isApproximate())
.sort(relBuilder.fields(aggCall.collation))
.as(aggCall.name);
- mapping.set(j, groupCount + indicatorCount + newAggCallList.size());
+ mapping.set(j, groupCount + newAggCallList.size());
newAggCallList.add(newAggCall);
}
++j;
diff --git a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
index 5bbc66f..6e1db91 100644
--- a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
+++ b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
@@ -5185,7 +5185,6 @@ public class SqlToRelConverter {
rexBuilder.addAggCall(
aggCall,
groupExprs.size(),
- false,
aggCalls,
aggCallMapping,
argTypes);
diff --git a/core/src/test/java/org/apache/calcite/plan/volcano/TraitPropagationTest.java b/core/src/test/java/org/apache/calcite/plan/volcano/TraitPropagationTest.java
index 6685d2d..5743fdd 100644
--- a/core/src/test/java/org/apache/calcite/plan/volcano/TraitPropagationTest.java
+++ b/core/src/test/java/org/apache/calcite/plan/volcano/TraitPropagationTest.java
@@ -71,6 +71,7 @@ import org.apache.calcite.tools.RuleSet;
import org.apache.calcite.tools.RuleSets;
import org.apache.calcite.util.ImmutableBitSet;
+import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import org.junit.Test;
@@ -206,7 +207,7 @@ public class TraitPropagationTest {
RelNode convertedInput = convert(rel.getInput(), desiredTraits);
call.transformTo(
new PhysAgg(rel.getCluster(), empty.replace(PHYSICAL),
- convertedInput, rel.indicator, rel.getGroupSet(),
+ convertedInput, false, rel.getGroupSet(),
rel.getGroupSets(), rel.getAggCallList()));
}
}
@@ -297,8 +298,9 @@ public class TraitPropagationTest {
PhysAgg(RelOptCluster cluster, RelTraitSet traits, RelNode child,
boolean indicator, ImmutableBitSet groupSet,
List<ImmutableBitSet> groupSets, List<AggregateCall> aggCalls) {
- super(cluster, traits, child, indicator, groupSet, groupSets, aggCalls);
-
+ super(cluster, traits, child, groupSet, groupSets, aggCalls);
+ Preconditions.checkArgument(!indicator,
+ "indicator is not supported, use GROUPING function instead");
}
public Aggregate copy(RelTraitSet traitSet, RelNode input,