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,