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 2019/06/01 23:28:46 UTC

[calcite] branch master updated: Following [CALCITE-2944] remove internal uses of Aggregate.indicator

This is an automated email from the ASF dual-hosted git repository.

jhyde 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 b0e83c4  Following [CALCITE-2944] remove internal uses of Aggregate.indicator
b0e83c4 is described below

commit b0e83c469ff57257c1ea621ff943ca76f626a9b7
Author: Julian Hyde <jh...@apache.org>
AuthorDate: Fri May 31 20:36:14 2019 -0700

    Following [CALCITE-2944] remove internal uses of Aggregate.indicator
    
    These were generating deprecation warnings.
---
 .../adapter/enumerable/EnumerableAggregate.java    | 21 ++++++----
 .../enumerable/EnumerableAggregateRule.java        |  1 -
 .../adapter/enumerable/EnumerableRules.java        |  5 ++-
 .../adapter/enumerable/EnumerableSemiJoin.java     |  3 +-
 .../org/apache/calcite/adapter/jdbc/JdbcRules.java | 19 ++++++---
 .../org/apache/calcite/interpreter/Bindables.java  | 16 +++++---
 .../org/apache/calcite/rel/core/Aggregate.java     | 43 +++++++++++++-------
 .../org/apache/calcite/rel/core/RelFactories.java  | 17 +++++---
 .../calcite/rel/logical/LogicalAggregate.java      | 47 +++++++++++-----------
 .../org/apache/calcite/rel/metadata/RelMdUtil.java |  3 +-
 .../rel/rules/AbstractMaterializedViewRule.java    |  2 +-
 .../AggregateExpandDistinctAggregatesRule.java     | 15 +++----
 .../rel/rules/AggregateFilterTransposeRule.java    |  5 +--
 .../calcite/rel/rules/AggregateJoinRemoveRule.java |  7 ++--
 .../calcite/rel/rules/AggregateMergeRule.java      |  3 +-
 .../rel/rules/AggregateProjectMergeRule.java       |  3 +-
 .../calcite/rel/rules/AggregateStarTableRule.java  |  2 +-
 .../rel/rules/AggregateUnionTransposeRule.java     |  2 +-
 .../java/org/apache/calcite/tools/RelBuilder.java  | 44 ++++++++------------
 .../calcite/plan/volcano/TraitPropagationTest.java | 17 ++++----
 .../apache/calcite/adapter/druid/DruidQuery.java   |  3 +-
 .../apache/calcite/adapter/druid/DruidRules.java   |  9 ++---
 .../elasticsearch/ElasticsearchAggregate.java      | 21 +++++++---
 .../adapter/elasticsearch/ElasticsearchRules.java  |  1 -
 .../calcite/adapter/geode/rel/GeodeAggregate.java  | 21 +++++++---
 .../calcite/adapter/geode/rel/GeodeRules.java      |  1 -
 .../calcite/adapter/mongodb/MongoAggregate.java    | 22 ++++++----
 .../apache/calcite/adapter/mongodb/MongoRules.java |  1 -
 .../apache/calcite/adapter/pig/PigAggregate.java   | 24 +++++++----
 .../calcite/adapter/pig/PigRelFactories.java       |  6 +--
 .../org/apache/calcite/adapter/pig/PigRules.java   |  2 +-
 31 files changed, 215 insertions(+), 171 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 8605409..31b2b56 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
@@ -47,7 +47,6 @@ import org.apache.calcite.util.ImmutableBitSet;
 import org.apache.calcite.util.Pair;
 import org.apache.calcite.util.Util;
 
-import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 
 import java.lang.reflect.Type;
@@ -62,15 +61,12 @@ public class EnumerableAggregate extends Aggregate implements EnumerableRel {
   public EnumerableAggregate(
       RelOptCluster cluster,
       RelTraitSet traitSet,
-      RelNode child,
-      boolean indicator,
+      RelNode input,
       ImmutableBitSet groupSet,
       List<ImmutableBitSet> groupSets,
       List<AggregateCall> aggCalls)
       throws InvalidRelException {
-    super(cluster, traitSet, child, groupSet, groupSets, aggCalls);
-    Preconditions.checkArgument(!indicator,
-        "EnumerableAggregate no longer supports indicator fields");
+    super(cluster, traitSet, input, groupSet, groupSets, aggCalls);
     assert getConvention() instanceof EnumerableConvention;
 
     for (AggregateCall aggCall : aggCalls) {
@@ -87,11 +83,20 @@ public class EnumerableAggregate extends Aggregate implements EnumerableRel {
     }
   }
 
+  @Deprecated // to be removed before 2.0
+  public EnumerableAggregate(RelOptCluster cluster, RelTraitSet traitSet,
+      RelNode input, boolean indicator, ImmutableBitSet groupSet,
+      List<ImmutableBitSet> groupSets, List<AggregateCall> aggCalls)
+      throws InvalidRelException {
+    this(cluster, traitSet, input, groupSet, groupSets, aggCalls);
+    checkIndicator(indicator);
+  }
+
   @Override public EnumerableAggregate copy(RelTraitSet traitSet, RelNode input,
-      boolean indicator, ImmutableBitSet groupSet,
+      ImmutableBitSet groupSet,
       List<ImmutableBitSet> groupSets, List<AggregateCall> aggCalls) {
     try {
-      return new EnumerableAggregate(getCluster(), traitSet, input, indicator,
+      return new EnumerableAggregate(getCluster(), traitSet, input,
           groupSet, groupSets, aggCalls);
     } catch (InvalidRelException e) {
       // Semantic error not possible. Must be a bug. Convert to
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 b640314..1eeeeaa 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,6 @@ class EnumerableAggregateRule extends ConverterRule {
           rel.getCluster(),
           traitSet,
           convert(agg.getInput(), EnumerableConvention.INSTANCE),
-          false,
           agg.getGroupSet(),
           agg.getGroupSets(),
           agg.getAggCallList());
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRules.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRules.java
index 19d30bf..f3ca806 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRules.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRules.java
@@ -44,8 +44,9 @@ public class EnumerableRules {
   public static final RelOptRule ENUMERABLE_MERGE_JOIN_RULE =
       new EnumerableMergeJoinRule();
 
-  /** @deprecated To be removed along with {@link SemiJoin};
-   * use {@link #ENUMERABLE_JOIN_RULE} */
+  /** @deprecated To be removed along with
+   * {@link org.apache.calcite.rel.core.SemiJoin};
+   * use {@link #ENUMERABLE_JOIN_RULE} instead. */
   @Deprecated // to be removed before 1.21
   public static final RelOptRule ENUMERABLE_SEMI_JOIN_RULE =
       new EnumerableSemiJoinRule();
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSemiJoin.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSemiJoin.java
index cde97b6..bf13091 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSemiJoin.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSemiJoin.java
@@ -38,7 +38,8 @@ import org.apache.calcite.util.Util;
 /** Implementation of {@link org.apache.calcite.rel.core.SemiJoin} in
  * {@link org.apache.calcite.adapter.enumerable.EnumerableConvention enumerable calling convention}.
  *
- * @deprecated This class is deprecated along with {@link SemiJoin};
+ * @deprecated This class is deprecated along with
+ * {@link org.apache.calcite.rel.core.SemiJoin};
  * the function is merged into {@link EnumerableHashJoin};
  * see {@link EnumerableJoinRule} for details.
  */
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 85575ba..abfbeec 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
@@ -141,11 +141,11 @@ public class JdbcRules {
       };
 
   public static final RelFactories.AggregateFactory AGGREGATE_FACTORY =
-      (input, indicator, groupSet, groupSets, aggCalls) -> {
+      (input, groupSet, groupSets, aggCalls) -> {
         final RelOptCluster cluster = input.getCluster();
         final RelTraitSet traitSet = cluster.traitSetOf(input.getConvention());
         try {
-          return new JdbcAggregate(cluster, traitSet, input, false, groupSet,
+          return new JdbcAggregate(cluster, traitSet, input, groupSet,
               groupSets, aggCalls);
         } catch (InvalidRelException e) {
           throw new AssertionError(e);
@@ -683,7 +683,6 @@ public class JdbcRules {
         RelOptCluster cluster,
         RelTraitSet traitSet,
         RelNode input,
-        boolean indicator,
         ImmutableBitSet groupSet,
         List<ImmutableBitSet> groupSets,
         List<AggregateCall> aggCalls)
@@ -691,7 +690,6 @@ public class JdbcRules {
       super(cluster, traitSet, input, groupSet, groupSets, aggCalls);
       assert getConvention() instanceof JdbcConvention;
       assert this.groupSets.size() == 1 : "Grouping sets not supported";
-      assert !indicator;
       final SqlDialect dialect = ((JdbcConvention) getConvention()).dialect;
       for (AggregateCall aggCall : aggCalls) {
         if (!canImplement(aggCall.getAggregation(), dialect)) {
@@ -701,11 +699,20 @@ public class JdbcRules {
       }
     }
 
+    @Deprecated // to be removed before 2.0
+    public JdbcAggregate(RelOptCluster cluster, RelTraitSet traitSet,
+        RelNode input, boolean indicator, ImmutableBitSet groupSet,
+        List<ImmutableBitSet> groupSets, List<AggregateCall> aggCalls)
+        throws InvalidRelException {
+      this(cluster, traitSet, input, groupSet, groupSets, aggCalls);
+      checkIndicator(indicator);
+    }
+
     @Override public JdbcAggregate copy(RelTraitSet traitSet, RelNode input,
-        boolean indicator, ImmutableBitSet groupSet,
+        ImmutableBitSet groupSet,
         List<ImmutableBitSet> groupSets, List<AggregateCall> aggCalls) {
       try {
-        return new JdbcAggregate(getCluster(), traitSet, input, indicator,
+        return new JdbcAggregate(getCluster(), traitSet, input,
             groupSet, groupSets, aggCalls);
       } catch (InvalidRelException e) {
         // Semantic error not possible. Must be a bug. Convert to
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 3541bfa..e481de0 100644
--- a/core/src/main/java/org/apache/calcite/interpreter/Bindables.java
+++ b/core/src/main/java/org/apache/calcite/interpreter/Bindables.java
@@ -612,7 +612,6 @@ public class Bindables {
         RelOptCluster cluster,
         RelTraitSet traitSet,
         RelNode input,
-        boolean indicator,
         ImmutableBitSet groupSet,
         List<ImmutableBitSet> groupSets,
         List<AggregateCall> aggCalls)
@@ -620,8 +619,6 @@ public class Bindables {
       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(
@@ -636,11 +633,20 @@ public class Bindables {
       }
     }
 
+    @Deprecated // to be removed before 2.0
+    public BindableAggregate(RelOptCluster cluster, RelTraitSet traitSet,
+        RelNode input, boolean indicator, ImmutableBitSet groupSet,
+        List<ImmutableBitSet> groupSets, List<AggregateCall> aggCalls)
+        throws InvalidRelException {
+      this(cluster, traitSet, input, groupSet, groupSets, aggCalls);
+      checkIndicator(indicator);
+    }
+
     @Override public BindableAggregate copy(RelTraitSet traitSet, RelNode input,
-        boolean indicator, ImmutableBitSet groupSet,
+        ImmutableBitSet groupSet,
         List<ImmutableBitSet> groupSets, List<AggregateCall> aggCalls) {
       try {
-        return new BindableAggregate(getCluster(), traitSet, input, indicator,
+        return new BindableAggregate(getCluster(), traitSet, input,
             groupSet, groupSets, aggCalls);
       } catch (InvalidRelException e) {
         // Semantic error not possible. Must be a bug. Convert to
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 55eafd1..79c75ee 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
@@ -17,6 +17,7 @@
 package org.apache.calcite.rel.core;
 
 import org.apache.calcite.linq4j.Ord;
+import org.apache.calcite.linq4j.function.Experimental;
 import org.apache.calcite.plan.RelOptCluster;
 import org.apache.calcite.plan.RelOptCost;
 import org.apache.calcite.plan.RelOptPlanner;
@@ -90,6 +91,14 @@ public abstract class Aggregate extends SingleRel {
   public static final com.google.common.base.Predicate<Aggregate>
       IS_NOT_GRAND_TOTAL = Aggregate::isNotGrandTotal;
 
+  /** Used internally; will removed when {@link #indicator} is removed,
+   * before 2.0. */
+  @Experimental
+  public static void checkIndicator(boolean indicator) {
+    Preconditions.checkArgument(!indicator,
+        "indicator is no longer supported; use GROUPING function instead");
+  }
+
   //~ Instance fields --------------------------------------------------------
 
   @Deprecated // unused field, to be removed before 2.0
@@ -120,20 +129,20 @@ public abstract class Aggregate extends SingleRel {
    * {@code (0, 1, 2), (1), (0, 2), (0), ()}.
    *
    * @param cluster  Cluster
-   * @param traits   Traits
-   * @param child    Child
+   * @param traitSet Trait set
+   * @param input    Input relational expression
    * @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
    */
   protected Aggregate(
       RelOptCluster cluster,
-      RelTraitSet traits,
-      RelNode child,
+      RelTraitSet traitSet,
+      RelNode input,
       ImmutableBitSet groupSet,
       List<ImmutableBitSet> groupSets,
       List<AggregateCall> aggCalls) {
-    super(cluster, traits, child);
+    super(cluster, traitSet, input);
     this.aggCalls = ImmutableList.copyOf(aggCalls);
     this.groupSet = Objects.requireNonNull(groupSet);
     if (groupSets == null) {
@@ -145,11 +154,11 @@ public abstract class Aggregate extends SingleRel {
         assert groupSet.contains(set);
       }
     }
-    assert groupSet.length() <= child.getRowType().getFieldCount();
+    assert groupSet.length() <= input.getRowType().getFieldCount();
     for (AggregateCall aggCall : aggCalls) {
       assert typeMatchesInferred(aggCall, Litmus.THROW);
       Preconditions.checkArgument(aggCall.filterArg < 0
-          || isPredicate(child, aggCall.filterArg),
+          || isPredicate(input, aggCall.filterArg),
           "filter must be BOOLEAN NOT NULL");
     }
   }
@@ -167,8 +176,7 @@ public abstract class Aggregate extends SingleRel {
       List<ImmutableBitSet> groupSets,
       List<AggregateCall> aggCalls) {
     this(cluster, traits, child, groupSet, groupSets, aggCalls);
-    Preconditions.checkArgument(!indicator,
-        "indicator is not supported, use GROUPING function instead");
+    checkIndicator(indicator);
   }
 
   public static boolean isNotGrandTotal(Aggregate aggregate) {
@@ -200,15 +208,13 @@ public abstract class Aggregate extends SingleRel {
 
   @Override public final RelNode copy(RelTraitSet traitSet,
       List<RelNode> inputs) {
-    return copy(traitSet, sole(inputs), false, groupSet, groupSets,
-        aggCalls);
+    return copy(traitSet, sole(inputs), groupSet, groupSets, aggCalls);
   }
 
   /** Creates a copy of this aggregate.
    *
    * @param traitSet Traits
    * @param input Input
-   * @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
@@ -219,9 +225,17 @@ public abstract class Aggregate extends SingleRel {
    * @see #copy(org.apache.calcite.plan.RelTraitSet, java.util.List)
    */
   public abstract Aggregate copy(RelTraitSet traitSet, RelNode input,
-      boolean indicator, ImmutableBitSet groupSet,
+      ImmutableBitSet groupSet,
       List<ImmutableBitSet> groupSets, List<AggregateCall> aggCalls);
 
+  @Deprecated // to be removed before 2.0
+  public Aggregate copy(RelTraitSet traitSet, RelNode input,
+      boolean indicator, ImmutableBitSet groupSet,
+      List<ImmutableBitSet> groupSets, List<AggregateCall> aggCalls) {
+    checkIndicator(indicator);
+    return copy(traitSet, input, groupSet, groupSets, aggCalls);
+  }
+
   /**
    * Returns a list of calls to aggregate functions.
    *
@@ -367,8 +381,7 @@ public abstract class Aggregate extends SingleRel {
         builder.nullable(true);
       }
     }
-    Preconditions.checkArgument(!indicator,
-        "indicator is not supported, use GROUPING function instead");
+    checkIndicator(indicator);
     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/core/RelFactories.java b/core/src/main/java/org/apache/calcite/rel/core/RelFactories.java
index 617e66b..ac8944f 100644
--- a/core/src/main/java/org/apache/calcite/rel/core/RelFactories.java
+++ b/core/src/main/java/org/apache/calcite/rel/core/RelFactories.java
@@ -271,9 +271,16 @@ public class RelFactories {
    */
   public interface AggregateFactory {
     /** Creates an aggregate. */
-    RelNode createAggregate(RelNode input, boolean indicator,
+    RelNode createAggregate(RelNode input, ImmutableBitSet groupSet,
+        ImmutableList<ImmutableBitSet> groupSets, List<AggregateCall> aggCalls);
+
+    @Deprecated // to be removed before 2.0
+    default RelNode createAggregate(RelNode input, boolean indicator,
         ImmutableBitSet groupSet, ImmutableList<ImmutableBitSet> groupSets,
-        List<AggregateCall> aggCalls);
+        List<AggregateCall> aggCalls) {
+      Aggregate.checkIndicator(indicator);
+      return createAggregate(input, groupSet, groupSets, aggCalls);
+    }
   }
 
   /**
@@ -281,12 +288,10 @@ public class RelFactories {
    * that returns a vanilla {@link LogicalAggregate}.
    */
   private static class AggregateFactoryImpl implements AggregateFactory {
-    @SuppressWarnings("deprecation")
-    public RelNode createAggregate(RelNode input, boolean indicator,
+    public RelNode createAggregate(RelNode input,
         ImmutableBitSet groupSet, ImmutableList<ImmutableBitSet> groupSets,
         List<AggregateCall> aggCalls) {
-      return LogicalAggregate.create(input, indicator,
-          groupSet, groupSets, aggCalls);
+      return LogicalAggregate.create(input, groupSet, groupSets, aggCalls);
     }
   }
 
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 3ddcbe1..8b10baf 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,8 +26,6 @@ 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;
 
 /**
@@ -52,8 +50,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  Unused field, alway false
+   * @param input      Input relational expression
    * @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
@@ -61,26 +58,28 @@ public final class LogicalAggregate extends Aggregate {
   public LogicalAggregate(
       RelOptCluster cluster,
       RelTraitSet traitSet,
-      RelNode child,
-      boolean indicator,
+      RelNode input,
       ImmutableBitSet groupSet,
       List<ImmutableBitSet> groupSets,
       List<AggregateCall> aggCalls) {
-    super(cluster, traitSet, child, groupSet, groupSets, aggCalls);
-    Preconditions.checkArgument(!indicator,
-        "indicator is not supported, use GROUPING function instead");
+    super(cluster, traitSet, input, groupSet, groupSets, aggCalls);
   }
 
   @Deprecated // to be removed before 2.0
-  public LogicalAggregate(
-      RelOptCluster cluster,
-      RelNode child,
-      boolean indicator,
-      ImmutableBitSet groupSet,
-      List<ImmutableBitSet> groupSets,
-      List<AggregateCall> aggCalls) {
-    this(cluster, cluster.traitSetOf(Convention.NONE), child, indicator,
-        groupSet, groupSets, aggCalls);
+  public LogicalAggregate(RelOptCluster cluster, RelTraitSet traitSet,
+      RelNode input, boolean indicator, ImmutableBitSet groupSet,
+      List<ImmutableBitSet> groupSets, List<AggregateCall> aggCalls) {
+    super(cluster, traitSet, input, groupSet, groupSets, aggCalls);
+    checkIndicator(indicator);
+  }
+
+  @Deprecated // to be removed before 2.0
+  public LogicalAggregate(RelOptCluster cluster,
+      RelNode input, boolean indicator, ImmutableBitSet groupSet,
+      List<ImmutableBitSet> groupSets, List<AggregateCall> aggCalls) {
+    super(cluster, cluster.traitSetOf(Convention.NONE), input, groupSet,
+        groupSets, aggCalls);
+    checkIndicator(indicator);
   }
 
   /**
@@ -94,7 +93,7 @@ public final class LogicalAggregate extends Aggregate {
   public static LogicalAggregate create(final RelNode input,
       ImmutableBitSet groupSet, List<ImmutableBitSet> groupSets,
       List<AggregateCall> aggCalls) {
-    return create_(input, false, groupSet, groupSets, aggCalls);
+    return create_(input, groupSet, groupSets, aggCalls);
   }
 
   @Deprecated // to be removed before 2.0
@@ -103,27 +102,27 @@ public final class LogicalAggregate extends Aggregate {
       ImmutableBitSet groupSet,
       List<ImmutableBitSet> groupSets,
       List<AggregateCall> aggCalls) {
-    return create_(input, indicator, groupSet, groupSets, aggCalls);
+    checkIndicator(indicator);
+    return create_(input, groupSet, groupSets, aggCalls);
   }
 
   private static LogicalAggregate create_(final RelNode input,
-      boolean indicator,
       ImmutableBitSet groupSet,
       List<ImmutableBitSet> groupSets,
       List<AggregateCall> aggCalls) {
     final RelOptCluster cluster = input.getCluster();
     final RelTraitSet traitSet = cluster.traitSetOf(Convention.NONE);
-    return new LogicalAggregate(cluster, traitSet, input, indicator, groupSet,
+    return new LogicalAggregate(cluster, traitSet, input, groupSet,
         groupSets, aggCalls);
   }
 
   //~ Methods ----------------------------------------------------------------
 
   @Override public LogicalAggregate copy(RelTraitSet traitSet, RelNode input,
-      boolean indicator, ImmutableBitSet groupSet,
+      ImmutableBitSet groupSet,
       List<ImmutableBitSet> groupSets, List<AggregateCall> aggCalls) {
     assert traitSet.containsIfApplicable(Convention.NONE);
-    return new LogicalAggregate(getCluster(), traitSet, input, indicator,
+    return new LogicalAggregate(getCluster(), traitSet, input,
         groupSet, groupSets, aggCalls);
   }
 
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 52ab057..e64bf4f 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
@@ -738,8 +738,7 @@ public class RelMdUtil {
     return product * mq.getSelectivity(join, condition);
   }
 
-  /** Returns an estimate of the number of rows returned by a
-   * {@link SemiJoin}. */
+  /** Returns an estimate of the number of rows returned by a semi-join. */
   public static Double getSemiJoinRowCount(RelMetadataQuery mq, RelNode left,
       RelNode right, JoinRelType joinType, RexNode condition) {
     final Double leftCount = mq.getRowCount(left);
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 60f3f7b..06f33cc 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(), false,
+          aggregateViewNode.getTraitSet(), relBuilder.build(),
           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 3cb63be..d773d80 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
@@ -305,7 +305,7 @@ public final class AggregateExpandDistinctAggregatesRule extends RelOptRule {
     // Generate the aggregate B (see the reference example above)
     relBuilder.push(
         aggregate.copy(aggregate.getTraitSet(), relBuilder.build(),
-            false, bottomGroupSet, null, bottomAggregateCalls));
+            bottomGroupSet, null, bottomAggregateCalls));
 
     // Add aggregate A (see the reference example above), the top aggregate
     // to handle the rest of the aggregation that the bottom aggregate hasn't handled
@@ -369,8 +369,7 @@ public final class AggregateExpandDistinctAggregatesRule extends RelOptRule {
       groupSetToAdd++;
     }
     relBuilder.push(
-        aggregate.copy(aggregate.getTraitSet(),
-            relBuilder.build(), false,
+        aggregate.copy(aggregate.getTraitSet(), relBuilder.build(),
             ImmutableBitSet.of(topGroupSet), null, topAggregateCalls));
     return relBuilder;
   }
@@ -552,8 +551,7 @@ public final class AggregateExpandDistinctAggregatesRule extends RelOptRule {
     final int cardinality = aggregate.getGroupSet().cardinality();
     relBuilder.push(
         aggregate.copy(aggregate.getTraitSet(), relBuilder.build(),
-            false, ImmutableBitSet.range(cardinality), null,
-            newAggCalls));
+            ImmutableBitSet.range(cardinality), null, newAggCalls));
     return relBuilder;
   }
 
@@ -696,7 +694,7 @@ public final class AggregateExpandDistinctAggregatesRule extends RelOptRule {
 
     relBuilder.push(
         aggregate.copy(aggregate.getTraitSet(), relBuilder.build(),
-            false, newGroupSet, newGroupingSets, aggCallList));
+            newGroupSet, newGroupingSets, aggCallList));
 
     // If there's no left child yet, no need to create the join
     if (n == 0) {
@@ -844,9 +842,8 @@ public final class AggregateExpandDistinctAggregatesRule extends RelOptRule {
     // Get the distinct values of the GROUP BY fields and the arguments
     // to the agg functions.
     relBuilder.push(
-        aggregate.copy(aggregate.getTraitSet(), relBuilder.build(), false,
-            ImmutableBitSet.range(projects.size()),
-            null, ImmutableList.of()));
+        aggregate.copy(aggregate.getTraitSet(), relBuilder.build(),
+            ImmutableBitSet.range(projects.size()), null, ImmutableList.of()));
     return relBuilder;
   }
 }
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 a7bd0c3..06b0ecf 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
@@ -94,7 +94,7 @@ public class AggregateFilterTransposeRule extends RelOptRule {
         contains(filterColumns);
     final Aggregate newAggregate =
         aggregate.copy(aggregate.getTraitSet(), input,
-                false, newGroupSet, null, aggregate.getAggCallList());
+            newGroupSet, null, aggregate.getAggCallList());
     final Mappings.TargetMapping mapping = Mappings.target(
         newGroupSet::indexOf,
         input.getRowType().getFieldCount(),
@@ -150,8 +150,7 @@ public class AggregateFilterTransposeRule extends RelOptRule {
       }
       final Aggregate topAggregate =
           aggregate.copy(aggregate.getTraitSet(), newFilter,
-              false, topGroupSet.build(),
-              newGroupingSets, topAggCallList);
+              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 1c98e9f..c3e5e23 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
@@ -98,10 +98,9 @@ public class AggregateJoinRemoveRule extends RelOptRule {
 
     RelNode node;
     if (isLeftJoin) {
-      node = aggregate
-          .copy(aggregate.getTraitSet(), join.getLeft(), false,
-              aggregate.getGroupSet(), aggregate.getGroupSets(),
-              aggregate.getAggCallList());
+      node = aggregate.copy(aggregate.getTraitSet(), join.getLeft(),
+          aggregate.getGroupSet(), aggregate.getGroupSets(),
+          aggregate.getAggCallList());
     } else {
       final Map<Integer, Integer> map = new HashMap<>();
       allFields.forEach(index -> map.put(index, index - upper));
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 cd14a9d..57c5e98 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
@@ -142,8 +142,7 @@ public class AggregateMergeRule extends RelOptRule {
     }
 
     final Aggregate finalAgg =
-        topAgg.copy(topAgg.getTraitSet(), bottomAgg.getInput(),
-            false, topGroupSet,
+        topAgg.copy(topAgg.getTraitSet(), bottomAgg.getInput(), 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 4ad690d..3b4dd3f 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,8 +111,7 @@ public class AggregateProjectMergeRule extends RelOptRule {
 
     final Aggregate newAggregate =
         aggregate.copy(aggregate.getTraitSet(), project.getInput(),
-            false, newGroupSet, newGroupingSets,
-            aggCalls.build());
+            newGroupSet, newGroupingSets, aggCalls.build());
 
     // Add a project if the group set is not in the same order or
     // contains duplicates.
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 f257609..21351f7 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
@@ -178,7 +178,7 @@ public class AggregateStarTableRule extends RelOptRule {
         aggCalls.add(copy);
       }
       relBuilder.push(
-          aggregate.copy(aggregate.getTraitSet(), relBuilder.build(), false,
+          aggregate.copy(aggregate.getTraitSet(), relBuilder.build(),
               groupSet.build(), null, aggCalls));
     } else if (!tileKey.measures.equals(measures)) {
       if (CalciteSystemProperty.DEBUG.value()) {
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 f723d75..901b640 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
@@ -108,7 +108,7 @@ public class AggregateUnionTransposeRule extends RelOptRule {
 
     List<AggregateCall> transformedAggCalls =
         transformAggCalls(
-            aggRel.copy(aggRel.getTraitSet(), aggRel.getInput(), false,
+            aggRel.copy(aggRel.getTraitSet(), aggRel.getInput(),
                 aggRel.getGroupSet(), null, aggRel.getAggCallList()),
             groupCount, aggRel.getAggCallList());
     if (transformedAggCalls == null) {
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 d31312f..cfb7708 100644
--- a/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
+++ b/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
@@ -712,13 +712,13 @@ public class RelBuilder {
 
   /** Creates a group key. */
   public GroupKey groupKey(Iterable<? extends RexNode> nodes) {
-    return new GroupKeyImpl(ImmutableList.copyOf(nodes), false, null, null);
+    return new GroupKeyImpl(ImmutableList.copyOf(nodes), null, null);
   }
 
   /** 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);
+    return groupKey_(nodes, nodeLists);
   }
 
   /** @deprecated Now that indicator is deprecated, use
@@ -727,18 +727,18 @@ public class RelBuilder {
   @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);
+    Aggregate.checkIndicator(indicator);
+    return groupKey_(nodes, 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) {
       builder.add(ImmutableList.copyOf(nodeList));
     }
-    return new GroupKeyImpl(ImmutableList.copyOf(nodes), indicator, builder.build(), null);
+    return new GroupKeyImpl(ImmutableList.copyOf(nodes), builder.build(), null);
   }
 
   /** Creates a group key of fields identified by ordinal. */
@@ -769,14 +769,14 @@ public class RelBuilder {
    * are coming from an existing {@link Aggregate}. */
   public GroupKey groupKey(ImmutableBitSet groupSet,
       @Nonnull Iterable<? extends ImmutableBitSet> groupSets) {
-    return groupKey_(groupSet, false, ImmutableList.copyOf(groupSets));
+    return groupKey_(groupSet, 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 == null
+    return groupKey_(groupSet, groupSets == null
         ? ImmutableList.of(groupSet) : ImmutableList.copyOf(groupSets));
   }
 
@@ -784,11 +784,12 @@ public class RelBuilder {
   @Deprecated // to be removed before 2.0
   public GroupKey groupKey(ImmutableBitSet groupSet, boolean indicator,
       ImmutableList<ImmutableBitSet> groupSets) {
-    return groupKey_(groupSet, indicator, groupSets == null
+    Aggregate.checkIndicator(indicator);
+    return groupKey_(groupSet, groupSets == null
         ? ImmutableList.of(groupSet) : ImmutableList.copyOf(groupSets));
   }
 
-  private GroupKey groupKey_(ImmutableBitSet groupSet, boolean indicator,
+  private GroupKey groupKey_(ImmutableBitSet groupSet,
       @Nonnull ImmutableList<ImmutableBitSet> groupSets) {
     if (groupSet.length() > peek().getRowType().getFieldCount()) {
       throw new IllegalArgumentException("out of bounds: " + groupSet);
@@ -799,7 +800,7 @@ public class RelBuilder {
     final List<ImmutableList<RexNode>> nodeLists =
         Util.transform(groupSets,
             bitSet -> fields(ImmutableIntList.of(bitSet.toArray())));
-    return groupKey_(nodes, indicator, nodeLists);
+    return groupKey_(nodes, nodeLists);
   }
 
   @Deprecated // to be removed before 2.0
@@ -1504,7 +1505,7 @@ public class RelBuilder {
     final ImmutableBitSet groupSet =
         ImmutableBitSet.of(registrar.registerExpressions(groupKey_.nodes));
   label:
-    if (Iterables.isEmpty(aggCalls) && !groupKey_.indicator) {
+    if (Iterables.isEmpty(aggCalls)) {
       final RelMetadataQuery mq = peek().getCluster().getMetadataQuery();
       if (groupSet.isEmpty()) {
         final Double minRowCount = mq.getMinRowCount(peek());
@@ -1602,7 +1603,7 @@ public class RelBuilder {
       assert groupSet.contains(set);
     }
     RelNode aggregate = aggregateFactory.createAggregate(r,
-        groupKey_.indicator, groupSet, groupSets, aggregateCalls);
+        groupSet, groupSets, aggregateCalls);
 
     // build field list
     final ImmutableList.Builder<Field> fields = ImmutableList.builder();
@@ -1626,17 +1627,7 @@ public class RelBuilder {
       }
       i++;
     }
-    // second, indicator fields (copy from aggregate rel type)
-    if (groupKey_.indicator) {
-      for (int j = 0; j < groupSet.cardinality(); ++j) {
-        final RelDataTypeField field = aggregateFields.get(i);
-        final RelDataTypeField fieldType =
-            new RelDataTypeFieldImpl(field.getName(), i, field.getType());
-        fields.add(new Field(ImmutableSet.of(), fieldType));
-        i++;
-      }
-    }
-    // third, aggregate fields. retain `i' as field index
+    // second, aggregate fields. retain `i' as field index
     for (int j = 0; j < aggregateCalls.size(); ++j) {
       final AggregateCall call = aggregateCalls.get(j);
       final RelDataTypeField fieldType =
@@ -2462,15 +2453,12 @@ public class RelBuilder {
   /** Implementation of {@link GroupKey}. */
   protected static class GroupKeyImpl implements GroupKey {
     final ImmutableList<RexNode> nodes;
-    final boolean indicator;
     final ImmutableList<ImmutableList<RexNode>> nodeLists;
     final String alias;
 
-    GroupKeyImpl(ImmutableList<RexNode> nodes, boolean indicator,
+    GroupKeyImpl(ImmutableList<RexNode> nodes,
         ImmutableList<ImmutableList<RexNode>> nodeLists, String alias) {
       this.nodes = Objects.requireNonNull(nodes);
-      assert !indicator;
-      this.indicator = indicator;
       this.nodeLists = nodeLists;
       this.alias = alias;
     }
@@ -2482,7 +2470,7 @@ public class RelBuilder {
     public GroupKey alias(String alias) {
       return Objects.equals(this.alias, alias)
           ? this
-          : new GroupKeyImpl(nodes, indicator, nodeLists, alias);
+          : new GroupKeyImpl(nodes, nodeLists, alias);
     }
   }
 
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 5743fdd..11701a6 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,7 +71,6 @@ 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;
@@ -169,7 +168,7 @@ public class TraitPropagationTest {
           false, false, false, Collections.singletonList(1), -1, RelCollations.EMPTY,
           sqlBigInt, "cnt");
       RelNode agg = new LogicalAggregate(cluster,
-          cluster.traitSetOf(Convention.NONE), project, false,
+          cluster.traitSetOf(Convention.NONE), project,
           ImmutableBitSet.of(0), null, Collections.singletonList(aggCall));
 
       final RelNode rootRel = agg;
@@ -207,7 +206,7 @@ public class TraitPropagationTest {
       RelNode convertedInput = convert(rel.getInput(), desiredTraits);
       call.transformTo(
           new PhysAgg(rel.getCluster(), empty.replace(PHYSICAL),
-              convertedInput, false, rel.getGroupSet(),
+              convertedInput, rel.getGroupSet(),
               rel.getGroupSets(), rel.getAggCallList()));
     }
   }
@@ -295,18 +294,16 @@ public class TraitPropagationTest {
 
   /** Physical Aggregate RelNode */
   private static class PhysAgg extends Aggregate implements Phys {
-    PhysAgg(RelOptCluster cluster, RelTraitSet traits, RelNode child,
-        boolean indicator, ImmutableBitSet groupSet,
+    PhysAgg(RelOptCluster cluster, RelTraitSet traitSet, RelNode input,
+        ImmutableBitSet groupSet,
         List<ImmutableBitSet> groupSets, List<AggregateCall> aggCalls) {
-      super(cluster, traits, child, groupSet, groupSets, aggCalls);
-      Preconditions.checkArgument(!indicator,
-          "indicator is not supported, use GROUPING function instead");
+      super(cluster, traitSet, input, groupSet, groupSets, aggCalls);
     }
 
     public Aggregate copy(RelTraitSet traitSet, RelNode input,
-        boolean indicator, ImmutableBitSet groupSet,
+        ImmutableBitSet groupSet,
         List<ImmutableBitSet> groupSets, List<AggregateCall> aggCalls) {
-      return new PhysAgg(getCluster(), traitSet, input, indicator, groupSet,
+      return new PhysAgg(getCluster(), traitSet, input, groupSet,
           groupSets, aggCalls);
     }
 
diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidQuery.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidQuery.java
index b9fd322..59235a4 100644
--- a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidQuery.java
+++ b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidQuery.java
@@ -472,8 +472,7 @@ public class DruidQuery extends AbstractRelNode implements BindableRel {
         }
         if (r instanceof Aggregate) {
           final Aggregate aggregate = (Aggregate) r;
-          if (aggregate.getGroupSets().size() != 1
-              || aggregate.indicator) {
+          if (aggregate.getGroupSets().size() != 1) {
             return litmus.fail("no grouping sets");
           }
         }
diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidRules.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidRules.java
index 1092e59..a9abdb4 100644
--- a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidRules.java
+++ b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidRules.java
@@ -445,8 +445,7 @@ public class DruidRules {
         return;
       }
 
-      if (aggregate.indicator
-          || aggregate.getGroupSets().size() != 1) {
+      if (aggregate.getGroupSets().size() != 1) {
         return;
       }
       if (DruidQuery
@@ -492,8 +491,7 @@ public class DruidRules {
       if (!DruidQuery.isValidSignature(query.signature() + 'p' + 'a')) {
         return;
       }
-      if (aggregate.indicator
-          || aggregate.getGroupSets().size() != 1) {
+      if (aggregate.getGroupSets().size() != 1) {
         return;
       }
       if (DruidQuery
@@ -604,8 +602,7 @@ public class DruidRules {
         newCalls.add(aggCall);
       }
       aggregate = aggregate.copy(aggregate.getTraitSet(), aggregate.getInput(),
-              aggregate.indicator, aggregate.getGroupSet(), aggregate.getGroupSets(),
-              newCalls);
+          aggregate.getGroupSet(), aggregate.getGroupSets(), newCalls);
 
       if (containsFilter) {
         // AND the current filterNode with the filter node inside filter
diff --git a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchAggregate.java b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchAggregate.java
index 66dfc43..1f0a646 100644
--- a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchAggregate.java
+++ b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchAggregate.java
@@ -51,15 +51,14 @@ public class ElasticsearchAggregate extends Aggregate implements ElasticsearchRe
       EnumSet.of(SqlKind.COUNT, SqlKind.MAX, SqlKind.MIN, SqlKind.AVG,
           SqlKind.SUM, SqlKind.ANY_VALUE);
 
-  /** Creates a ElasticsearchAggregate */
+  /** Creates an ElasticsearchAggregate. */
   ElasticsearchAggregate(RelOptCluster cluster,
       RelTraitSet traitSet,
       RelNode input,
-      boolean indicator,
       ImmutableBitSet groupSet,
       List<ImmutableBitSet> groupSets,
       List<AggregateCall> aggCalls) throws InvalidRelException  {
-    super(cluster, traitSet, input, indicator, groupSet, groupSets, aggCalls);
+    super(cluster, traitSet, input, groupSet, groupSets, aggCalls);
 
     if (getConvention() != input.getConvention()) {
       String message = String.format(Locale.ROOT, "%s != %s", getConvention(),
@@ -92,16 +91,26 @@ public class ElasticsearchAggregate extends Aggregate implements ElasticsearchRe
               + "Yours is %s", Group.SIMPLE, getGroupType());
       throw new InvalidRelException(message);
     }
+  }
 
+  @Deprecated // to be removed before 2.0
+  ElasticsearchAggregate(RelOptCluster cluster,
+      RelTraitSet traitSet,
+      RelNode input,
+      boolean indicator,
+      ImmutableBitSet groupSet,
+      List<ImmutableBitSet> groupSets,
+      List<AggregateCall> aggCalls) throws InvalidRelException {
+    this(cluster, traitSet, input, groupSet, groupSets, aggCalls);
+    checkIndicator(indicator);
   }
 
-  @Override public Aggregate copy(RelTraitSet traitSet, RelNode input, boolean indicator,
+  @Override public Aggregate copy(RelTraitSet traitSet, RelNode input,
       ImmutableBitSet groupSet, List<ImmutableBitSet> groupSets,
       List<AggregateCall> aggCalls) {
     try {
       return new ElasticsearchAggregate(getCluster(), traitSet, input,
-          indicator, groupSet, groupSets,
-          aggCalls);
+          groupSet, groupSets, aggCalls);
     } catch (InvalidRelException e) {
       throw new AssertionError(e);
     }
diff --git a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchRules.java b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchRules.java
index ed20aa7..5ad76df 100644
--- a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchRules.java
+++ b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchRules.java
@@ -269,7 +269,6 @@ class ElasticsearchRules {
             rel.getCluster(),
             traitSet,
             convert(agg.getInput(), traitSet.simplify()),
-            agg.indicator,
             agg.getGroupSet(),
             agg.getGroupSets(),
             agg.getAggCallList());
diff --git a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeAggregate.java b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeAggregate.java
index 19bbe63..980d3ca 100644
--- a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeAggregate.java
+++ b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeAggregate.java
@@ -46,11 +46,10 @@ public class GeodeAggregate extends Aggregate implements GeodeRel {
   public GeodeAggregate(RelOptCluster cluster,
       RelTraitSet traitSet,
       RelNode input,
-      boolean indicator,
       ImmutableBitSet groupSet,
       List<ImmutableBitSet> groupSets,
       List<AggregateCall> aggCalls) {
-    super(cluster, traitSet, input, indicator, groupSet, groupSets, aggCalls);
+    super(cluster, traitSet, input, groupSet, groupSets, aggCalls);
 
     assert getConvention() == GeodeRel.CONVENTION;
     assert getConvention() == this.input.getConvention();
@@ -64,11 +63,23 @@ public class GeodeAggregate extends Aggregate implements GeodeRel {
     }
   }
 
-  @Override public Aggregate copy(RelTraitSet traitSet, RelNode input, boolean indicator,
+  @Deprecated // to be removed before 2.0
+  public GeodeAggregate(RelOptCluster cluster,
+      RelTraitSet traitSet,
+      RelNode input,
+      boolean indicator,
+      ImmutableBitSet groupSet,
+      List<ImmutableBitSet> groupSets,
+      List<AggregateCall> aggCalls) {
+    this(cluster, traitSet, input, groupSet, groupSets, aggCalls);
+    checkIndicator(indicator);
+  }
+
+  @Override public Aggregate copy(RelTraitSet traitSet, RelNode input,
       ImmutableBitSet groupSet, List<ImmutableBitSet> groupSets,
       List<AggregateCall> aggCalls) {
-    return new GeodeAggregate(getCluster(), traitSet, input, indicator, groupSet, groupSets,
-        aggCalls);
+    return new GeodeAggregate(getCluster(), traitSet, input, groupSet,
+        groupSets, aggCalls);
   }
 
   @Override public RelOptCost computeSelfCost(RelOptPlanner planner, RelMetadataQuery mq) {
diff --git a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeRules.java b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeRules.java
index 55cf161..48e3986 100644
--- a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeRules.java
+++ b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeRules.java
@@ -181,7 +181,6 @@ public class GeodeRules {
           aggregate.getCluster(),
           traitSet,
           convert(aggregate.getInput(), traitSet.simplify()),
-          aggregate.indicator,
           aggregate.getGroupSet(),
           aggregate.getGroupSets(),
           aggregate.getAggCallList());
diff --git a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoAggregate.java b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoAggregate.java
index 0cf5f75..e7aece0 100644
--- a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoAggregate.java
+++ b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoAggregate.java
@@ -44,15 +44,14 @@ public class MongoAggregate
   public MongoAggregate(
       RelOptCluster cluster,
       RelTraitSet traitSet,
-      RelNode child,
-      boolean indicator,
+      RelNode input,
       ImmutableBitSet groupSet,
       List<ImmutableBitSet> groupSets,
       List<AggregateCall> aggCalls)
       throws InvalidRelException {
-    super(cluster, traitSet, child, indicator, groupSet, groupSets, aggCalls);
+    super(cluster, traitSet, input, groupSet, groupSets, aggCalls);
     assert getConvention() == MongoRel.CONVENTION;
-    assert getConvention() == child.getConvention();
+    assert getConvention() == input.getConvention();
 
     for (AggregateCall aggCall : aggCalls) {
       if (aggCall.isDistinct()) {
@@ -69,11 +68,20 @@ public class MongoAggregate
     }
   }
 
+  @Deprecated // to be removed before 2.0
+  public MongoAggregate(RelOptCluster cluster, RelTraitSet traitSet,
+      RelNode input, boolean indicator, ImmutableBitSet groupSet,
+      List<ImmutableBitSet> groupSets, List<AggregateCall> aggCalls)
+      throws InvalidRelException {
+    this(cluster, traitSet, input, groupSet, groupSets, aggCalls);
+    checkIndicator(indicator);
+  }
+
   @Override public Aggregate copy(RelTraitSet traitSet, RelNode input,
-      boolean indicator, ImmutableBitSet groupSet,
-      List<ImmutableBitSet> groupSets, List<AggregateCall> aggCalls) {
+      ImmutableBitSet groupSet, List<ImmutableBitSet> groupSets,
+      List<AggregateCall> aggCalls) {
     try {
-      return new MongoAggregate(getCluster(), traitSet, input, indicator,
+      return new MongoAggregate(getCluster(), traitSet, input,
           groupSet, groupSets, aggCalls);
     } catch (InvalidRelException e) {
       // Semantic error not possible. Must be a bug. Convert to
diff --git a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoRules.java b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoRules.java
index 54339d2..5584791 100644
--- a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoRules.java
+++ b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoRules.java
@@ -513,7 +513,6 @@ public class MongoRules {
             rel.getCluster(),
             traitSet,
             convert(agg.getInput(), traitSet.simplify()),
-            agg.indicator,
             agg.getGroupSet(),
             agg.getGroupSets(),
             agg.getAggCallList());
diff --git a/pig/src/main/java/org/apache/calcite/adapter/pig/PigAggregate.java b/pig/src/main/java/org/apache/calcite/adapter/pig/PigAggregate.java
index b367fb3..14f576c 100644
--- a/pig/src/main/java/org/apache/calcite/adapter/pig/PigAggregate.java
+++ b/pig/src/main/java/org/apache/calcite/adapter/pig/PigAggregate.java
@@ -39,16 +39,26 @@ public class PigAggregate extends Aggregate implements PigRel {
   public static final String DISTINCT_FIELD_SUFFIX = "_DISTINCT";
 
   /** Creates a PigAggregate. */
-  public PigAggregate(RelOptCluster cluster, RelTraitSet traits, RelNode child, boolean indicator,
-      ImmutableBitSet groupSet, List<ImmutableBitSet> groupSets, List<AggregateCall> aggCalls) {
-    super(cluster, traits, child, indicator, groupSet, groupSets, aggCalls);
+  public PigAggregate(RelOptCluster cluster, RelTraitSet traitSet,
+      RelNode input, ImmutableBitSet groupSet,
+      List<ImmutableBitSet> groupSets, List<AggregateCall> aggCalls) {
+    super(cluster, traitSet, input, groupSet, groupSets, aggCalls);
     assert getConvention() == PigRel.CONVENTION;
   }
 
-  @Override public Aggregate copy(RelTraitSet traitSet, RelNode input, boolean indicator,
-      ImmutableBitSet groupSet, List<ImmutableBitSet> groupSets, List<AggregateCall> aggCalls) {
-    return new PigAggregate(input.getCluster(), traitSet, input, indicator, groupSet, groupSets,
-        aggCalls);
+  @Deprecated // to be removed before 2.0
+  public PigAggregate(RelOptCluster cluster, RelTraitSet traitSet,
+      RelNode input, boolean indicator, ImmutableBitSet groupSet,
+      List<ImmutableBitSet> groupSets, List<AggregateCall> aggCalls) {
+    this(cluster, traitSet, input, groupSet, groupSets, aggCalls);
+    checkIndicator(indicator);
+  }
+
+  @Override public Aggregate copy(RelTraitSet traitSet, RelNode input,
+      ImmutableBitSet groupSet, List<ImmutableBitSet> groupSets,
+      List<AggregateCall> aggCalls) {
+    return new PigAggregate(input.getCluster(), traitSet, input, groupSet,
+        groupSets, aggCalls);
   }
 
   @Override public void implement(Implementor implementor) {
diff --git a/pig/src/main/java/org/apache/calcite/adapter/pig/PigRelFactories.java b/pig/src/main/java/org/apache/calcite/adapter/pig/PigRelFactories.java
index 8e16cc4..eaeed00 100644
--- a/pig/src/main/java/org/apache/calcite/adapter/pig/PigRelFactories.java
+++ b/pig/src/main/java/org/apache/calcite/adapter/pig/PigRelFactories.java
@@ -85,11 +85,11 @@ public class PigRelFactories {
 
     public static final PigAggregateFactory INSTANCE = new PigAggregateFactory();
 
-    @Override public RelNode createAggregate(RelNode input, boolean indicator,
+    @Override public RelNode createAggregate(RelNode input,
         ImmutableBitSet groupSet, ImmutableList<ImmutableBitSet> groupSets,
         List<AggregateCall> aggCalls) {
-      return new PigAggregate(input.getCluster(), input.getTraitSet(), input, indicator, groupSet,
-          groupSets, aggCalls);
+      return new PigAggregate(input.getCluster(), input.getTraitSet(), input,
+          groupSet, groupSets, aggCalls);
     }
   }
 
diff --git a/pig/src/main/java/org/apache/calcite/adapter/pig/PigRules.java b/pig/src/main/java/org/apache/calcite/adapter/pig/PigRules.java
index 355b6d0..583d852 100644
--- a/pig/src/main/java/org/apache/calcite/adapter/pig/PigRules.java
+++ b/pig/src/main/java/org/apache/calcite/adapter/pig/PigRules.java
@@ -117,7 +117,7 @@ public class PigRules {
       final LogicalAggregate agg = (LogicalAggregate) rel;
       final RelTraitSet traitSet = agg.getTraitSet().replace(PigRel.CONVENTION);
       return new PigAggregate(agg.getCluster(), traitSet, agg.getInput(),
-          agg.indicator, agg.getGroupSet(), agg.getGroupSets(), agg.getAggCallList());
+          agg.getGroupSet(), agg.getGroupSets(), agg.getAggCallList());
     }
   }