You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by da...@apache.org on 2020/01/13 04:31:17 UTC

[calcite] branch master updated: [CALCITE-3723] Following the change to add hints to RelNode, deprecate the old constructors

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

danny0405 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 5cfd8c3  [CALCITE-3723] Following the change to add hints to RelNode, deprecate the old constructors
5cfd8c3 is described below

commit 5cfd8c31cea1bf5411e503b15714cab5fc1c0d0a
Author: yuzhao.cyz <yu...@gmail.com>
AuthorDate: Mon Jan 13 11:31:19 2020 +0800

    [CALCITE-3723] Following the change to add hints to RelNode, deprecate the old constructors
    
    Constructors for `Project`, `TableScan`, `Calc`, `Aggregate` and `Join`
    introduce new parameter named "hints" which is a breaking change.
---
 .../adapter/cassandra/CassandraProject.java        |  4 +++-
 .../adapter/cassandra/CassandraTableScan.java      |  4 +++-
 .../adapter/enumerable/EnumerableAggregate.java    |  2 +-
 .../enumerable/EnumerableBatchNestedLoopJoin.java  |  2 +-
 .../calcite/adapter/enumerable/EnumerableCalc.java |  2 +-
 .../adapter/enumerable/EnumerableHashJoin.java     |  1 +
 .../adapter/enumerable/EnumerableMergeJoin.java    |  2 +-
 .../enumerable/EnumerableNestedLoopJoin.java       |  2 +-
 .../adapter/enumerable/EnumerableProject.java      |  4 +++-
 .../adapter/enumerable/EnumerableTableScan.java    |  2 +-
 .../org/apache/calcite/adapter/jdbc/JdbcRules.java |  6 ++---
 .../apache/calcite/adapter/jdbc/JdbcTableScan.java |  2 +-
 .../org/apache/calcite/interpreter/Bindables.java  |  9 ++++----
 .../org/apache/calcite/rel/core/Aggregate.java     | 16 ++-----------
 .../java/org/apache/calcite/rel/core/Calc.java     | 14 +++--------
 .../java/org/apache/calcite/rel/core/EquiJoin.java |  6 +++--
 .../java/org/apache/calcite/rel/core/Join.java     | 27 +++-------------------
 .../java/org/apache/calcite/rel/core/Project.java  | 16 ++++---------
 .../org/apache/calcite/rel/core/TableScan.java     |  5 ++--
 .../java/org/apache/calcite/rel/hint/Hintable.java | 24 +++++++++----------
 .../calcite/rel/logical/LogicalAggregate.java      | 25 ++++++--------------
 .../apache/calcite/rel/logical/LogicalCalc.java    | 10 ++++----
 .../apache/calcite/rel/logical/LogicalJoin.java    | 16 ++++++-------
 .../apache/calcite/rel/logical/LogicalProject.java | 23 ++++++------------
 .../calcite/rel/logical/LogicalTableScan.java      | 10 +++-----
 .../rel/rules/ProjectWindowTransposeRule.java      |  4 +++-
 .../org/apache/calcite/schema/impl/StarTable.java  |  2 +-
 .../calcite/plan/volcano/TraitPropagationTest.java |  6 ++---
 .../org/apache/calcite/test/RelOptRulesTest.java   |  2 +-
 .../java/org/apache/calcite/tools/PlannerTest.java |  2 +-
 .../elasticsearch/ElasticsearchAggregate.java      |  3 ++-
 .../elasticsearch/ElasticsearchProject.java        |  4 +++-
 .../elasticsearch/ElasticsearchTableScan.java      |  4 +++-
 .../apache/calcite/adapter/csv/CsvTableScan.java   |  4 +++-
 .../apache/calcite/adapter/file/FileTableScan.java |  4 +++-
 .../calcite/adapter/geode/rel/GeodeAggregate.java  |  3 ++-
 .../calcite/adapter/geode/rel/GeodeProject.java    |  4 +++-
 .../calcite/adapter/geode/rel/GeodeTableScan.java  |  4 +++-
 .../calcite/adapter/mongodb/MongoAggregate.java    |  4 +++-
 .../calcite/adapter/mongodb/MongoProject.java      |  4 +++-
 .../calcite/adapter/mongodb/MongoTableScan.java    |  4 +++-
 .../apache/calcite/adapter/pig/PigAggregate.java   |  4 +++-
 .../org/apache/calcite/adapter/pig/PigJoin.java    |  7 ++++--
 .../org/apache/calcite/adapter/pig/PigProject.java |  4 +++-
 .../apache/calcite/adapter/pig/PigTableScan.java   |  4 +++-
 site/_docs/history.md                              |  8 +++++++
 .../calcite/adapter/splunk/SplunkTableScan.java    |  2 ++
 47 files changed, 149 insertions(+), 172 deletions(-)

diff --git a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraProject.java b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraProject.java
index 92c9c8d..ca2367f 100644
--- a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraProject.java
+++ b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraProject.java
@@ -28,6 +28,8 @@ import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.util.Pair;
 
+import com.google.common.collect.ImmutableList;
+
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -39,7 +41,7 @@ import java.util.Map;
 public class CassandraProject extends Project implements CassandraRel {
   public CassandraProject(RelOptCluster cluster, RelTraitSet traitSet,
       RelNode input, List<? extends RexNode> projects, RelDataType rowType) {
-    super(cluster, traitSet, input, projects, rowType);
+    super(cluster, traitSet, ImmutableList.of(), input, projects, rowType);
     assert getConvention() == CassandraRel.CONVENTION;
     assert getConvention() == input.getConvention();
   }
diff --git a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraTableScan.java b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraTableScan.java
index 5956cca..f8f45c4 100644
--- a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraTableScan.java
+++ b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraTableScan.java
@@ -25,6 +25,8 @@ import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.core.TableScan;
 import org.apache.calcite.rel.type.RelDataType;
 
+import com.google.common.collect.ImmutableList;
+
 import java.util.List;
 
 /**
@@ -45,7 +47,7 @@ public class CassandraTableScan extends TableScan implements CassandraRel {
    */
   protected CassandraTableScan(RelOptCluster cluster, RelTraitSet traitSet,
       RelOptTable table, CassandraTable cassandraTable, RelDataType projectRowType) {
-    super(cluster, traitSet, table);
+    super(cluster, traitSet, ImmutableList.of(), table);
     this.cassandraTable = cassandraTable;
     this.projectRowType = projectRowType;
 
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 5c68a9b..a0dee72 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
@@ -66,7 +66,7 @@ public class EnumerableAggregate extends Aggregate implements EnumerableRel {
       List<ImmutableBitSet> groupSets,
       List<AggregateCall> aggCalls)
       throws InvalidRelException {
-    super(cluster, traitSet, input, groupSet, groupSets, aggCalls);
+    super(cluster, traitSet, ImmutableList.of(), input, groupSet, groupSets, aggCalls);
     assert getConvention() instanceof EnumerableConvention;
 
     for (AggregateCall aggCall : aggCalls) {
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBatchNestedLoopJoin.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBatchNestedLoopJoin.java
index 382fd11..13ff1e1 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBatchNestedLoopJoin.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBatchNestedLoopJoin.java
@@ -60,7 +60,7 @@ public class EnumerableBatchNestedLoopJoin extends Join implements EnumerableRel
       Set<CorrelationId> variablesSet,
       ImmutableBitSet requiredColumns,
       JoinRelType joinType) {
-    super(cluster, traits, left, right, condition, variablesSet, joinType);
+    super(cluster, traits, ImmutableList.of(), left, right, condition, variablesSet, joinType);
     this.requiredColumns = requiredColumns;
   }
 
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCalc.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCalc.java
index d86c441..4a392ff 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCalc.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCalc.java
@@ -71,7 +71,7 @@ public class EnumerableCalc extends Calc implements EnumerableRel {
       RelTraitSet traitSet,
       RelNode input,
       RexProgram program) {
-    super(cluster, traitSet, input, program);
+    super(cluster, traitSet, ImmutableList.of(), input, program);
     assert getConvention() instanceof EnumerableConvention;
     assert !program.containsAggs();
   }
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableHashJoin.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableHashJoin.java
index 36004e8..a7a8ede 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableHashJoin.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableHashJoin.java
@@ -60,6 +60,7 @@ public class EnumerableHashJoin extends Join implements EnumerableRel {
     super(
         cluster,
         traits,
+        ImmutableList.of(),
         left,
         right,
         condition,
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoin.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoin.java
index 72b2d8a..6961773 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoin.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoin.java
@@ -61,7 +61,7 @@ public class EnumerableMergeJoin extends Join implements EnumerableRel {
       RexNode condition,
       Set<CorrelationId> variablesSet,
       JoinRelType joinType) {
-    super(cluster, traits, left, right, condition, variablesSet, joinType);
+    super(cluster, traits, ImmutableList.of(), left, right, condition, variablesSet, joinType);
     final List<RelCollation> collations =
         traits.getTraits(RelCollationTraitDef.INSTANCE);
     assert collations == null || RelCollations.contains(collations, joinInfo.leftKeys);
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableNestedLoopJoin.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableNestedLoopJoin.java
index 948ebe7..62b25c3 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableNestedLoopJoin.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableNestedLoopJoin.java
@@ -47,7 +47,7 @@ public class EnumerableNestedLoopJoin extends Join implements EnumerableRel {
   protected EnumerableNestedLoopJoin(RelOptCluster cluster, RelTraitSet traits,
       RelNode left, RelNode right, RexNode condition,
       Set<CorrelationId> variablesSet, JoinRelType joinType) {
-    super(cluster, traits, left, right, condition, variablesSet, joinType);
+    super(cluster, traits, ImmutableList.of(), left, right, condition, variablesSet, joinType);
   }
 
   @Deprecated // to be removed before 2.0
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProject.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProject.java
index e4ae1d0..8712f20 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProject.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProject.java
@@ -27,6 +27,8 @@ import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.util.Util;
 
+import com.google.common.collect.ImmutableList;
+
 import java.util.List;
 
 /** Implementation of {@link org.apache.calcite.rel.core.Project} in
@@ -49,7 +51,7 @@ public class EnumerableProject extends Project implements EnumerableRel {
       RelNode input,
       List<? extends RexNode> projects,
       RelDataType rowType) {
-    super(cluster, traitSet, input, projects, rowType);
+    super(cluster, traitSet, ImmutableList.of(), input, projects, rowType);
     assert getConvention() instanceof EnumerableConvention;
   }
 
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableScan.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableScan.java
index cb10d91..703fbe1 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableScan.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableScan.java
@@ -66,7 +66,7 @@ public class EnumerableTableScan
    * <p>Use {@link #create} unless you know what you are doing. */
   public EnumerableTableScan(RelOptCluster cluster, RelTraitSet traitSet,
       RelOptTable table, Class elementType) {
-    super(cluster, traitSet, table);
+    super(cluster, traitSet, ImmutableList.of(), table);
     assert getConvention() instanceof EnumerableConvention;
     this.elementType = elementType;
     assert canHandle(table)
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 7a0ac40..52525c0 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
@@ -376,7 +376,7 @@ public class JdbcRules {
         RelNode left, RelNode right, RexNode condition,
         Set<CorrelationId> variablesSet, JoinRelType joinType)
         throws InvalidRelException {
-      super(cluster, traitSet, left, right, condition, variablesSet, joinType);
+      super(cluster, traitSet, ImmutableList.of(), left, right, condition, variablesSet, joinType);
     }
 
     @Deprecated // to be removed before 2.0
@@ -557,7 +557,7 @@ public class JdbcRules {
         RelNode input,
         List<? extends RexNode> projects,
         RelDataType rowType) {
-      super(cluster, traitSet, input, projects, rowType);
+      super(cluster, traitSet, ImmutableList.of(), input, projects, rowType);
       assert getConvention() instanceof JdbcConvention;
     }
 
@@ -695,7 +695,7 @@ public class JdbcRules {
         List<ImmutableBitSet> groupSets,
         List<AggregateCall> aggCalls)
         throws InvalidRelException {
-      super(cluster, traitSet, input, groupSet, groupSets, aggCalls);
+      super(cluster, traitSet, ImmutableList.of(), input, groupSet, groupSets, aggCalls);
       assert getConvention() instanceof JdbcConvention;
       assert this.groupSets.size() == 1 : "Grouping sets not supported";
       final SqlDialect dialect = ((JdbcConvention) getConvention()).dialect;
diff --git a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcTableScan.java b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcTableScan.java
index 55f87d6..a138089 100644
--- a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcTableScan.java
+++ b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcTableScan.java
@@ -38,7 +38,7 @@ public class JdbcTableScan extends TableScan implements JdbcRel {
       RelOptTable table,
       JdbcTable jdbcTable,
       JdbcConvention jdbcConvention) {
-    super(cluster, cluster.traitSetOf(jdbcConvention), table);
+    super(cluster, cluster.traitSetOf(jdbcConvention), ImmutableList.of(), table);
     this.jdbcTable = Objects.requireNonNull(jdbcTable);
   }
 
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 8444b4b..50007d4 100644
--- a/core/src/main/java/org/apache/calcite/interpreter/Bindables.java
+++ b/core/src/main/java/org/apache/calcite/interpreter/Bindables.java
@@ -181,7 +181,7 @@ public class Bindables {
     BindableTableScan(RelOptCluster cluster, RelTraitSet traitSet,
         RelOptTable table, ImmutableList<RexNode> filters,
         ImmutableIntList projects) {
-      super(cluster, traitSet, table);
+      super(cluster, traitSet, ImmutableList.of(), table);
       this.filters = Objects.requireNonNull(filters);
       this.projects = Objects.requireNonNull(projects);
       Preconditions.checkArgument(canHandle(table));
@@ -369,7 +369,7 @@ public class Bindables {
   public static class BindableProject extends Project implements BindableRel {
     public BindableProject(RelOptCluster cluster, RelTraitSet traitSet,
         RelNode input, List<? extends RexNode> projects, RelDataType rowType) {
-      super(cluster, traitSet, input, projects, rowType);
+      super(cluster, traitSet, ImmutableList.of(), input, projects, rowType);
       assert getConvention() instanceof BindableConvention;
     }
 
@@ -487,7 +487,8 @@ public class Bindables {
     protected BindableJoin(RelOptCluster cluster, RelTraitSet traitSet,
         RelNode left, RelNode right, RexNode condition,
         Set<CorrelationId> variablesSet, JoinRelType joinType) {
-      super(cluster, traitSet, left, right, condition, variablesSet, joinType);
+      super(cluster, traitSet, ImmutableList.of(), left, right,
+          condition, variablesSet, joinType);
     }
 
     @Deprecated // to be removed before 2.0
@@ -630,7 +631,7 @@ public class Bindables {
         List<ImmutableBitSet> groupSets,
         List<AggregateCall> aggCalls)
         throws InvalidRelException {
-      super(cluster, traitSet, input, groupSet, groupSets, aggCalls);
+      super(cluster, traitSet, ImmutableList.of(), input, groupSet, groupSets, aggCalls);
       assert getConvention() instanceof BindableConvention;
 
       for (AggregateCall aggCall : aggCalls) {
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 5bf9566..82de9fc 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
@@ -171,16 +171,7 @@ public abstract class Aggregate extends SingleRel implements Hintable {
     }
   }
 
-  /**
-   * Create an Aggregate.
-   *
-   * @param cluster  Cluster
-   * @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
-   */
+  @Deprecated // to be removed before 2.0
   protected Aggregate(
       RelOptCluster cluster,
       RelTraitSet traitSet,
@@ -191,9 +182,6 @@ public abstract class Aggregate extends SingleRel implements Hintable {
     this(cluster, traitSet, new ArrayList<>(), input, groupSet, groupSets, aggCalls);
   }
 
-  /**
-   * Creates an Aggregate.
-   */
   @Deprecated // to be removed before 2.0
   protected Aggregate(
       RelOptCluster cluster,
@@ -203,7 +191,7 @@ public abstract class Aggregate extends SingleRel implements Hintable {
       ImmutableBitSet groupSet,
       List<ImmutableBitSet> groupSets,
       List<AggregateCall> aggCalls) {
-    this(cluster, traits, new ArrayList<>(), child, groupSet, groupSets, aggCalls);
+    this(cluster, traits, ImmutableList.of(), child, groupSet, groupSets, aggCalls);
     checkIndicator(indicator);
   }
 
diff --git a/core/src/main/java/org/apache/calcite/rel/core/Calc.java b/core/src/main/java/org/apache/calcite/rel/core/Calc.java
index d68dbfe..8b2b738 100644
--- a/core/src/main/java/org/apache/calcite/rel/core/Calc.java
+++ b/core/src/main/java/org/apache/calcite/rel/core/Calc.java
@@ -42,7 +42,6 @@ import org.apache.calcite.util.Util;
 
 import com.google.common.collect.ImmutableList;
 
-import java.util.Collections;
 import java.util.List;
 
 /**
@@ -79,20 +78,13 @@ public abstract class Calc extends SingleRel implements Hintable {
     assert isValid(Litmus.THROW, null);
   }
 
-  /**
-   * Creates a Calc.
-   *
-   * @param cluster Cluster
-   * @param traits Traits
-   * @param child Input relation
-   * @param program Calc program
-   */
+  @Deprecated // to be removed before 2.0
   protected Calc(
       RelOptCluster cluster,
       RelTraitSet traits,
       RelNode child,
       RexProgram program) {
-    this(cluster, traits, Collections.emptyList(), child, program);
+    this(cluster, traits, ImmutableList.of(), child, program);
   }
 
   @Deprecated // to be removed before 2.0
@@ -102,7 +94,7 @@ public abstract class Calc extends SingleRel implements Hintable {
       RelNode child,
       RexProgram program,
       List<RelCollation> collationList) {
-    this(cluster, traits, child, program);
+    this(cluster, traits, ImmutableList.of(), child, program);
     Util.discard(collationList);
   }
 
diff --git a/core/src/main/java/org/apache/calcite/rel/core/EquiJoin.java b/core/src/main/java/org/apache/calcite/rel/core/EquiJoin.java
index dfb0842..e0d63c2 100644
--- a/core/src/main/java/org/apache/calcite/rel/core/EquiJoin.java
+++ b/core/src/main/java/org/apache/calcite/rel/core/EquiJoin.java
@@ -22,6 +22,8 @@ import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.util.ImmutableIntList;
 
+import com.google.common.collect.ImmutableList;
+
 import java.util.Objects;
 import java.util.Set;
 
@@ -52,7 +54,7 @@ public abstract class EquiJoin extends Join {
   public EquiJoin(RelOptCluster cluster, RelTraitSet traits, RelNode left,
       RelNode right, RexNode condition, Set<CorrelationId> variablesSet,
       JoinRelType joinType) {
-    super(cluster, traits, left, right, condition, variablesSet, joinType);
+    super(cluster, traits, ImmutableList.of(), left, right, condition, variablesSet, joinType);
     this.leftKeys = Objects.requireNonNull(joinInfo.leftKeys);
     this.rightKeys = Objects.requireNonNull(joinInfo.rightKeys);
     assert joinInfo.isEqui() : "Create EquiJoin with non-equi join condition.";
@@ -64,7 +66,7 @@ public abstract class EquiJoin extends Join {
       RelNode right, RexNode condition, ImmutableIntList leftKeys,
       ImmutableIntList rightKeys, Set<CorrelationId> variablesSet,
       JoinRelType joinType) {
-    super(cluster, traits, left, right, condition, variablesSet, joinType);
+    super(cluster, traits, ImmutableList.of(), left, right, condition, variablesSet, joinType);
     this.leftKeys = Objects.requireNonNull(leftKeys);
     this.rightKeys = Objects.requireNonNull(rightKeys);
   }
diff --git a/core/src/main/java/org/apache/calcite/rel/core/Join.java b/core/src/main/java/org/apache/calcite/rel/core/Join.java
index f5d9644..5d615a8 100644
--- a/core/src/main/java/org/apache/calcite/rel/core/Join.java
+++ b/core/src/main/java/org/apache/calcite/rel/core/Join.java
@@ -41,7 +41,6 @@ import org.apache.calcite.util.Util;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
@@ -116,32 +115,12 @@ public abstract class Join extends BiRel implements Hintable {
     this.hints = ImmutableList.copyOf(hints);
   }
 
-  /**
-   * Creates a Join.
-   *
-   * <p>Note: We plan to change the {@code variablesStopped} parameter to
-   * {@code Set&lt;CorrelationId&gt; variablesSet}
-   * {@link org.apache.calcite.util.Bug#upgrade(String) before version 2.0},
-   * because {@link #getVariablesSet()}
-   * is preferred over {@link #getVariablesStopped()}.
-   * This constructor is not deprecated, for now, because maintaining overloaded
-   * constructors in multiple sub-classes would be onerous.
-   *
-   * @param cluster          Cluster
-   * @param traitSet         Trait set
-   * @param left             Left input
-   * @param right            Right input
-   * @param condition        Join condition
-   * @param joinType         Join type
-   * @param variablesSet     Set variables that are set by the
-   *                         LHS and used by the RHS and are not available to
-   *                         nodes above this Join in the tree
-   */
+  @Deprecated // to be removed before 2.0
   protected Join(
       RelOptCluster cluster, RelTraitSet traitSet, RelNode left,
       RelNode right, RexNode condition, Set<CorrelationId> variablesSet,
       JoinRelType joinType) {
-    this(cluster, traitSet, new ArrayList<>(), left, right,
+    this(cluster, traitSet, ImmutableList.of(), left, right,
         condition, variablesSet, joinType);
   }
 
@@ -154,7 +133,7 @@ public abstract class Join extends BiRel implements Hintable {
       RexNode condition,
       JoinRelType joinType,
       Set<String> variablesStopped) {
-    this(cluster, traitSet, left, right, condition,
+    this(cluster, traitSet, ImmutableList.of(), left, right, condition,
         CorrelationId.setOf(variablesStopped), joinType);
   }
 
diff --git a/core/src/main/java/org/apache/calcite/rel/core/Project.java b/core/src/main/java/org/apache/calcite/rel/core/Project.java
index 909b34f..d655367 100644
--- a/core/src/main/java/org/apache/calcite/rel/core/Project.java
+++ b/core/src/main/java/org/apache/calcite/rel/core/Project.java
@@ -46,7 +46,6 @@ import org.apache.calcite.util.mapping.Mappings;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 
-import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -91,24 +90,16 @@ public abstract class Project extends SingleRel implements Hintable {
     assert isValid(Litmus.THROW, null);
   }
 
-  /**
-   * Creates a Project.
-   *
-   * @param cluster  Cluster that this relational expression belongs to
-   * @param traits   Traits of this relational expression
-   * @param input    Input relational expression
-   * @param projects List of expressions for the input columns
-   * @param rowType  Output row type
-   */
+  @Deprecated // to be removed before 2.0
   protected Project(RelOptCluster cluster, RelTraitSet traits,
       RelNode input, List<? extends RexNode> projects, RelDataType rowType) {
-    this(cluster, traits, new ArrayList<>(), input, projects, rowType);
+    this(cluster, traits, ImmutableList.of(), input, projects, rowType);
   }
 
   @Deprecated // to be removed before 2.0
   protected Project(RelOptCluster cluster, RelTraitSet traitSet, RelNode input,
       List<? extends RexNode> projects, RelDataType rowType, int flags) {
-    this(cluster, traitSet, input, projects, rowType);
+    this(cluster, traitSet, ImmutableList.of(), input, projects, rowType);
     Util.discard(flags);
   }
 
@@ -118,6 +109,7 @@ public abstract class Project extends SingleRel implements Hintable {
   protected Project(RelInput input) {
     this(input.getCluster(),
         input.getTraitSet(),
+        ImmutableList.of(),
         input.getInput(),
         input.getExpressionList("exprs"),
         input.getRowType("exprs", "fields"));
diff --git a/core/src/main/java/org/apache/calcite/rel/core/TableScan.java b/core/src/main/java/org/apache/calcite/rel/core/TableScan.java
index 6e0506b..f4701d1 100644
--- a/core/src/main/java/org/apache/calcite/rel/core/TableScan.java
+++ b/core/src/main/java/org/apache/calcite/rel/core/TableScan.java
@@ -73,16 +73,17 @@ public abstract class TableScan
     this.hints = ImmutableList.copyOf(hints);
   }
 
+  @Deprecated // to be removed before 2.0
   protected TableScan(RelOptCluster cluster, RelTraitSet traitSet,
       RelOptTable table) {
-    this(cluster, traitSet, new ArrayList<>(), table);
+    this(cluster, traitSet, ImmutableList.of(), table);
   }
 
   /**
    * Creates a TableScan by parsing serialized output.
    */
   protected TableScan(RelInput input) {
-    this(input.getCluster(), input.getTraitSet(), input.getTable("table"));
+    this(input.getCluster(), input.getTraitSet(), ImmutableList.of(), input.getTable("table"));
   }
 
   //~ Methods ----------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/hint/Hintable.java b/core/src/main/java/org/apache/calcite/rel/hint/Hintable.java
index 5e307ed..25344f7 100644
--- a/core/src/main/java/org/apache/calcite/rel/hint/Hintable.java
+++ b/core/src/main/java/org/apache/calcite/rel/hint/Hintable.java
@@ -28,17 +28,15 @@ import java.util.Objects;
 import java.util.Set;
 
 /**
- * Base class for relational expressions with {@link RelHint}s.
+ * {@link Hintable} is a kind of {@link RelNode} that can attach {@link RelHint}s.
  *
- * <p>Relational expressions that can attach hints should implement
- * this interface.
+ * <p>This interface is experimental, currently, {@link RelNode}s that implement it
+ * have a constructor parameter named "hints" used to construct relational expression
+ * with given attached hints.
  *
- * <p>This interface is experimental, currently, we make some {@link RelNode}s
- * implement this interface and add an argument named "hints" to construct these
- * relational expressions if hints are attached.
- *
- * <p>This design is not that elegant and mature, because we have to copy the hints whenever these
- * relational expressions are copied or used to derive new relational expressions.
+ * <p>Current design is not that elegant and mature, because we have to
+ * copy the hints whenever these relational expressions are copied or used to
+ * derive new relational expressions.
  * Even though we have implemented the mechanism to propagate the hints, for large queries,
  * there would be many cases where the hints are not copied to the right RelNode,
  * and the effort/memory is wasted if we are copying the hint to a RelNode
@@ -48,9 +46,9 @@ import java.util.Set;
 public interface Hintable {
 
   /**
-   * Attaches list of hints to this relational expression, should be overridden by
-   * every logical node that supports hint. This method is only for
-   * internal use during sql-to-rel conversion.
+   * Attaches list of hints to this relational expression.
+   *
+   * <p>This method is only for internal use during sql-to-rel conversion.
    *
    * <p>Sub-class should return a new copy of the relational expression.
    *
@@ -69,7 +67,7 @@ public interface Hintable {
   }
 
   /**
-   * Returns a new relation expression with the specified hints {@code hintList}.
+   * Returns a new relational expression with the specified hints {@code hintList}.
    *
    * <p>This method should be overridden by every logical node that supports hint.
    * It is only for internal use during decorrelation.
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 6824ccf..3da516b 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
@@ -27,7 +27,8 @@ import org.apache.calcite.rel.core.AggregateCall;
 import org.apache.calcite.rel.hint.RelHint;
 import org.apache.calcite.util.ImmutableBitSet;
 
-import java.util.ArrayList;
+import com.google.common.collect.ImmutableList;
+
 import java.util.List;
 
 /**
@@ -69,19 +70,7 @@ public final class LogicalAggregate extends Aggregate {
     super(cluster, traitSet, hints, input, groupSet, groupSets, aggCalls);
   }
 
-
-  /**
-   * Creates a LogicalAggregate.
-   *
-   * <p>Use {@link #create} unless you know what you're doing.
-   *
-   * @param cluster    Cluster that this relational expression belongs to
-   * @param traitSet   Traits
-   * @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
-   */
+  @Deprecated // to be removed before 2.0
   public LogicalAggregate(
       RelOptCluster cluster,
       RelTraitSet traitSet,
@@ -89,14 +78,14 @@ public final class LogicalAggregate extends Aggregate {
       ImmutableBitSet groupSet,
       List<ImmutableBitSet> groupSets,
       List<AggregateCall> aggCalls) {
-    this(cluster, traitSet, new ArrayList<>(), input, groupSet, groupSets, aggCalls);
+    this(cluster, traitSet, ImmutableList.of(), input, groupSet, groupSets, aggCalls);
   }
 
   @Deprecated // to be removed before 2.0
   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);
+    super(cluster, traitSet, ImmutableList.of(), input, groupSet, groupSets, aggCalls);
     checkIndicator(indicator);
   }
 
@@ -104,7 +93,7 @@ public final class LogicalAggregate extends Aggregate {
   public LogicalAggregate(RelOptCluster cluster,
       RelNode input, boolean indicator, ImmutableBitSet groupSet,
       List<ImmutableBitSet> groupSets, List<AggregateCall> aggCalls) {
-    super(cluster, cluster.traitSetOf(Convention.NONE), input, groupSet,
+    super(cluster, cluster.traitSetOf(Convention.NONE), ImmutableList.of(), input, groupSet,
         groupSets, aggCalls);
     checkIndicator(indicator);
   }
@@ -139,7 +128,7 @@ public final class LogicalAggregate extends Aggregate {
       List<AggregateCall> aggCalls) {
     final RelOptCluster cluster = input.getCluster();
     final RelTraitSet traitSet = cluster.traitSetOf(Convention.NONE);
-    return new LogicalAggregate(cluster, traitSet, input, groupSet,
+    return new LogicalAggregate(cluster, traitSet, ImmutableList.of(), input, groupSet,
         groupSets, aggCalls);
   }
 
diff --git a/core/src/main/java/org/apache/calcite/rel/logical/LogicalCalc.java b/core/src/main/java/org/apache/calcite/rel/logical/LogicalCalc.java
index 126a86b..05a0b4e 100644
--- a/core/src/main/java/org/apache/calcite/rel/logical/LogicalCalc.java
+++ b/core/src/main/java/org/apache/calcite/rel/logical/LogicalCalc.java
@@ -39,7 +39,6 @@ import org.apache.calcite.util.Util;
 
 import com.google.common.collect.ImmutableList;
 
-import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
@@ -80,13 +79,13 @@ public final class LogicalCalc extends Calc {
     super(cluster, traitSet, hints, child, program);
   }
 
-  /** Creates a LogicalCalc. */
+  @Deprecated // to be removed before 2.0
   public LogicalCalc(
       RelOptCluster cluster,
       RelTraitSet traitSet,
       RelNode child,
       RexProgram program) {
-    this(cluster, traitSet, Collections.emptyList(), child, program);
+    this(cluster, traitSet, ImmutableList.of(), child, program);
   }
 
   /**
@@ -95,6 +94,7 @@ public final class LogicalCalc extends Calc {
   public LogicalCalc(RelInput input) {
     this(input.getCluster(),
         input.getTraitSet(),
+        ImmutableList.of(),
         input.getInput(),
         RexProgram.create(input));
   }
@@ -106,7 +106,7 @@ public final class LogicalCalc extends Calc {
       RelNode child,
       RexProgram program,
       List<RelCollation> collationList) {
-    this(cluster, traitSet, child, program);
+    this(cluster, traitSet, ImmutableList.of(), child, program);
     Util.discard(collationList);
   }
 
@@ -120,7 +120,7 @@ public final class LogicalCalc extends Calc {
             () -> RelMdCollation.calc(mq, input, program))
         .replaceIf(RelDistributionTraitDef.INSTANCE,
             () -> RelMdDistribution.calc(mq, input, program));
-    return new LogicalCalc(cluster, traitSet, input, program);
+    return new LogicalCalc(cluster, traitSet, ImmutableList.of(), input, program);
   }
 
   //~ Methods ----------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/logical/LogicalJoin.java b/core/src/main/java/org/apache/calcite/rel/logical/LogicalJoin.java
index a1cea2d..a3fb061 100644
--- a/core/src/main/java/org/apache/calcite/rel/logical/LogicalJoin.java
+++ b/core/src/main/java/org/apache/calcite/rel/logical/LogicalJoin.java
@@ -109,7 +109,7 @@ public final class LogicalJoin extends Join {
       RelNode left, RelNode right, RexNode condition, Set<CorrelationId> variablesSet,
       JoinRelType joinType, boolean semiJoinDone,
       ImmutableList<RelDataTypeField> systemFieldList) {
-    this(cluster, traitSet, new ArrayList<>(), left, right, condition,
+    this(cluster, traitSet, ImmutableList.of(), left, right, condition,
         variablesSet, joinType, semiJoinDone, systemFieldList);
   }
 
@@ -118,7 +118,7 @@ public final class LogicalJoin extends Join {
       RelNode right, RexNode condition, JoinRelType joinType,
       Set<String> variablesStopped, boolean semiJoinDone,
       ImmutableList<RelDataTypeField> systemFieldList) {
-    this(cluster, traitSet, left, right, condition,
+    this(cluster, traitSet, ImmutableList.of(), left, right, condition,
         CorrelationId.setOf(variablesStopped), joinType, semiJoinDone,
         systemFieldList);
   }
@@ -126,18 +126,18 @@ public final class LogicalJoin extends Join {
   @Deprecated // to be removed before 2.0
   public LogicalJoin(RelOptCluster cluster, RelNode left, RelNode right,
       RexNode condition, JoinRelType joinType, Set<String> variablesStopped) {
-    this(cluster, cluster.traitSetOf(Convention.NONE), left, right, condition,
-        CorrelationId.setOf(variablesStopped), joinType, false,
-        ImmutableList.of());
+    this(cluster, cluster.traitSetOf(Convention.NONE), ImmutableList.of(),
+        left, right, condition, CorrelationId.setOf(variablesStopped),
+        joinType, false, ImmutableList.of());
   }
 
   @Deprecated // to be removed before 2.0
   public LogicalJoin(RelOptCluster cluster, RelNode left, RelNode right,
       RexNode condition, JoinRelType joinType, Set<String> variablesStopped,
       boolean semiJoinDone, ImmutableList<RelDataTypeField> systemFieldList) {
-    this(cluster, cluster.traitSetOf(Convention.NONE), left, right, condition,
-        CorrelationId.setOf(variablesStopped), joinType, semiJoinDone,
-        systemFieldList);
+    this(cluster, cluster.traitSetOf(Convention.NONE), ImmutableList.of(),
+        left, right, condition, CorrelationId.setOf(variablesStopped), joinType,
+        semiJoinDone, systemFieldList);
   }
 
   /**
diff --git a/core/src/main/java/org/apache/calcite/rel/logical/LogicalProject.java b/core/src/main/java/org/apache/calcite/rel/logical/LogicalProject.java
index 95515e3..c5baecb 100644
--- a/core/src/main/java/org/apache/calcite/rel/logical/LogicalProject.java
+++ b/core/src/main/java/org/apache/calcite/rel/logical/LogicalProject.java
@@ -34,7 +34,8 @@ import org.apache.calcite.rex.RexUtil;
 import org.apache.calcite.sql.validate.SqlValidatorUtil;
 import org.apache.calcite.util.Util;
 
-import java.util.ArrayList;
+import com.google.common.collect.ImmutableList;
+
 import java.util.List;
 
 /**
@@ -67,27 +68,17 @@ public final class LogicalProject extends Project {
     assert traitSet.containsIfApplicable(Convention.NONE);
   }
 
-  /**
-   * Creates a LogicalProject.
-   *
-   * <p>Use {@link #create} unless you know what you're doing.
-   *
-   * @param cluster  Cluster this relational expression belongs to
-   * @param traitSet Traits of this relational expression
-   * @param input    Input relational expression
-   * @param projects List of expressions for the input columns
-   * @param rowType  Output row type
-   */
+  @Deprecated // to be removed before 2.0
   public LogicalProject(RelOptCluster cluster, RelTraitSet traitSet,
       RelNode input, List<? extends RexNode> projects, RelDataType rowType) {
-    this(cluster, traitSet, new ArrayList<>(), input, projects, rowType);
+    this(cluster, traitSet, ImmutableList.of(), input, projects, rowType);
   }
 
   @Deprecated // to be removed before 2.0
   public LogicalProject(RelOptCluster cluster, RelTraitSet traitSet,
       RelNode input, List<? extends RexNode> projects, RelDataType rowType,
       int flags) {
-    this(cluster, traitSet, input, projects, rowType);
+    this(cluster, traitSet, ImmutableList.of(), input, projects, rowType);
     Util.discard(flags);
   }
 
@@ -95,7 +86,7 @@ public final class LogicalProject extends Project {
   public LogicalProject(RelOptCluster cluster, RelNode input,
       List<RexNode> projects, List<String> fieldNames, int flags) {
     this(cluster, cluster.traitSetOf(RelCollations.EMPTY),
-        input, projects,
+        ImmutableList.of(), input, projects,
         RexUtil.createStructType(cluster.getTypeFactory(), projects,
             fieldNames, null));
     Util.discard(flags);
@@ -129,7 +120,7 @@ public final class LogicalProject extends Project {
         cluster.traitSet().replace(Convention.NONE)
             .replaceIfs(RelCollationTraitDef.INSTANCE,
                 () -> RelMdCollation.project(mq, input, projects));
-    return new LogicalProject(cluster, traitSet, input, projects, rowType);
+    return new LogicalProject(cluster, traitSet, ImmutableList.of(), input, projects, rowType);
   }
 
   @Override public LogicalProject copy(RelTraitSet traitSet, RelNode input,
diff --git a/core/src/main/java/org/apache/calcite/rel/logical/LogicalTableScan.java b/core/src/main/java/org/apache/calcite/rel/logical/LogicalTableScan.java
index 3b030fe..8876e01 100644
--- a/core/src/main/java/org/apache/calcite/rel/logical/LogicalTableScan.java
+++ b/core/src/main/java/org/apache/calcite/rel/logical/LogicalTableScan.java
@@ -71,19 +71,15 @@ public final class LogicalTableScan extends TableScan {
     super(cluster, traitSet, hints, table);
   }
 
-  /**
-   * Creates a LogicalTableScan.
-   *
-   * <p>Use {@link #create} unless you know what you're doing.
-   */
+  @Deprecated // to be removed before 2.0
   public LogicalTableScan(RelOptCluster cluster, RelTraitSet traitSet,
       RelOptTable table) {
-    this(cluster, traitSet, new ArrayList<>(), table);
+    this(cluster, traitSet, ImmutableList.of(), table);
   }
 
   @Deprecated // to be removed before 2.0
   public LogicalTableScan(RelOptCluster cluster, RelOptTable table) {
-    this(cluster, cluster.traitSetOf(Convention.NONE), table);
+    this(cluster, cluster.traitSetOf(Convention.NONE), ImmutableList.of(), table);
   }
 
   /**
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ProjectWindowTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ProjectWindowTransposeRule.java
index e8dbe63..d9a896c 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectWindowTransposeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectWindowTransposeRule.java
@@ -36,6 +36,8 @@ import org.apache.calcite.tools.RelBuilderFactory;
 import org.apache.calcite.util.BitSets;
 import org.apache.calcite.util.ImmutableBitSet;
 
+import com.google.common.collect.ImmutableList;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -94,7 +96,7 @@ public class ProjectWindowTransposeRule extends RelOptRule {
     }
 
     final LogicalProject projectBelowWindow =
-        new LogicalProject(cluster, window.getTraitSet(),
+        new LogicalProject(cluster, window.getTraitSet(), ImmutableList.of(),
             window.getInput(), exps, builder.build());
 
     // Create a new LogicalWindow with necessary inputs only
diff --git a/core/src/main/java/org/apache/calcite/schema/impl/StarTable.java b/core/src/main/java/org/apache/calcite/schema/impl/StarTable.java
index abd4285..71e4bda 100644
--- a/core/src/main/java/org/apache/calcite/schema/impl/StarTable.java
+++ b/core/src/main/java/org/apache/calcite/schema/impl/StarTable.java
@@ -127,7 +127,7 @@ public class StarTable extends AbstractTable implements TranslatableTable {
    */
   public static class StarTableScan extends TableScan {
     public StarTableScan(RelOptCluster cluster, RelOptTable relOptTable) {
-      super(cluster, cluster.traitSetOf(Convention.NONE), relOptTable);
+      super(cluster, cluster.traitSetOf(Convention.NONE), ImmutableList.of(), relOptTable);
     }
 
     @Override public RelOptCost computeSelfCost(RelOptPlanner planner,
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 9b37513..5394cd0 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
@@ -168,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,
+          cluster.traitSetOf(Convention.NONE), ImmutableList.of(), project,
           ImmutableBitSet.of(0), null, Collections.singletonList(aggCall));
 
       final RelNode rootRel = agg;
@@ -297,7 +297,7 @@ public class TraitPropagationTest {
     PhysAgg(RelOptCluster cluster, RelTraitSet traitSet, RelNode input,
         ImmutableBitSet groupSet,
         List<ImmutableBitSet> groupSets, List<AggregateCall> aggCalls) {
-      super(cluster, traitSet, input, groupSet, groupSets, aggCalls);
+      super(cluster, traitSet, ImmutableList.of(), input, groupSet, groupSets, aggCalls);
     }
 
     public Aggregate copy(RelTraitSet traitSet, RelNode input,
@@ -317,7 +317,7 @@ public class TraitPropagationTest {
   private static class PhysProj extends Project implements Phys {
     PhysProj(RelOptCluster cluster, RelTraitSet traits, RelNode child,
         List<RexNode> exps, RelDataType rowType) {
-      super(cluster, traits, child, exps, rowType);
+      super(cluster, traits, ImmutableList.of(), child, exps, rowType);
     }
 
     public static PhysProj create(final RelNode input,
diff --git a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
index e15dc67..b2e79d2 100644
--- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
@@ -6199,7 +6199,7 @@ public class RelOptRulesTest extends RelOptTestBase {
         RelNode input,
         List<? extends RexNode> projects,
         RelDataType rowType) {
-      super(cluster, traitSet, input, projects, rowType);
+      super(cluster, traitSet, ImmutableList.of(), input, projects, rowType);
     }
 
     public MyProject copy(RelTraitSet traitSet, RelNode input,
diff --git a/core/src/test/java/org/apache/calcite/tools/PlannerTest.java b/core/src/test/java/org/apache/calcite/tools/PlannerTest.java
index 62da6f0..0b8aa3d 100644
--- a/core/src/test/java/org/apache/calcite/tools/PlannerTest.java
+++ b/core/src/test/java/org/apache/calcite/tools/PlannerTest.java
@@ -1243,7 +1243,7 @@ public class PlannerTest {
 
     MockJdbcTableScan(RelOptCluster cluster, RelOptTable table,
         JdbcConvention jdbcConvention) {
-      super(cluster, cluster.traitSetOf(jdbcConvention), table);
+      super(cluster, cluster.traitSetOf(jdbcConvention), ImmutableList.of(), table);
     }
 
     @Override public RelNode copy(RelTraitSet traitSet, List<RelNode> inputs) {
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 24bb74d..079a74d 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
@@ -33,6 +33,7 @@ import org.apache.calcite.util.ImmutableBitSet;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.ImmutableList;
 
 import java.util.ArrayList;
 import java.util.EnumSet;
@@ -58,7 +59,7 @@ public class ElasticsearchAggregate extends Aggregate implements ElasticsearchRe
       ImmutableBitSet groupSet,
       List<ImmutableBitSet> groupSets,
       List<AggregateCall> aggCalls) throws InvalidRelException  {
-    super(cluster, traitSet, input, groupSet, groupSets, aggCalls);
+    super(cluster, traitSet, ImmutableList.of(), input, groupSet, groupSets, aggCalls);
 
     if (getConvention() != input.getConvention()) {
       String message = String.format(Locale.ROOT, "%s != %s", getConvention(),
diff --git a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchProject.java b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchProject.java
index 41d7005..ff723f6 100644
--- a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchProject.java
+++ b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchProject.java
@@ -28,6 +28,8 @@ import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.util.Pair;
 
+import com.google.common.collect.ImmutableList;
+
 import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -39,7 +41,7 @@ import java.util.stream.Collectors;
 public class ElasticsearchProject extends Project implements ElasticsearchRel {
   ElasticsearchProject(RelOptCluster cluster, RelTraitSet traitSet, RelNode input,
       List<? extends RexNode> projects, RelDataType rowType) {
-    super(cluster, traitSet, input, projects, rowType);
+    super(cluster, traitSet, ImmutableList.of(), input, projects, rowType);
     assert getConvention() == ElasticsearchRel.CONVENTION;
     assert getConvention() == input.getConvention();
   }
diff --git a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchTableScan.java b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchTableScan.java
index 413ee0d..8797280 100644
--- a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchTableScan.java
+++ b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchTableScan.java
@@ -28,6 +28,8 @@ import org.apache.calcite.rel.metadata.RelMetadataQuery;
 import org.apache.calcite.rel.rules.AggregateExpandDistinctAggregatesRule;
 import org.apache.calcite.rel.type.RelDataType;
 
+import com.google.common.collect.ImmutableList;
+
 import java.util.List;
 import java.util.Objects;
 
@@ -53,7 +55,7 @@ public class ElasticsearchTableScan extends TableScan implements ElasticsearchRe
   ElasticsearchTableScan(RelOptCluster cluster, RelTraitSet traitSet,
        RelOptTable table, ElasticsearchTable elasticsearchTable,
        RelDataType projectRowType) {
-    super(cluster, traitSet, table);
+    super(cluster, traitSet, ImmutableList.of(), table);
     this.elasticsearchTable = Objects.requireNonNull(elasticsearchTable, "elasticsearchTable");
     this.projectRowType = projectRowType;
 
diff --git a/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvTableScan.java b/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvTableScan.java
index e220563..8208eef 100644
--- a/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvTableScan.java
+++ b/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvTableScan.java
@@ -37,6 +37,8 @@ import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rel.type.RelDataTypeFactory;
 import org.apache.calcite.rel.type.RelDataTypeField;
 
+import com.google.common.collect.ImmutableList;
+
 import java.util.List;
 
 /**
@@ -50,7 +52,7 @@ public class CsvTableScan extends TableScan implements EnumerableRel {
 
   protected CsvTableScan(RelOptCluster cluster, RelOptTable table,
       CsvTranslatableTable csvTable, int[] fields) {
-    super(cluster, cluster.traitSetOf(EnumerableConvention.INSTANCE), table);
+    super(cluster, cluster.traitSetOf(EnumerableConvention.INSTANCE), ImmutableList.of(), table);
     this.csvTable = csvTable;
     this.fields = fields;
 
diff --git a/file/src/main/java/org/apache/calcite/adapter/file/FileTableScan.java b/file/src/main/java/org/apache/calcite/adapter/file/FileTableScan.java
index 495c6f3..7ec4529 100644
--- a/file/src/main/java/org/apache/calcite/adapter/file/FileTableScan.java
+++ b/file/src/main/java/org/apache/calcite/adapter/file/FileTableScan.java
@@ -34,6 +34,8 @@ import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rel.type.RelDataTypeFactory;
 import org.apache.calcite.rel.type.RelDataTypeField;
 
+import com.google.common.collect.ImmutableList;
+
 import java.util.List;
 
 /**
@@ -49,7 +51,7 @@ class FileTableScan extends TableScan implements EnumerableRel {
 
   protected FileTableScan(RelOptCluster cluster, RelOptTable table,
       FileTable webTable, int[] fields) {
-    super(cluster, cluster.traitSetOf(EnumerableConvention.INSTANCE), table);
+    super(cluster, cluster.traitSetOf(EnumerableConvention.INSTANCE), ImmutableList.of(), table);
     this.webTable = webTable;
     this.fields = fields;
 
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 646fb9b..365eeba 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
@@ -29,6 +29,7 @@ import org.apache.calcite.rel.type.RelDataTypeField;
 import org.apache.calcite.util.ImmutableBitSet;
 import org.apache.calcite.util.Util;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableMap.Builder;
 
@@ -49,7 +50,7 @@ public class GeodeAggregate extends Aggregate implements GeodeRel {
       ImmutableBitSet groupSet,
       List<ImmutableBitSet> groupSets,
       List<AggregateCall> aggCalls) {
-    super(cluster, traitSet, input, groupSet, groupSets, aggCalls);
+    super(cluster, traitSet, ImmutableList.of(), input, groupSet, groupSets, aggCalls);
 
     assert getConvention() == GeodeRel.CONVENTION;
     assert getConvention() == this.input.getConvention();
diff --git a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeProject.java b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeProject.java
index d255cb2..de01a6f 100644
--- a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeProject.java
+++ b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeProject.java
@@ -28,6 +28,8 @@ import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.util.Pair;
 
+import com.google.common.collect.ImmutableList;
+
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -41,7 +43,7 @@ public class GeodeProject extends Project implements GeodeRel {
 
   GeodeProject(RelOptCluster cluster, RelTraitSet traitSet,
       RelNode input, List<? extends RexNode> projects, RelDataType rowType) {
-    super(cluster, traitSet, input, projects, rowType);
+    super(cluster, traitSet, ImmutableList.of(), input, projects, rowType);
     assert getConvention() == GeodeRel.CONVENTION;
     assert getConvention() == input.getConvention();
   }
diff --git a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeTableScan.java b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeTableScan.java
index 9e5b06f..4a28e49 100644
--- a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeTableScan.java
+++ b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeTableScan.java
@@ -25,6 +25,8 @@ import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.core.TableScan;
 import org.apache.calcite.rel.type.RelDataType;
 
+import com.google.common.collect.ImmutableList;
+
 import java.util.List;
 
 /**
@@ -46,7 +48,7 @@ public class GeodeTableScan extends TableScan implements GeodeRel {
    */
   GeodeTableScan(RelOptCluster cluster, RelTraitSet traitSet,
       RelOptTable table, GeodeTable geodeTable, RelDataType projectRowType) {
-    super(cluster, traitSet, table);
+    super(cluster, traitSet, ImmutableList.of(), table);
     this.geodeTable = geodeTable;
     this.projectRowType = projectRowType;
 
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 ce25b42..9d7fd8f 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
@@ -29,6 +29,8 @@ import org.apache.calcite.sql.fun.SqlSumEmptyIsZeroAggFunction;
 import org.apache.calcite.util.ImmutableBitSet;
 import org.apache.calcite.util.Util;
 
+import com.google.common.collect.ImmutableList;
+
 import java.util.AbstractList;
 import java.util.ArrayList;
 import java.util.List;
@@ -49,7 +51,7 @@ public class MongoAggregate
       List<ImmutableBitSet> groupSets,
       List<AggregateCall> aggCalls)
       throws InvalidRelException {
-    super(cluster, traitSet, input, groupSet, groupSets, aggCalls);
+    super(cluster, traitSet, ImmutableList.of(), input, groupSet, groupSets, aggCalls);
     assert getConvention() == MongoRel.CONVENTION;
     assert getConvention() == input.getConvention();
 
diff --git a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoProject.java b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoProject.java
index 350bc5e..b465fd5 100644
--- a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoProject.java
+++ b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoProject.java
@@ -29,6 +29,8 @@ import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.util.Pair;
 import org.apache.calcite.util.Util;
 
+import com.google.common.collect.ImmutableList;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -39,7 +41,7 @@ import java.util.List;
 public class MongoProject extends Project implements MongoRel {
   public MongoProject(RelOptCluster cluster, RelTraitSet traitSet,
       RelNode input, List<? extends RexNode> projects, RelDataType rowType) {
-    super(cluster, traitSet, input, projects, rowType);
+    super(cluster, traitSet, ImmutableList.of(), input, projects, rowType);
     assert getConvention() == MongoRel.CONVENTION;
     assert getConvention() == input.getConvention();
   }
diff --git a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoTableScan.java b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoTableScan.java
index 9b155f1..4a6657b 100644
--- a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoTableScan.java
+++ b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoTableScan.java
@@ -27,6 +27,8 @@ import org.apache.calcite.rel.core.TableScan;
 import org.apache.calcite.rel.metadata.RelMetadataQuery;
 import org.apache.calcite.rel.type.RelDataType;
 
+import com.google.common.collect.ImmutableList;
+
 import java.util.List;
 
 /**
@@ -50,7 +52,7 @@ public class MongoTableScan extends TableScan implements MongoRel {
    */
   protected MongoTableScan(RelOptCluster cluster, RelTraitSet traitSet,
       RelOptTable table, MongoTable mongoTable, RelDataType projectRowType) {
-    super(cluster, traitSet, table);
+    super(cluster, traitSet, ImmutableList.of(), table);
     this.mongoTable = mongoTable;
     this.projectRowType = projectRowType;
 
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 ae48eb4..e24f7af 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
@@ -27,6 +27,8 @@ import org.apache.calcite.util.ImmutableBitSet;
 
 import org.apache.pig.scripting.Pig;
 
+import com.google.common.collect.ImmutableList;
+
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -42,7 +44,7 @@ public class PigAggregate extends Aggregate implements PigRel {
   public PigAggregate(RelOptCluster cluster, RelTraitSet traitSet,
       RelNode input, ImmutableBitSet groupSet,
       List<ImmutableBitSet> groupSets, List<AggregateCall> aggCalls) {
-    super(cluster, traitSet, input, groupSet, groupSets, aggCalls);
+    super(cluster, traitSet, ImmutableList.of(), input, groupSet, groupSets, aggCalls);
     assert getConvention() == PigRel.CONVENTION;
   }
 
diff --git a/pig/src/main/java/org/apache/calcite/adapter/pig/PigJoin.java b/pig/src/main/java/org/apache/calcite/adapter/pig/PigJoin.java
index bb435d7..948ae3f 100644
--- a/pig/src/main/java/org/apache/calcite/adapter/pig/PigJoin.java
+++ b/pig/src/main/java/org/apache/calcite/adapter/pig/PigJoin.java
@@ -27,8 +27,10 @@ import org.apache.calcite.rex.RexCall;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.sql.SqlKind;
 
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+
 import java.util.ArrayList;
-import java.util.HashSet;
 import java.util.List;
 
 /** Implementation of {@link org.apache.calcite.rel.core.Join} in
@@ -38,7 +40,8 @@ public class PigJoin extends Join implements PigRel {
   /** Creates a PigJoin. */
   public PigJoin(RelOptCluster cluster, RelTraitSet traitSet, RelNode left, RelNode right,
       RexNode condition, JoinRelType joinType) {
-    super(cluster, traitSet, left, right, condition, new HashSet<>(0), joinType);
+    super(cluster, traitSet, ImmutableList.of(), left, right, condition,
+        ImmutableSet.of(), joinType);
     assert getConvention() == PigRel.CONVENTION;
   }
 
diff --git a/pig/src/main/java/org/apache/calcite/adapter/pig/PigProject.java b/pig/src/main/java/org/apache/calcite/adapter/pig/PigProject.java
index 6eeb5c3..11d2e90 100644
--- a/pig/src/main/java/org/apache/calcite/adapter/pig/PigProject.java
+++ b/pig/src/main/java/org/apache/calcite/adapter/pig/PigProject.java
@@ -24,6 +24,8 @@ import org.apache.calcite.rel.core.Project;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rex.RexNode;
 
+import com.google.common.collect.ImmutableList;
+
 import java.util.List;
 
 /** Implementation of {@link org.apache.calcite.rel.core.Project} in
@@ -33,7 +35,7 @@ public class PigProject extends Project implements PigRel {
   /** Creates a PigProject. */
   public PigProject(RelOptCluster cluster, RelTraitSet traitSet, RelNode input,
       List<? extends RexNode> projects, RelDataType rowType) {
-    super(cluster, traitSet, input, projects, rowType);
+    super(cluster, traitSet, ImmutableList.of(), input, projects, rowType);
     assert getConvention() == PigRel.CONVENTION;
   }
 
diff --git a/pig/src/main/java/org/apache/calcite/adapter/pig/PigTableScan.java b/pig/src/main/java/org/apache/calcite/adapter/pig/PigTableScan.java
index 60fa256..55e9f47 100644
--- a/pig/src/main/java/org/apache/calcite/adapter/pig/PigTableScan.java
+++ b/pig/src/main/java/org/apache/calcite/adapter/pig/PigTableScan.java
@@ -29,6 +29,8 @@ import org.apache.calcite.rel.type.RelDataTypeField;
 
 import org.apache.pig.data.DataType;
 
+import com.google.common.collect.ImmutableList;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -38,7 +40,7 @@ public class PigTableScan extends TableScan implements PigRel {
 
   /** Creates a PigTableScan. */
   public PigTableScan(RelOptCluster cluster, RelTraitSet traitSet, RelOptTable table) {
-    super(cluster, traitSet, table);
+    super(cluster, traitSet, ImmutableList.of(), table);
     assert getConvention() == PigRel.CONVENTION;
   }
 
diff --git a/site/_docs/history.md b/site/_docs/history.md
index 2e7f6ff..b24c767 100644
--- a/site/_docs/history.md
+++ b/site/_docs/history.md
@@ -28,6 +28,14 @@ For a full list of releases, see
 Downloads are available on the
 [downloads page]({{ site.baseurl }}/downloads/).
 
+## 1.22.0 (un-released)
+
+#### Breaking Changes
+
+* Constructors for `Project`, `TableScan`, `Calc`, `Aggregate` and `Join` introduce new parameter named "hints";
+* `Project` names will not represent in `RelNode` digest anymore;
+* `RexCall`s are default to be normalized in the `RelNode` digest. 
+
 ## <a href="https://github.com/apache/calcite/releases/tag/calcite-1.21.0">1.21.0</a> / 2019-09-11
 {: #v1-21-0}
 
diff --git a/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkTableScan.java b/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkTableScan.java
index 45c7fde..031c1ad 100644
--- a/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkTableScan.java
+++ b/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkTableScan.java
@@ -36,6 +36,7 @@ import org.apache.calcite.rel.type.RelDataTypeFactory;
 import org.apache.calcite.runtime.Hook;
 import org.apache.calcite.util.Util;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
 import java.lang.reflect.Method;
@@ -73,6 +74,7 @@ public class SplunkTableScan
     super(
         cluster,
         cluster.traitSetOf(EnumerableConvention.INSTANCE),
+        ImmutableList.of(),
         table);
     this.splunkTable = splunkTable;
     this.search = search;