[CALCITE-2043] Use custom RelBuilder implementation in some rules (Volodymyr 
Vysotskyi)

Close apache/calcite#564


Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/d407395e
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/d407395e
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/d407395e

Branch: refs/heads/master
Commit: d407395e05b5b37e019a44f812aae04540e6f398
Parents: a8505d2
Author: Volodymyr Vysotskyi <[email protected]>
Authored: Wed Nov 8 11:12:51 2017 +0000
Committer: Julian Hyde <[email protected]>
Committed: Wed Nov 15 11:48:57 2017 -0800

----------------------------------------------------------------------
 .../adapter/cassandra/CassandraRules.java       |   4 +-
 .../CassandraToEnumerableConverterRule.java     |  19 +-
 .../ElasticsearchToEnumerableConverterRule.java |  20 +-
 .../adapter/enumerable/EnumerableBindable.java  |  18 +-
 .../adapter/enumerable/EnumerableCalcRule.java  |   4 +-
 .../enumerable/EnumerableCorrelateRule.java     |  15 +-
 .../enumerable/EnumerableFilterRule.java        |   4 +-
 .../enumerable/EnumerableFilterToCalcRule.java  |  10 +-
 .../enumerable/EnumerableInterpreterRule.java   |  18 +-
 .../enumerable/EnumerableProjectRule.java       |   4 +-
 .../enumerable/EnumerableProjectToCalcRule.java |  10 +-
 .../adapter/enumerable/EnumerableRules.java     |  15 +-
 .../EnumerableTableFunctionScanRule.java        |  19 +-
 .../enumerable/EnumerableTableModifyRule.java   |  15 +-
 .../enumerable/EnumerableTableScanRule.java     |  20 +-
 .../enumerable/EnumerableValuesRule.java        |  13 +-
 .../apache/calcite/adapter/jdbc/JdbcRules.java  |   3 +-
 .../jdbc/JdbcToEnumerableConverterRule.java     |  10 +-
 .../apache/calcite/interpreter/Bindables.java   | 139 ++++++++++----
 .../NoneToBindableConverterRule.java            |  16 +-
 .../calcite/plan/SubstitutionVisitor.java       |  12 +-
 .../org/apache/calcite/plan/hep/HepPlanner.java |   4 +-
 .../calcite/plan/volcano/AbstractConverter.java |  10 +-
 .../calcite/rel/convert/ConverterRule.java      |  16 +-
 .../calcite/rel/convert/TraitMatchingRule.java  |  21 ++-
 .../rel/rules/AggregateFilterTransposeRule.java |   3 +-
 .../rel/rules/AggregateReduceFunctionsRule.java |   3 +-
 .../calcite/rel/rules/AggregateRemoveRule.java  |  18 +-
 .../rel/rules/AggregateStarTableRule.java       |  17 +-
 .../calcite/rel/rules/AggregateValuesRule.java  |  15 +-
 .../apache/calcite/rel/rules/CalcMergeRule.java |  15 +-
 .../calcite/rel/rules/CalcRemoveRule.java       |  13 +-
 .../apache/calcite/rel/rules/CalcSplitRule.java |   7 +-
 .../calcite/rel/rules/CoerceInputsRule.java     |  32 ++--
 .../calcite/rel/rules/FilterCalcMergeRule.java  |  14 +-
 .../rel/rules/FilterMultiJoinMergeRule.java     |   9 +-
 .../FilterRemoveIsNotDistinctFromRule.java      |  13 +-
 .../rules/FilterTableFunctionTransposeRule.java |   9 +-
 .../calcite/rel/rules/FilterTableScanRule.java  |  18 +-
 .../calcite/rel/rules/FilterToCalcRule.java     |  14 +-
 .../rel/rules/JoinAddRedundantSemiJoinRule.java |  10 +-
 .../calcite/rel/rules/JoinAssociateRule.java    |  10 +-
 .../rel/rules/JoinExtractFilterRule.java        |  15 +-
 .../calcite/rel/rules/JoinToCorrelateRule.java  |   4 +-
 .../calcite/rel/rules/JoinToMultiJoinRule.java  |  15 +-
 .../rel/rules/JoinUnionTransposeRule.java       |  17 +-
 .../rules/MaterializedViewFilterScanRule.java   |   2 +-
 .../rules/MultiJoinProjectTransposeRule.java    |  16 +-
 .../calcite/rel/rules/ProjectCalcMergeRule.java |  14 +-
 .../rel/rules/ProjectMultiJoinMergeRule.java    |   2 +-
 .../calcite/rel/rules/ProjectRemoveRule.java    |  16 +-
 .../rel/rules/ProjectSortTransposeRule.java     |  28 ++-
 .../calcite/rel/rules/ProjectTableScanRule.java |  11 +-
 .../calcite/rel/rules/ProjectToCalcRule.java    |  14 +-
 .../calcite/rel/rules/ProjectToWindowRule.java  | 165 +++++++++-------
 .../rel/rules/ProjectWindowTransposeRule.java   |  16 +-
 .../calcite/rel/rules/ReduceDecimalsRule.java   |   9 +-
 .../rel/rules/SemiJoinFilterTransposeRule.java  |   8 +-
 .../rel/rules/SemiJoinJoinTransposeRule.java    |   9 +-
 .../calcite/rel/rules/SemiJoinRemoveRule.java   |   8 +-
 .../rel/rules/SortJoinTransposeRule.java        |  14 +-
 .../rel/rules/SortProjectTransposeRule.java     |  28 ++-
 .../calcite/rel/rules/SortRemoveRule.java       |  16 +-
 .../calcite/rel/rules/SubQueryRemoveRule.java   |   9 +-
 .../apache/calcite/rel/rules/TableScanRule.java |  14 +-
 .../calcite/rel/rules/UnionEliminatorRule.java  |   9 +-
 .../rel/rules/UnionPullUpConstantsRule.java     |   2 +-
 .../calcite/rel/rules/ValuesReduceRule.java     |  14 +-
 .../apache/calcite/rel/stream/StreamRules.java  | 108 ++++++++---
 .../org/apache/calcite/test/HepPlannerTest.java |   9 +-
 .../apache/calcite/test/RelOptRulesTest.java    |   4 +-
 .../calcite/adapter/druid/DruidRules.java       | 186 ++++++++++++++-----
 .../adapter/csv/CsvProjectTableScanRule.java    |  12 +-
 .../mongodb/MongoToEnumerableConverterRule.java |  16 +-
 .../spark/EnumerableToSparkConverterRule.java   |  17 +-
 .../adapter/spark/JdbcToSparkConverterRule.java |  13 +-
 .../adapter/splunk/SplunkPushDownRule.java      |  43 ++---
 77 files changed, 1136 insertions(+), 406 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraRules.java
----------------------------------------------------------------------
diff --git 
a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraRules.java
 
b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraRules.java
index 6236542..94091b2 100644
--- 
a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraRules.java
+++ 
b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraRules.java
@@ -29,6 +29,7 @@ import org.apache.calcite.rel.RelCollations;
 import org.apache.calcite.rel.RelFieldCollation;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.convert.ConverterRule;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.core.Sort;
 import org.apache.calcite.rel.logical.LogicalFilter;
 import org.apache.calcite.rel.logical.LogicalProject;
@@ -100,7 +101,8 @@ public class CassandraRules {
     <R extends RelNode> CassandraConverterRule(Class<R> clazz,
         Predicate<? super R> predicate,
         String description) {
-      super(clazz, predicate, Convention.NONE, CassandraRel.CONVENTION, 
description);
+      super(clazz, predicate, Convention.NONE,
+          CassandraRel.CONVENTION, RelFactories.LOGICAL_BUILDER, description);
       this.out = CassandraRel.CONVENTION;
     }
   }

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraToEnumerableConverterRule.java
----------------------------------------------------------------------
diff --git 
a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraToEnumerableConverterRule.java
 
b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraToEnumerableConverterRule.java
index dae992d..abcf155 100644
--- 
a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraToEnumerableConverterRule.java
+++ 
b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraToEnumerableConverterRule.java
@@ -20,6 +20,10 @@ import 
org.apache.calcite.adapter.enumerable.EnumerableConvention;
 import org.apache.calcite.plan.RelTraitSet;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.convert.ConverterRule;
+import org.apache.calcite.rel.core.RelFactories;
+import org.apache.calcite.tools.RelBuilderFactory;
+
+import com.google.common.base.Predicates;
 
 /**
  * Rule to convert a relational expression from
@@ -27,11 +31,18 @@ import org.apache.calcite.rel.convert.ConverterRule;
  */
 public class CassandraToEnumerableConverterRule extends ConverterRule {
   public static final ConverterRule INSTANCE =
-      new CassandraToEnumerableConverterRule();
+      new CassandraToEnumerableConverterRule(RelFactories.LOGICAL_BUILDER);
 
-  private CassandraToEnumerableConverterRule() {
-    super(RelNode.class, CassandraRel.CONVENTION, 
EnumerableConvention.INSTANCE,
-        "CassandraToEnumerableConverterRule");
+  /**
+   * Creates a CassandraToEnumerableConverterRule.
+   *
+   * @param relBuilderFactory Builder for relational expressions
+   */
+  public CassandraToEnumerableConverterRule(
+      RelBuilderFactory relBuilderFactory) {
+    super(RelNode.class, Predicates.<RelNode>alwaysTrue(),
+        CassandraRel.CONVENTION, EnumerableConvention.INSTANCE,
+        relBuilderFactory, "CassandraToEnumerableConverterRule");
   }
 
   @Override public RelNode convert(RelNode rel) {

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchToEnumerableConverterRule.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchToEnumerableConverterRule.java
 
b/core/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchToEnumerableConverterRule.java
index 1047757..9575d4f 100644
--- 
a/core/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchToEnumerableConverterRule.java
+++ 
b/core/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchToEnumerableConverterRule.java
@@ -20,17 +20,29 @@ import 
org.apache.calcite.adapter.enumerable.EnumerableConvention;
 import org.apache.calcite.plan.RelTraitSet;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.convert.ConverterRule;
+import org.apache.calcite.rel.core.RelFactories;
+import org.apache.calcite.tools.RelBuilderFactory;
+
+import com.google.common.base.Predicates;
 
 /**
  * Rule to convert a relational expression from
  * {@link ElasticsearchRel#CONVENTION} to {@link EnumerableConvention}.
  */
 public class ElasticsearchToEnumerableConverterRule extends ConverterRule {
-  public static final ConverterRule INSTANCE = new 
ElasticsearchToEnumerableConverterRule();
+  public static final ConverterRule INSTANCE =
+      new ElasticsearchToEnumerableConverterRule(RelFactories.LOGICAL_BUILDER);
 
-  private ElasticsearchToEnumerableConverterRule() {
-    super(RelNode.class, ElasticsearchRel.CONVENTION, 
EnumerableConvention.INSTANCE,
-        "ElasticsearchToEnumerableConverterRule");
+  /**
+   * Creates an ElasticsearchToEnumerableConverterRule.
+   *
+   * @param relBuilderFactory Builder for relational expressions
+   */
+  public ElasticsearchToEnumerableConverterRule(
+      RelBuilderFactory relBuilderFactory) {
+    super(RelNode.class, Predicates.<RelNode>alwaysTrue(),
+        ElasticsearchRel.CONVENTION, EnumerableConvention.INSTANCE,
+        relBuilderFactory, "ElasticsearchToEnumerableConverterRule");
   }
 
   @Override public RelNode convert(RelNode relNode) {

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBindable.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBindable.java
 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBindable.java
index 2ad069e..820be91 100644
--- 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBindable.java
+++ 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBindable.java
@@ -30,9 +30,12 @@ import org.apache.calcite.plan.RelTraitSet;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.convert.ConverterImpl;
 import org.apache.calcite.rel.convert.ConverterRule;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.runtime.ArrayBindable;
 import org.apache.calcite.runtime.Bindable;
+import org.apache.calcite.tools.RelBuilderFactory;
 
+import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableMap;
 
 import java.util.List;
@@ -86,11 +89,18 @@ public class EnumerableBindable extends ConverterImpl 
implements BindableRel {
    */
   public static class EnumerableToBindableConverterRule extends ConverterRule {
     public static final EnumerableToBindableConverterRule INSTANCE =
-        new EnumerableToBindableConverterRule();
+        new EnumerableToBindableConverterRule(RelFactories.LOGICAL_BUILDER);
 
-    private EnumerableToBindableConverterRule() {
-      super(EnumerableRel.class, EnumerableConvention.INSTANCE,
-          BindableConvention.INSTANCE, "EnumerableToBindableConverterRule");
+    /**
+     * Creates an EnumerableToBindableConverterRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
+     */
+    public EnumerableToBindableConverterRule(
+        RelBuilderFactory relBuilderFactory) {
+      super(EnumerableRel.class, Predicates.<RelNode>alwaysTrue(),
+          EnumerableConvention.INSTANCE, BindableConvention.INSTANCE,
+          relBuilderFactory, "EnumerableToBindableConverterRule");
     }
 
     @Override public RelNode convert(RelNode rel) {

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCalcRule.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCalcRule.java
 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCalcRule.java
index b94ff57..c85985b 100644
--- 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCalcRule.java
+++ 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCalcRule.java
@@ -20,6 +20,7 @@ import org.apache.calcite.plan.Convention;
 import org.apache.calcite.plan.RelOptUtil;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.convert.ConverterRule;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.logical.LogicalCalc;
 
 /**
@@ -31,7 +32,8 @@ class EnumerableCalcRule extends ConverterRule {
     // The predicate ensures that if there's a multiset, 
FarragoMultisetSplitter
     // will work on it first.
     super(LogicalCalc.class, RelOptUtil.CALC_PREDICATE, Convention.NONE,
-        EnumerableConvention.INSTANCE, "EnumerableCalcRule");
+        EnumerableConvention.INSTANCE, RelFactories.LOGICAL_BUILDER,
+        "EnumerableCalcRule");
   }
 
   public RelNode convert(RelNode rel) {

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCorrelateRule.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCorrelateRule.java
 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCorrelateRule.java
index eb08a27..9c7bc71 100644
--- 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCorrelateRule.java
+++ 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCorrelateRule.java
@@ -21,14 +21,23 @@ import org.apache.calcite.plan.RelTraitSet;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.convert.ConverterRule;
 import org.apache.calcite.rel.logical.LogicalCorrelate;
+import org.apache.calcite.tools.RelBuilderFactory;
+
+import com.google.common.base.Predicates;
 
 /**
  * Implementation of nested loops over enumerable inputs.
  */
 public class EnumerableCorrelateRule extends ConverterRule {
-  EnumerableCorrelateRule() {
-    super(LogicalCorrelate.class, Convention.NONE,
-        EnumerableConvention.INSTANCE, "EnumerableCorrelateRule");
+  /**
+   * Creates an EnumerableCorrelateRule.
+   *
+   * @param relBuilderFactory Builder for relational expressions
+   */
+  public EnumerableCorrelateRule(RelBuilderFactory relBuilderFactory) {
+    super(LogicalCorrelate.class, Predicates.<RelNode>alwaysTrue(),
+        Convention.NONE, EnumerableConvention.INSTANCE, relBuilderFactory,
+        "EnumerableCorrelateRule");
   }
 
   public RelNode convert(RelNode rel) {

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilterRule.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilterRule.java
 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilterRule.java
index 51fcdd4..65b80f1 100644
--- 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilterRule.java
+++ 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilterRule.java
@@ -20,6 +20,7 @@ import org.apache.calcite.plan.Convention;
 import org.apache.calcite.plan.RelOptUtil;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.convert.ConverterRule;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.logical.LogicalFilter;
 
 /**
@@ -29,7 +30,8 @@ import org.apache.calcite.rel.logical.LogicalFilter;
 class EnumerableFilterRule extends ConverterRule {
   EnumerableFilterRule() {
     super(LogicalFilter.class, RelOptUtil.FILTER_PREDICATE, Convention.NONE,
-        EnumerableConvention.INSTANCE, "EnumerableFilterRule");
+        EnumerableConvention.INSTANCE, RelFactories.LOGICAL_BUILDER,
+        "EnumerableFilterRule");
   }
 
   public RelNode convert(RelNode rel) {

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilterToCalcRule.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilterToCalcRule.java
 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilterToCalcRule.java
index 9a61124..58d885d 100644
--- 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilterToCalcRule.java
+++ 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilterToCalcRule.java
@@ -23,12 +23,18 @@ import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rex.RexBuilder;
 import org.apache.calcite.rex.RexProgram;
 import org.apache.calcite.rex.RexProgramBuilder;
+import org.apache.calcite.tools.RelBuilderFactory;
 
 /** Variant of {@link org.apache.calcite.rel.rules.FilterToCalcRule} for
  * {@link org.apache.calcite.adapter.enumerable.EnumerableConvention 
enumerable calling convention}. */
 public class EnumerableFilterToCalcRule extends RelOptRule {
-  EnumerableFilterToCalcRule() {
-    super(operand(EnumerableFilter.class, any()));
+  /**
+   * Creates an EnumerableFilterToCalcRule.
+   *
+   * @param relBuilderFactory Builder for relational expressions
+   */
+  public EnumerableFilterToCalcRule(RelBuilderFactory relBuilderFactory) {
+    super(operand(EnumerableFilter.class, any()), relBuilderFactory, null);
   }
 
   public void onMatch(RelOptRuleCall call) {

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableInterpreterRule.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableInterpreterRule.java
 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableInterpreterRule.java
index 99996fa..5462004 100644
--- 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableInterpreterRule.java
+++ 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableInterpreterRule.java
@@ -19,6 +19,10 @@ package org.apache.calcite.adapter.enumerable;
 import org.apache.calcite.interpreter.BindableConvention;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.convert.ConverterRule;
+import org.apache.calcite.rel.core.RelFactories;
+import org.apache.calcite.tools.RelBuilderFactory;
+
+import com.google.common.base.Predicates;
 
 /**
  * Planner rule that converts {@link 
org.apache.calcite.interpreter.BindableRel}
@@ -27,11 +31,17 @@ import org.apache.calcite.rel.convert.ConverterRule;
  */
 public class EnumerableInterpreterRule extends ConverterRule {
   public static final EnumerableInterpreterRule INSTANCE =
-      new EnumerableInterpreterRule();
+      new EnumerableInterpreterRule(RelFactories.LOGICAL_BUILDER);
 
-  private EnumerableInterpreterRule() {
-    super(RelNode.class, BindableConvention.INSTANCE,
-        EnumerableConvention.INSTANCE, "EnumerableInterpreterRule");
+  /**
+   * Creates an EnumerableInterpreterRule.
+   *
+   * @param relBuilderFactory Builder for relational expressions
+   */
+  public EnumerableInterpreterRule(RelBuilderFactory relBuilderFactory) {
+    super(RelNode.class, Predicates.<RelNode>alwaysTrue(),
+        BindableConvention.INSTANCE, EnumerableConvention.INSTANCE,
+        relBuilderFactory, "EnumerableInterpreterRule");
   }
 
   //~ Methods ----------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProjectRule.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProjectRule.java
 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProjectRule.java
index 3f998da..9c015a0 100644
--- 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProjectRule.java
+++ 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProjectRule.java
@@ -20,6 +20,7 @@ import org.apache.calcite.plan.Convention;
 import org.apache.calcite.plan.RelOptUtil;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.convert.ConverterRule;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.logical.LogicalProject;
 
 /**
@@ -29,7 +30,8 @@ import org.apache.calcite.rel.logical.LogicalProject;
 class EnumerableProjectRule extends ConverterRule {
   EnumerableProjectRule() {
     super(LogicalProject.class, RelOptUtil.PROJECT_PREDICATE, Convention.NONE,
-        EnumerableConvention.INSTANCE, "EnumerableProjectRule");
+        EnumerableConvention.INSTANCE, RelFactories.LOGICAL_BUILDER,
+        "EnumerableProjectRule");
   }
 
   public RelNode convert(RelNode rel) {

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProjectToCalcRule.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProjectToCalcRule.java
 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProjectToCalcRule.java
index 2e1a4a8..4d2b9c1 100644
--- 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProjectToCalcRule.java
+++ 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProjectToCalcRule.java
@@ -20,12 +20,18 @@ import org.apache.calcite.plan.RelOptRule;
 import org.apache.calcite.plan.RelOptRuleCall;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rex.RexProgram;
+import org.apache.calcite.tools.RelBuilderFactory;
 
 /** Variant of {@link org.apache.calcite.rel.rules.ProjectToCalcRule} for
  * {@link org.apache.calcite.adapter.enumerable.EnumerableConvention 
enumerable calling convention}. */
 public class EnumerableProjectToCalcRule extends RelOptRule {
-  EnumerableProjectToCalcRule() {
-    super(operand(EnumerableProject.class, any()));
+  /**
+   * Creates an EnumerableProjectToCalcRule.
+   *
+   * @param relBuilderFactory Builder for relational expressions
+   */
+  public EnumerableProjectToCalcRule(RelBuilderFactory relBuilderFactory) {
+    super(operand(EnumerableProject.class, any()), relBuilderFactory, null);
   }
 
   public void onMatch(RelOptRuleCall call) {

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRules.java
----------------------------------------------------------------------
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 5a4874f..7871638 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
@@ -17,6 +17,7 @@
 package org.apache.calcite.adapter.enumerable;
 
 import org.apache.calcite.plan.RelOptRule;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.util.trace.CalciteTrace;
 
 import org.slf4j.Logger;
@@ -40,7 +41,7 @@ public class EnumerableRules {
       new EnumerableSemiJoinRule();
 
   public static final RelOptRule ENUMERABLE_CORRELATE_RULE =
-      new EnumerableCorrelateRule();
+      new EnumerableCorrelateRule(RelFactories.LOGICAL_BUILDER);
 
   private EnumerableRules() {
   }
@@ -73,10 +74,10 @@ public class EnumerableRules {
       new EnumerableMinusRule();
 
   public static final EnumerableTableModifyRule 
ENUMERABLE_TABLE_MODIFICATION_RULE =
-      new EnumerableTableModifyRule();
+      new EnumerableTableModifyRule(RelFactories.LOGICAL_BUILDER);
 
   public static final EnumerableValuesRule ENUMERABLE_VALUES_RULE =
-      new EnumerableValuesRule();
+      new EnumerableValuesRule(RelFactories.LOGICAL_BUILDER);
 
   public static final EnumerableWindowRule ENUMERABLE_WINDOW_RULE =
       new EnumerableWindowRule();
@@ -88,16 +89,16 @@ public class EnumerableRules {
       new EnumerableUncollectRule();
 
   public static final EnumerableFilterToCalcRule 
ENUMERABLE_FILTER_TO_CALC_RULE =
-      new EnumerableFilterToCalcRule();
+      new EnumerableFilterToCalcRule(RelFactories.LOGICAL_BUILDER);
 
   public static final EnumerableProjectToCalcRule 
ENUMERABLE_PROJECT_TO_CALC_RULE =
-      new EnumerableProjectToCalcRule();
+      new EnumerableProjectToCalcRule(RelFactories.LOGICAL_BUILDER);
 
   public static final EnumerableTableScanRule ENUMERABLE_TABLE_SCAN_RULE =
-      new EnumerableTableScanRule();
+      new EnumerableTableScanRule(RelFactories.LOGICAL_BUILDER);
 
   public static final EnumerableTableFunctionScanRule 
ENUMERABLE_TABLE_FUNCTION_SCAN_RULE =
-      new EnumerableTableFunctionScanRule();
+      new EnumerableTableFunctionScanRule(RelFactories.LOGICAL_BUILDER);
 }
 
 // End EnumerableRules.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableFunctionScanRule.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableFunctionScanRule.java
 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableFunctionScanRule.java
index 5d06c18..8a21b1e 100644
--- 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableFunctionScanRule.java
+++ 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableFunctionScanRule.java
@@ -20,16 +20,31 @@ import org.apache.calcite.plan.Convention;
 import org.apache.calcite.plan.RelTraitSet;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.convert.ConverterRule;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.logical.LogicalTableFunctionScan;
+import org.apache.calcite.tools.RelBuilderFactory;
+
+import com.google.common.base.Predicates;
 
 /** Planner rule that converts a
  * {@link org.apache.calcite.rel.logical.LogicalTableFunctionScan}
  * relational expression
  * {@link org.apache.calcite.adapter.enumerable.EnumerableConvention 
enumerable calling convention}. */
 public class EnumerableTableFunctionScanRule extends ConverterRule {
+  @Deprecated // to be removed before 2.0
   public EnumerableTableFunctionScanRule() {
-    super(LogicalTableFunctionScan.class, Convention.NONE,
-        EnumerableConvention.INSTANCE, "EnumerableTableFunctionScanRule");
+    this(RelFactories.LOGICAL_BUILDER);
+  }
+
+  /**
+   * Creates an EnumerableTableFunctionScanRule.
+   *
+   * @param relBuilderFactory Builder for relational expressions
+   */
+  public EnumerableTableFunctionScanRule(RelBuilderFactory relBuilderFactory) {
+    super(LogicalTableFunctionScan.class, Predicates.<RelNode>alwaysTrue(),
+        Convention.NONE, EnumerableConvention.INSTANCE, relBuilderFactory,
+        "EnumerableTableFunctionScanRule");
   }
 
   @Override public RelNode convert(RelNode rel) {

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableModifyRule.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableModifyRule.java
 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableModifyRule.java
index 321115f..87eaefe 100644
--- 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableModifyRule.java
+++ 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableModifyRule.java
@@ -22,15 +22,24 @@ import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.convert.ConverterRule;
 import org.apache.calcite.rel.logical.LogicalTableModify;
 import org.apache.calcite.schema.ModifiableTable;
+import org.apache.calcite.tools.RelBuilderFactory;
+
+import com.google.common.base.Predicates;
 
 /** Planner rule that converts a
  * {@link org.apache.calcite.rel.logical.LogicalTableModify}
  * relational expression
  * {@link org.apache.calcite.adapter.enumerable.EnumerableConvention 
enumerable calling convention}. */
 public class EnumerableTableModifyRule extends ConverterRule {
-  EnumerableTableModifyRule() {
-    super(LogicalTableModify.class, Convention.NONE,
-        EnumerableConvention.INSTANCE, "EnumerableTableModificationRule");
+  /**
+   * Creates an EnumerableTableModifyRule.
+   *
+   * @param relBuilderFactory Builder for relational expressions
+   */
+  public EnumerableTableModifyRule(RelBuilderFactory relBuilderFactory) {
+    super(LogicalTableModify.class, Predicates.<RelNode>alwaysTrue(),
+        Convention.NONE, EnumerableConvention.INSTANCE, relBuilderFactory,
+        "EnumerableTableModificationRule");
   }
 
   @Override public RelNode convert(RelNode rel) {

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableScanRule.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableScanRule.java
 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableScanRule.java
index 416c01a..adcfa09 100644
--- 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableScanRule.java
+++ 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableScanRule.java
@@ -21,17 +21,33 @@ import org.apache.calcite.plan.Convention;
 import org.apache.calcite.plan.RelOptTable;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.convert.ConverterRule;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.logical.LogicalTableScan;
 import org.apache.calcite.schema.Table;
+import org.apache.calcite.tools.RelBuilderFactory;
+
+import com.google.common.base.Predicates;
 
 /** Planner rule that converts a
  * {@link org.apache.calcite.rel.logical.LogicalTableFunctionScan}
  * relational expression
  * {@link EnumerableConvention enumerable calling convention}. */
 public class EnumerableTableScanRule extends ConverterRule {
+
+  @Deprecated // to be removed before 2.0
   public EnumerableTableScanRule() {
-    super(LogicalTableScan.class, Convention.NONE,
-        EnumerableConvention.INSTANCE, "EnumerableTableScanRule");
+    this(RelFactories.LOGICAL_BUILDER);
+  }
+
+  /**
+   * Creates an EnumerableTableScanRule.
+   *
+   * @param relBuilderFactory Builder for relational expressions
+   */
+  public EnumerableTableScanRule(RelBuilderFactory relBuilderFactory) {
+    super(LogicalTableScan.class, Predicates.<RelNode>alwaysTrue(),
+        Convention.NONE, EnumerableConvention.INSTANCE, relBuilderFactory,
+        "EnumerableTableScanRule");
   }
 
   @Override public RelNode convert(RelNode rel) {

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableValuesRule.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableValuesRule.java
 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableValuesRule.java
index 6e14bcc..b401598 100644
--- 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableValuesRule.java
+++ 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableValuesRule.java
@@ -20,14 +20,23 @@ import org.apache.calcite.plan.Convention;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.convert.ConverterRule;
 import org.apache.calcite.rel.logical.LogicalValues;
+import org.apache.calcite.tools.RelBuilderFactory;
+
+import com.google.common.base.Predicates;
 
 /** Planner rule that converts a
  * {@link org.apache.calcite.rel.logical.LogicalValues}
  * relational expression
  * {@link org.apache.calcite.adapter.enumerable.EnumerableConvention 
enumerable calling convention}. */
 public class EnumerableValuesRule extends ConverterRule {
-  EnumerableValuesRule() {
-    super(LogicalValues.class, Convention.NONE, EnumerableConvention.INSTANCE,
+  /**
+   * Creates an EnumerableValuesRule.
+   *
+   * @param relBuilderFactory Builder for relational expressions
+   */
+  public EnumerableValuesRule(RelBuilderFactory relBuilderFactory) {
+    super(LogicalValues.class, Predicates.<RelNode>alwaysTrue(),
+        Convention.NONE, EnumerableConvention.INSTANCE, relBuilderFactory,
         "EnumerableValuesRule");
   }
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcRules.java
----------------------------------------------------------------------
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 c4e4c82..53f5012 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
@@ -42,6 +42,7 @@ import org.apache.calcite.rel.core.Join;
 import org.apache.calcite.rel.core.JoinRelType;
 import org.apache.calcite.rel.core.Minus;
 import org.apache.calcite.rel.core.Project;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.core.Sort;
 import org.apache.calcite.rel.core.TableModify;
 import org.apache.calcite.rel.core.Union;
@@ -94,7 +95,7 @@ public class JdbcRules {
 
   public static List<RelOptRule> rules(JdbcConvention out) {
     return ImmutableList.<RelOptRule>of(
-        new JdbcToEnumerableConverterRule(out),
+        new JdbcToEnumerableConverterRule(out, RelFactories.LOGICAL_BUILDER),
         new JdbcJoinRule(out),
         new JdbcCalcRule(out),
         new JdbcProjectRule(out),

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcToEnumerableConverterRule.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcToEnumerableConverterRule.java
 
b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcToEnumerableConverterRule.java
index a212c3b..e5eec50 100644
--- 
a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcToEnumerableConverterRule.java
+++ 
b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcToEnumerableConverterRule.java
@@ -20,6 +20,9 @@ import 
org.apache.calcite.adapter.enumerable.EnumerableConvention;
 import org.apache.calcite.plan.RelTraitSet;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.convert.ConverterRule;
+import org.apache.calcite.tools.RelBuilderFactory;
+
+import com.google.common.base.Predicates;
 
 /**
  * Rule to convert a relational expression from
@@ -27,8 +30,11 @@ import org.apache.calcite.rel.convert.ConverterRule;
  * {@link EnumerableConvention}.
  */
 public class JdbcToEnumerableConverterRule extends ConverterRule {
-  JdbcToEnumerableConverterRule(JdbcConvention out) {
-    super(RelNode.class, out, EnumerableConvention.INSTANCE,
+  /** Creates a JdbcToEnumerableConverterRule. */
+  public JdbcToEnumerableConverterRule(JdbcConvention out,
+      RelBuilderFactory relBuilderFactory) {
+    super(RelNode.class, Predicates.<RelNode>alwaysTrue(), out,
+        EnumerableConvention.INSTANCE, relBuilderFactory,
         "JdbcToEnumerableConverterRule:" + out);
   }
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/interpreter/Bindables.java
----------------------------------------------------------------------
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 b8b0b6f..c5287eb 100644
--- a/core/src/main/java/org/apache/calcite/interpreter/Bindables.java
+++ b/core/src/main/java/org/apache/calcite/interpreter/Bindables.java
@@ -42,6 +42,7 @@ import org.apache.calcite.rel.core.Filter;
 import org.apache.calcite.rel.core.Join;
 import org.apache.calcite.rel.core.JoinRelType;
 import org.apache.calcite.rel.core.Project;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.core.Sort;
 import org.apache.calcite.rel.core.TableScan;
 import org.apache.calcite.rel.core.Union;
@@ -66,10 +67,12 @@ import org.apache.calcite.schema.FilterableTable;
 import org.apache.calcite.schema.ProjectableFilterableTable;
 import org.apache.calcite.schema.ScannableTable;
 import org.apache.calcite.schema.Table;
+import org.apache.calcite.tools.RelBuilderFactory;
 import org.apache.calcite.util.ImmutableBitSet;
 import org.apache.calcite.util.ImmutableIntList;
 
 import com.google.common.base.Preconditions;
+import com.google.common.base.Predicates;
 import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableList;
 
@@ -83,31 +86,31 @@ public class Bindables {
   private Bindables() {}
 
   public static final RelOptRule BINDABLE_TABLE_SCAN_RULE =
-      new BindableTableScanRule();
+      new BindableTableScanRule(RelFactories.LOGICAL_BUILDER);
 
   public static final RelOptRule BINDABLE_FILTER_RULE =
-      new BindableFilterRule();
+      new BindableFilterRule(RelFactories.LOGICAL_BUILDER);
 
   public static final RelOptRule BINDABLE_PROJECT_RULE =
-      new BindableProjectRule();
+      new BindableProjectRule(RelFactories.LOGICAL_BUILDER);
 
   public static final RelOptRule BINDABLE_SORT_RULE =
-      new BindableSortRule();
+      new BindableSortRule(RelFactories.LOGICAL_BUILDER);
 
   public static final RelOptRule BINDABLE_JOIN_RULE =
-      new BindableJoinRule();
+      new BindableJoinRule(RelFactories.LOGICAL_BUILDER);
 
   public static final RelOptRule BINDABLE_UNION_RULE =
-      new BindableUnionRule();
+      new BindableUnionRule(RelFactories.LOGICAL_BUILDER);
 
   public static final RelOptRule BINDABLE_VALUES_RULE =
-      new BindableValuesRule();
+      new BindableValuesRule(RelFactories.LOGICAL_BUILDER);
 
   public static final RelOptRule BINDABLE_AGGREGATE_RULE =
-      new BindableAggregateRule();
+      new BindableAggregateRule(RelFactories.LOGICAL_BUILDER);
 
   public static final RelOptRule BINDABLE_WINDOW_RULE =
-      new BindableWindowRule();
+      new BindableWindowRule(RelFactories.LOGICAL_BUILDER);
 
   /** All rules that convert logical relational expression to bindable. */
   public static final ImmutableList<RelOptRule> RULES =
@@ -136,9 +139,15 @@ public class Bindables {
 
   /** Rule that converts a {@link org.apache.calcite.rel.core.TableScan}
    * to bindable convention. */
-  private static class BindableTableScanRule extends RelOptRule {
-    private BindableTableScanRule() {
-      super(operand(LogicalTableScan.class, none()));
+  public static class BindableTableScanRule extends RelOptRule {
+
+    /**
+     * Creates a BindableTableScanRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
+     */
+    public BindableTableScanRule(RelBuilderFactory relBuilderFactory) {
+      super(operand(LogicalTableScan.class, none()), relBuilderFactory, null);
     }
 
     @Override public void onMatch(RelOptRuleCall call) {
@@ -251,10 +260,16 @@ public class Bindables {
   }
 
   /** Rule that converts a {@link Filter} to bindable convention. */
-  private static class BindableFilterRule extends ConverterRule {
-    private BindableFilterRule() {
+  public static class BindableFilterRule extends ConverterRule {
+
+    /**
+     * Creates a BindableFilterRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
+     */
+    public BindableFilterRule(RelBuilderFactory relBuilderFactory) {
       super(LogicalFilter.class, RelOptUtil.FILTER_PREDICATE, Convention.NONE,
-          BindableConvention.INSTANCE, "BindableFilterRule");
+          BindableConvention.INSTANCE, relBuilderFactory, 
"BindableFilterRule");
     }
 
     public RelNode convert(RelNode rel) {
@@ -314,10 +329,17 @@ public class Bindables {
    * Rule to convert a {@link org.apache.calcite.rel.logical.LogicalProject}
    * to a {@link BindableProject}.
    */
-  private static class BindableProjectRule extends ConverterRule {
-    private BindableProjectRule() {
+  public static class BindableProjectRule extends ConverterRule {
+
+    /**
+     * Creates a BindableProjectRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
+     */
+    public BindableProjectRule(RelBuilderFactory relBuilderFactory) {
       super(LogicalProject.class, RelOptUtil.PROJECT_PREDICATE, 
Convention.NONE,
-          BindableConvention.INSTANCE, "BindableProjectRule");
+          BindableConvention.INSTANCE, relBuilderFactory,
+          "BindableProjectRule");
     }
 
     public RelNode convert(RelNode rel) {
@@ -364,10 +386,16 @@ public class Bindables {
    * Rule to convert an {@link org.apache.calcite.rel.core.Sort} to a
    * {@link org.apache.calcite.interpreter.Bindables.BindableSort}.
    */
-  private static class BindableSortRule extends ConverterRule {
-    private BindableSortRule() {
-      super(Sort.class, Convention.NONE, BindableConvention.INSTANCE,
-          "BindableSortRule");
+  public static class BindableSortRule extends ConverterRule {
+
+    /**
+     * Creates a BindableSortRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
+     */
+    public BindableSortRule(RelBuilderFactory relBuilderFactory) {
+      super(Sort.class, Predicates.<RelNode>alwaysTrue(), Convention.NONE,
+          BindableConvention.INSTANCE, relBuilderFactory, "BindableSortRule");
     }
 
     public RelNode convert(RelNode rel) {
@@ -414,9 +442,16 @@ public class Bindables {
    * Rule to convert a {@link org.apache.calcite.rel.logical.LogicalJoin}
    * to a {@link BindableJoin}.
    */
-  private static class BindableJoinRule extends ConverterRule {
-    private BindableJoinRule() {
-      super(LogicalJoin.class, Convention.NONE, BindableConvention.INSTANCE,
+  public static class BindableJoinRule extends ConverterRule {
+
+    /**
+     * Creates a BindableJoinRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
+     */
+    public BindableJoinRule(RelBuilderFactory relBuilderFactory) {
+      super(LogicalJoin.class, Predicates.<RelNode>alwaysTrue(),
+          Convention.NONE, BindableConvention.INSTANCE, relBuilderFactory,
           "BindableJoinRule");
     }
 
@@ -477,9 +512,16 @@ public class Bindables {
    * Rule to convert an {@link org.apache.calcite.rel.logical.LogicalUnion}
    * to a {@link BindableUnion}.
    */
-  private static class BindableUnionRule extends ConverterRule {
-    private BindableUnionRule() {
-      super(LogicalUnion.class, Convention.NONE, BindableConvention.INSTANCE,
+  public static class BindableUnionRule extends ConverterRule {
+
+    /**
+     * Creates a BindableUnionRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
+     */
+    public BindableUnionRule(RelBuilderFactory relBuilderFactory) {
+      super(LogicalUnion.class, Predicates.<RelNode>alwaysTrue(),
+          Convention.NONE, BindableConvention.INSTANCE, relBuilderFactory,
           "BindableUnionRule");
     }
 
@@ -545,9 +587,16 @@ public class Bindables {
   }
 
   /** Rule that converts a {@link Values} to bindable convention. */
-  private static class BindableValuesRule extends ConverterRule {
-    private BindableValuesRule() {
-      super(LogicalValues.class, Convention.NONE, BindableConvention.INSTANCE,
+  public static class BindableValuesRule extends ConverterRule {
+
+    /**
+     * Creates a BindableValuesRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
+     */
+    public BindableValuesRule(RelBuilderFactory relBuilderFactory) {
+      super(LogicalValues.class, Predicates.<RelNode>alwaysTrue(),
+          Convention.NONE, BindableConvention.INSTANCE, relBuilderFactory,
           "BindableValuesRule");
     }
 
@@ -616,10 +665,17 @@ public class Bindables {
   }
 
   /** Rule that converts an {@link Aggregate} to bindable convention. */
-  private static class BindableAggregateRule extends ConverterRule {
-    private BindableAggregateRule() {
-      super(LogicalAggregate.class, Convention.NONE,
-          BindableConvention.INSTANCE, "BindableAggregateRule");
+  public static class BindableAggregateRule extends ConverterRule {
+
+    /**
+     * Creates a BindableAggregateRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
+     */
+    public BindableAggregateRule(RelBuilderFactory relBuilderFactory) {
+      super(LogicalAggregate.class, Predicates.<RelNode>alwaysTrue(),
+          Convention.NONE, BindableConvention.INSTANCE, relBuilderFactory,
+          "BindableAggregateRule");
     }
 
     public RelNode convert(RelNode rel) {
@@ -674,9 +730,16 @@ public class Bindables {
    * Rule to convert a {@link org.apache.calcite.rel.logical.LogicalWindow}
    * to a {@link BindableWindow}.
    */
-  private static class BindableWindowRule extends ConverterRule {
-    private BindableWindowRule() {
-      super(LogicalWindow.class, Convention.NONE, BindableConvention.INSTANCE,
+  public static class BindableWindowRule extends ConverterRule {
+
+    /**
+     * Creates a BindableWindowRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
+     */
+    public BindableWindowRule(RelBuilderFactory relBuilderFactory) {
+      super(LogicalWindow.class, Predicates.<RelNode>alwaysTrue(),
+          Convention.NONE, BindableConvention.INSTANCE, relBuilderFactory,
           "BindableWindowRule");
     }
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/interpreter/NoneToBindableConverterRule.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/interpreter/NoneToBindableConverterRule.java
 
b/core/src/main/java/org/apache/calcite/interpreter/NoneToBindableConverterRule.java
index ab41cac..e352ca1 100644
--- 
a/core/src/main/java/org/apache/calcite/interpreter/NoneToBindableConverterRule.java
+++ 
b/core/src/main/java/org/apache/calcite/interpreter/NoneToBindableConverterRule.java
@@ -20,6 +20,10 @@ import org.apache.calcite.plan.Convention;
 import org.apache.calcite.plan.RelTraitSet;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.convert.ConverterRule;
+import org.apache.calcite.rel.core.RelFactories;
+import org.apache.calcite.tools.RelBuilderFactory;
+
+import com.google.common.base.Predicates;
 
 /**
  * Rule to convert a relational expression from
@@ -28,10 +32,16 @@ import org.apache.calcite.rel.convert.ConverterRule;
  */
 public class NoneToBindableConverterRule extends ConverterRule {
   public static final ConverterRule INSTANCE =
-      new NoneToBindableConverterRule();
+      new NoneToBindableConverterRule(RelFactories.LOGICAL_BUILDER);
 
-  private NoneToBindableConverterRule() {
-    super(RelNode.class, Convention.NONE, BindableConvention.INSTANCE,
+  /**
+   * Creates a NoneToBindableConverterRule.
+   *
+   * @param relBuilderFactory Builder for relational expressions
+   */
+  public NoneToBindableConverterRule(RelBuilderFactory relBuilderFactory) {
+    super(RelNode.class, Predicates.<RelNode>alwaysTrue(), Convention.NONE,
+        BindableConvention.INSTANCE, relBuilderFactory,
         "NoneToBindableConverterRule");
   }
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java 
b/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java
index 7129ccb..d18527b 100644
--- a/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java
+++ b/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java
@@ -1545,12 +1545,18 @@ public class SubstitutionVisitor {
         };
 
     public static final FilterOnProjectRule INSTANCE =
-        new FilterOnProjectRule();
+        new FilterOnProjectRule(RelFactories.LOGICAL_BUILDER);
 
-    private FilterOnProjectRule() {
+    /**
+     * Creates a FilterOnProjectRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
+     */
+    public FilterOnProjectRule(RelBuilderFactory relBuilderFactory) {
       super(
           operand(LogicalFilter.class, null, PREDICATE,
-              some(operand(LogicalProject.class, any()))));
+              some(operand(LogicalProject.class, any()))),
+          relBuilderFactory, null);
     }
 
     public void onMatch(RelOptRuleCall call) {

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/plan/hep/HepPlanner.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/plan/hep/HepPlanner.java 
b/core/src/main/java/org/apache/calcite/plan/hep/HepPlanner.java
index 33e4056..410ef27 100644
--- a/core/src/main/java/org/apache/calcite/plan/hep/HepPlanner.java
+++ b/core/src/main/java/org/apache/calcite/plan/hep/HepPlanner.java
@@ -33,6 +33,7 @@ import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.convert.Converter;
 import org.apache.calcite.rel.convert.ConverterRule;
 import org.apache.calcite.rel.convert.TraitMatchingRule;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.metadata.RelMetadataProvider;
 import org.apache.calcite.rel.metadata.RelMetadataQuery;
 import org.apache.calcite.util.Pair;
@@ -307,7 +308,8 @@ public class HepPlanner extends AbstractRelOptPlanner {
         instruction.ruleSet.add(converter);
         if (!instruction.guaranteed) {
           // Add a TraitMatchingRule to work bottom-up
-          instruction.ruleSet.add(new TraitMatchingRule(converter));
+          instruction.ruleSet.add(
+              new TraitMatchingRule(converter, RelFactories.LOGICAL_BUILDER));
         }
       }
     }

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/plan/volcano/AbstractConverter.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/plan/volcano/AbstractConverter.java 
b/core/src/main/java/org/apache/calcite/plan/volcano/AbstractConverter.java
index 42604c9..5c36ad1 100644
--- a/core/src/main/java/org/apache/calcite/plan/volcano/AbstractConverter.java
+++ b/core/src/main/java/org/apache/calcite/plan/volcano/AbstractConverter.java
@@ -27,7 +27,9 @@ import org.apache.calcite.plan.RelTraitSet;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.RelWriter;
 import org.apache.calcite.rel.convert.ConverterImpl;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.metadata.RelMetadataQuery;
+import org.apache.calcite.tools.RelBuilderFactory;
 
 import java.util.List;
 
@@ -100,13 +102,15 @@ public class AbstractConverter extends ConverterImpl {
    */
   public static class ExpandConversionRule extends RelOptRule {
     public static final ExpandConversionRule INSTANCE =
-        new ExpandConversionRule();
+        new ExpandConversionRule(RelFactories.LOGICAL_BUILDER);
 
     /**
      * Creates an ExpandConversionRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
      */
-    private ExpandConversionRule() {
-      super(operand(AbstractConverter.class, any()));
+    public ExpandConversionRule(RelBuilderFactory relBuilderFactory) {
+      super(operand(AbstractConverter.class, any()), relBuilderFactory, null);
     }
 
     public void onMatch(RelOptRuleCall call) {

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/convert/ConverterRule.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/rel/convert/ConverterRule.java 
b/core/src/main/java/org/apache/calcite/rel/convert/ConverterRule.java
index 7761488..ef8d629 100644
--- a/core/src/main/java/org/apache/calcite/rel/convert/ConverterRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/convert/ConverterRule.java
@@ -22,6 +22,8 @@ import org.apache.calcite.plan.RelOptRuleCall;
 import org.apache.calcite.plan.RelTrait;
 import org.apache.calcite.plan.RelTraitDef;
 import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.core.RelFactories;
+import org.apache.calcite.tools.RelBuilderFactory;
 
 import com.google.common.base.Preconditions;
 import com.google.common.base.Predicate;
@@ -49,7 +51,15 @@ public abstract class ConverterRule extends RelOptRule {
    */
   public ConverterRule(Class<? extends RelNode> clazz, RelTrait in,
       RelTrait out, String description) {
-    this(clazz, Predicates.<RelNode>alwaysTrue(), in, out, description);
+    this(clazz, Predicates.<RelNode>alwaysTrue(), in, out,
+        RelFactories.LOGICAL_BUILDER, description);
+  }
+
+  @Deprecated // to be removed before 2.0
+  public <R extends RelNode> ConverterRule(Class<R> clazz,
+      Predicate<? super R> predicate, RelTrait in, RelTrait out,
+      String description) {
+    this(clazz, predicate, in, out, RelFactories.LOGICAL_BUILDER, description);
   }
 
   /**
@@ -59,12 +69,14 @@ public abstract class ConverterRule extends RelOptRule {
    * @param predicate   Predicate on the relational expression
    * @param in          Trait of relational expression to consider converting
    * @param out         Trait which is converted to
+   * @param relBuilderFactory Builder for relational expressions
    * @param description Description of rule
    */
   public <R extends RelNode> ConverterRule(Class<R> clazz,
       Predicate<? super R> predicate, RelTrait in, RelTrait out,
-      String description) {
+      RelBuilderFactory relBuilderFactory, String description) {
     super(convertOperand(clazz, predicate, in),
+        relBuilderFactory,
         description == null
             ? "ConverterRule<in=" + in + ",out=" + out + ">"
             : description);

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/convert/TraitMatchingRule.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/rel/convert/TraitMatchingRule.java 
b/core/src/main/java/org/apache/calcite/rel/convert/TraitMatchingRule.java
index 63f621c..0fb14c9 100644
--- a/core/src/main/java/org/apache/calcite/rel/convert/TraitMatchingRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/convert/TraitMatchingRule.java
@@ -21,6 +21,8 @@ import org.apache.calcite.plan.RelOptRule;
 import org.apache.calcite.plan.RelOptRuleCall;
 import org.apache.calcite.plan.RelOptRuleOperandChildPolicy;
 import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.core.RelFactories;
+import org.apache.calcite.tools.RelBuilderFactory;
 
 /**
  * TraitMatchingRule adapts a converter rule, restricting it to fire only when
@@ -35,17 +37,25 @@ public class TraitMatchingRule extends RelOptRule {
 
   //~ Constructors -----------------------------------------------------------
 
+  @Deprecated // to be removed before 2.0
+  public TraitMatchingRule(ConverterRule converterRule) {
+    this(converterRule, RelFactories.LOGICAL_BUILDER);
+  }
+
   /**
-   * Creates a new TraitMatchingRule.
+   * Creates a TraitMatchingRule.
    *
-   * @param converterRule rule to be restricted; rule must take a single
-   *                      operand expecting a single input
+   * @param converterRule     Rule to be restricted; rule must take a single
+   *                          operand expecting a single input
+   * @param relBuilderFactory Builder for relational expressions
    */
-  public TraitMatchingRule(ConverterRule converterRule) {
+  public TraitMatchingRule(ConverterRule converterRule,
+      RelBuilderFactory relBuilderFactory) {
     super(
         operand(
             converterRule.getOperand().getMatchedClass(),
             operand(RelNode.class, any())),
+        relBuilderFactory,
         "TraitMatchingRule: " + converterRule);
     assert converterRule.getOperand().childPolicy
         == RelOptRuleOperandChildPolicy.ANY;
@@ -54,8 +64,7 @@ public class TraitMatchingRule extends RelOptRule {
 
   //~ Methods ----------------------------------------------------------------
 
-  // implement RelOptRule
-  public Convention getOutConvention() {
+  @Override public Convention getOutConvention() {
     return converter.getOutConvention();
   }
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/AggregateFilterTransposeRule.java
----------------------------------------------------------------------
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 abe17bc..68a047d 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
@@ -66,7 +66,8 @@ public class AggregateFilterTransposeRule extends RelOptRule {
         RelFactories.LOGICAL_BUILDER);
   }
 
-  protected AggregateFilterTransposeRule(RelOptRuleOperand operand,
+  /** Creates an AggregateFilterTransposeRule. */
+  public AggregateFilterTransposeRule(RelOptRuleOperand operand,
       RelBuilderFactory relBuilderFactory) {
     super(operand, relBuilderFactory, null);
   }

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/AggregateReduceFunctionsRule.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/rel/rules/AggregateReduceFunctionsRule.java
 
b/core/src/main/java/org/apache/calcite/rel/rules/AggregateReduceFunctionsRule.java
index 746e1f4..957af1e 100644
--- 
a/core/src/main/java/org/apache/calcite/rel/rules/AggregateReduceFunctionsRule.java
+++ 
b/core/src/main/java/org/apache/calcite/rel/rules/AggregateReduceFunctionsRule.java
@@ -89,7 +89,8 @@ public class AggregateReduceFunctionsRule extends RelOptRule {
 
   //~ Constructors -----------------------------------------------------------
 
-  protected AggregateReduceFunctionsRule(RelOptRuleOperand operand,
+  /** Creates an AggregateReduceFunctionsRule. */
+  public AggregateReduceFunctionsRule(RelOptRuleOperand operand,
       RelBuilderFactory relBuilderFactory) {
     super(operand, relBuilderFactory, null);
   }

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/AggregateRemoveRule.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/rel/rules/AggregateRemoveRule.java 
b/core/src/main/java/org/apache/calcite/rel/rules/AggregateRemoveRule.java
index 46a5826..11a6d1c 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/AggregateRemoveRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/AggregateRemoveRule.java
@@ -20,10 +20,12 @@ import org.apache.calcite.plan.RelOptRule;
 import org.apache.calcite.plan.RelOptRuleCall;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.core.Aggregate;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.logical.LogicalAggregate;
 import org.apache.calcite.rel.metadata.RelMetadataQuery;
 import org.apache.calcite.runtime.SqlFunctions;
 import org.apache.calcite.tools.RelBuilder;
+import org.apache.calcite.tools.RelBuilderFactory;
 
 /**
  * Planner rule that removes
@@ -34,14 +36,21 @@ import org.apache.calcite.tools.RelBuilder;
  */
 public class AggregateRemoveRule extends RelOptRule {
   public static final AggregateRemoveRule INSTANCE =
-      new AggregateRemoveRule(LogicalAggregate.class);
+      new AggregateRemoveRule(LogicalAggregate.class,
+          RelFactories.LOGICAL_BUILDER);
 
   //~ Constructors -----------------------------------------------------------
 
+  @Deprecated // to be removed before 2.0
+  public AggregateRemoveRule(Class<? extends Aggregate> aggregateClass) {
+    this(aggregateClass, RelFactories.LOGICAL_BUILDER);
+  }
+
   /**
-   * Creates a AggregateRemoveRule.
+   * Creates an AggregateRemoveRule.
    */
-  public AggregateRemoveRule(Class<? extends Aggregate> aggregateClass) {
+  public AggregateRemoveRule(Class<? extends Aggregate> aggregateClass,
+      RelBuilderFactory relBuilderFactory) {
     // REVIEW jvs 14-Mar-2006: We have to explicitly mention the child here
     // to make sure the rule re-fires after the child changes (e.g. via
     // ProjectRemoveRule), since that may change our information
@@ -50,7 +59,8 @@ public class AggregateRemoveRule extends RelOptRule {
     // to the child here.
     super(
         operand(aggregateClass,
-            operand(RelNode.class, any())));
+            operand(RelNode.class, any())),
+        relBuilderFactory, null);
   }
 
   //~ Methods ----------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/AggregateStarTableRule.java
----------------------------------------------------------------------
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 51ae97f..22ee628 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
@@ -33,12 +33,14 @@ import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.core.Aggregate;
 import org.apache.calcite.rel.core.AggregateCall;
 import org.apache.calcite.rel.core.Project;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.metadata.RelMetadataQuery;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.schema.Table;
 import org.apache.calcite.schema.impl.StarTable;
 import org.apache.calcite.sql.SqlAggFunction;
 import org.apache.calcite.tools.RelBuilder;
+import org.apache.calcite.tools.RelBuilderFactory;
 import org.apache.calcite.util.ImmutableBitSet;
 import org.apache.calcite.util.Pair;
 import org.apache.calcite.util.mapping.AbstractSourceMapping;
@@ -60,6 +62,7 @@ public class AggregateStarTableRule extends RelOptRule {
       new AggregateStarTableRule(
           operand(Aggregate.class, null, Aggregate.IS_SIMPLE,
               some(operand(StarTable.StarTableScan.class, none()))),
+          RelFactories.LOGICAL_BUILDER,
           "AggregateStarTableRule");
 
   public static final AggregateStarTableRule INSTANCE2 =
@@ -67,6 +70,7 @@ public class AggregateStarTableRule extends RelOptRule {
           operand(Aggregate.class, null, Aggregate.IS_SIMPLE,
               operand(Project.class,
                   operand(StarTable.StarTableScan.class, none()))),
+          RelFactories.LOGICAL_BUILDER,
           "AggregateStarTableRule:project") {
         @Override public void onMatch(RelOptRuleCall call) {
           final Aggregate aggregate = call.rel(0);
@@ -89,9 +93,16 @@ public class AggregateStarTableRule extends RelOptRule {
         }
       };
 
-  private AggregateStarTableRule(RelOptRuleOperand operand,
-      String description) {
-    super(operand, description);
+  /**
+   * Creates an AggregateStarTableRule.
+   *
+   * @param operand           root operand, must not be null
+   * @param description       Description, or null to guess description
+   * @param relBuilderFactory Builder for relational expressions
+   */
+  public AggregateStarTableRule(RelOptRuleOperand operand,
+      RelBuilderFactory relBuilderFactory, String description) {
+    super(operand, relBuilderFactory, description);
   }
 
   @Override public void onMatch(RelOptRuleCall call) {

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/AggregateValuesRule.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/rel/rules/AggregateValuesRule.java 
b/core/src/main/java/org/apache/calcite/rel/rules/AggregateValuesRule.java
index 654a86a..db31937 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/AggregateValuesRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/AggregateValuesRule.java
@@ -20,10 +20,12 @@ import org.apache.calcite.plan.RelOptRule;
 import org.apache.calcite.plan.RelOptRuleCall;
 import org.apache.calcite.rel.core.Aggregate;
 import org.apache.calcite.rel.core.AggregateCall;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.core.Values;
 import org.apache.calcite.rex.RexBuilder;
 import org.apache.calcite.rex.RexLiteral;
 import org.apache.calcite.tools.RelBuilder;
+import org.apache.calcite.tools.RelBuilderFactory;
 import org.apache.calcite.util.Util;
 
 import com.google.common.base.Predicates;
@@ -52,12 +54,19 @@ import java.util.List;
  * value, and each group will consist of at least one row.
  */
 public class AggregateValuesRule extends RelOptRule {
-  public static final AggregateValuesRule INSTANCE = new AggregateValuesRule();
+  public static final AggregateValuesRule INSTANCE =
+      new AggregateValuesRule(RelFactories.LOGICAL_BUILDER);
 
-  private AggregateValuesRule() {
+  /**
+   * Creates an AggregateValuesRule.
+   *
+   * @param relBuilderFactory Builder for relational expressions
+   */
+  public AggregateValuesRule(RelBuilderFactory relBuilderFactory) {
     super(
         operand(Aggregate.class, null, 
Predicates.not(Aggregate.IS_NOT_GRAND_TOTAL),
-            operand(Values.class, null, Values.IS_EMPTY, none())));
+            operand(Values.class, null, Values.IS_EMPTY, none())),
+        relBuilderFactory, null);
   }
 
   @Override public void onMatch(RelOptRuleCall call) {

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/CalcMergeRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/CalcMergeRule.java 
b/core/src/main/java/org/apache/calcite/rel/rules/CalcMergeRule.java
index d218553..0173c3f 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/CalcMergeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/CalcMergeRule.java
@@ -19,9 +19,11 @@ package org.apache.calcite.rel.rules;
 import org.apache.calcite.plan.RelOptRule;
 import org.apache.calcite.plan.RelOptRuleCall;
 import org.apache.calcite.rel.core.Calc;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rex.RexOver;
 import org.apache.calcite.rex.RexProgram;
 import org.apache.calcite.rex.RexProgramBuilder;
+import org.apache.calcite.tools.RelBuilderFactory;
 
 /**
  * Planner rule that merges a
@@ -36,15 +38,22 @@ import org.apache.calcite.rex.RexProgramBuilder;
 public class CalcMergeRule extends RelOptRule {
   //~ Static fields/initializers ---------------------------------------------
 
-  public static final CalcMergeRule INSTANCE = new CalcMergeRule();
+  public static final CalcMergeRule INSTANCE =
+      new CalcMergeRule(RelFactories.LOGICAL_BUILDER);
 
   //~ Constructors -----------------------------------------------------------
 
-  private CalcMergeRule() {
+  /**
+   * Creates a CalcMergeRule.
+   *
+   * @param relBuilderFactory Builder for relational expressions
+   */
+  public CalcMergeRule(RelBuilderFactory relBuilderFactory) {
     super(
         operand(
             Calc.class,
-            operand(Calc.class, any())));
+            operand(Calc.class, any())),
+        relBuilderFactory, null);
   }
 
   //~ Methods ----------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/CalcRemoveRule.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/rel/rules/CalcRemoveRule.java 
b/core/src/main/java/org/apache/calcite/rel/rules/CalcRemoveRule.java
index cbbd011..0a8869c 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/CalcRemoveRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/CalcRemoveRule.java
@@ -19,8 +19,10 @@ package org.apache.calcite.rel.rules;
 import org.apache.calcite.plan.RelOptRule;
 import org.apache.calcite.plan.RelOptRuleCall;
 import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.logical.LogicalCalc;
 import org.apache.calcite.rex.RexProgram;
+import org.apache.calcite.tools.RelBuilderFactory;
 
 /**
  * Planner rule that removes a trivial
@@ -36,12 +38,17 @@ public class CalcRemoveRule extends RelOptRule {
   //~ Static fields/initializers ---------------------------------------------
 
   public static final CalcRemoveRule INSTANCE =
-      new CalcRemoveRule();
+      new CalcRemoveRule(RelFactories.LOGICAL_BUILDER);
 
   //~ Constructors -----------------------------------------------------------
 
-  private CalcRemoveRule() {
-    super(operand(LogicalCalc.class, any()));
+  /**
+   * Creates a CalcRemoveRule.
+   *
+   * @param relBuilderFactory Builder for relational expressions
+   */
+  public CalcRemoveRule(RelBuilderFactory relBuilderFactory) {
+    super(operand(LogicalCalc.class, any()), relBuilderFactory, null);
   }
 
   //~ Methods ----------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/CalcSplitRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/CalcSplitRule.java 
b/core/src/main/java/org/apache/calcite/rel/rules/CalcSplitRule.java
index 359ade9..01b7c91 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/CalcSplitRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/CalcSplitRule.java
@@ -42,7 +42,12 @@ public class CalcSplitRule extends RelOptRule {
   public static final CalcSplitRule INSTANCE =
       new CalcSplitRule(RelFactories.LOGICAL_BUILDER);
 
-  private CalcSplitRule(RelBuilderFactory relBuilderFactory) {
+  /**
+   * Creates a CalcSplitRule.
+   *
+   * @param relBuilderFactory Builder for relational expressions
+   */
+  public CalcSplitRule(RelBuilderFactory relBuilderFactory) {
     super(operand(Calc.class, any()), relBuilderFactory, null);
   }
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/CoerceInputsRule.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/rel/rules/CoerceInputsRule.java 
b/core/src/main/java/org/apache/calcite/rel/rules/CoerceInputsRule.java
index 5f489b9..c6e839f 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/CoerceInputsRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/CoerceInputsRule.java
@@ -21,13 +21,15 @@ import org.apache.calcite.plan.RelOptRule;
 import org.apache.calcite.plan.RelOptRuleCall;
 import org.apache.calcite.plan.RelOptUtil;
 import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.type.RelDataType;
+import org.apache.calcite.tools.RelBuilderFactory;
 
 import java.util.ArrayList;
 import java.util.List;
 
 /**
- * CoerceInputsRule precasts inputs to a particular type. This can be used to
+ * CoerceInputsRule pre-casts inputs to a particular type. This can be used to
  * assist operator implementations which impose requirements on their input
  * types.
  */
@@ -40,18 +42,26 @@ public class CoerceInputsRule extends RelOptRule {
 
   //~ Constructors -----------------------------------------------------------
 
-  /**
-   * Constructs the rule.
-   *
-   * @param consumerRelClass the RelNode class which will consume the inputs
-   * @param coerceNames      if true, coerce names and types; if false, coerce
-   *                         type only
-   */
+  @Deprecated // to be removed before 2.0
   public CoerceInputsRule(
       Class<? extends RelNode> consumerRelClass,
       boolean coerceNames) {
+    this(consumerRelClass, coerceNames, RelFactories.LOGICAL_BUILDER);
+  }
+
+  /**
+   * Creates a CoerceInputsRule.
+   *
+   * @param consumerRelClass  Class of RelNode that will consume the inputs
+   * @param coerceNames       If true, coerce names and types; if false, coerce
+   *                          type only
+   * @param relBuilderFactory Builder for relational expressions
+   */
+  public CoerceInputsRule(Class<? extends RelNode> consumerRelClass,
+      boolean coerceNames, RelBuilderFactory relBuilderFactory) {
     super(
         operand(consumerRelClass, any()),
+        relBuilderFactory,
         "CoerceInputsRule:" + consumerRelClass.getName());
     this.consumerRelClass = consumerRelClass;
     this.coerceNames = coerceNames;
@@ -59,12 +69,10 @@ public class CoerceInputsRule extends RelOptRule {
 
   //~ Methods ----------------------------------------------------------------
 
-  // implement RelOptRule
-  public Convention getOutConvention() {
+  @Override public Convention getOutConvention() {
     return Convention.NONE;
   }
 
-  // implement RelOptRule
   public void onMatch(RelOptRuleCall call) {
     RelNode consumerRel = call.rel(0);
     if (consumerRel.getClass() != consumerRelClass) {
@@ -72,7 +80,7 @@ public class CoerceInputsRule extends RelOptRule {
       return;
     }
     List<RelNode> inputs = consumerRel.getInputs();
-    List<RelNode> newInputs = new ArrayList<RelNode>(inputs);
+    List<RelNode> newInputs = new ArrayList<>(inputs);
     boolean coerce = false;
     for (int i = 0; i < inputs.size(); ++i) {
       RelDataType expectedType = consumerRel.getExpectedInputRowType(i);

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/FilterCalcMergeRule.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/rel/rules/FilterCalcMergeRule.java 
b/core/src/main/java/org/apache/calcite/rel/rules/FilterCalcMergeRule.java
index 7f5191b..b422763 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/FilterCalcMergeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/FilterCalcMergeRule.java
@@ -19,11 +19,13 @@ package org.apache.calcite.rel.rules;
 import org.apache.calcite.plan.RelOptRule;
 import org.apache.calcite.plan.RelOptRuleCall;
 import org.apache.calcite.rel.core.Filter;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.logical.LogicalCalc;
 import org.apache.calcite.rel.logical.LogicalFilter;
 import org.apache.calcite.rex.RexBuilder;
 import org.apache.calcite.rex.RexProgram;
 import org.apache.calcite.rex.RexProgramBuilder;
+import org.apache.calcite.tools.RelBuilderFactory;
 
 /**
  * Planner rule that merges a
@@ -38,15 +40,21 @@ public class FilterCalcMergeRule extends RelOptRule {
   //~ Static fields/initializers ---------------------------------------------
 
   public static final FilterCalcMergeRule INSTANCE =
-      new FilterCalcMergeRule();
+      new FilterCalcMergeRule(RelFactories.LOGICAL_BUILDER);
 
   //~ Constructors -----------------------------------------------------------
 
-  private FilterCalcMergeRule() {
+  /**
+   * Creates a FilterCalcMergeRule.
+   *
+   * @param relBuilderFactory Builder for relational expressions
+   */
+  public FilterCalcMergeRule(RelBuilderFactory relBuilderFactory) {
     super(
         operand(
             Filter.class,
-            operand(LogicalCalc.class, any())));
+            operand(LogicalCalc.class, any())),
+        relBuilderFactory, null);
   }
 
   //~ Methods ----------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/FilterMultiJoinMergeRule.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/rel/rules/FilterMultiJoinMergeRule.java 
b/core/src/main/java/org/apache/calcite/rel/rules/FilterMultiJoinMergeRule.java
index fe446d1..73f24aa 100644
--- 
a/core/src/main/java/org/apache/calcite/rel/rules/FilterMultiJoinMergeRule.java
+++ 
b/core/src/main/java/org/apache/calcite/rel/rules/FilterMultiJoinMergeRule.java
@@ -18,7 +18,9 @@ package org.apache.calcite.rel.rules;
 
 import org.apache.calcite.plan.RelOptRule;
 import org.apache.calcite.plan.RelOptRuleCall;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.logical.LogicalFilter;
+import org.apache.calcite.tools.RelBuilderFactory;
 
 /**
  * Planner rule that merges a
@@ -30,17 +32,18 @@ import org.apache.calcite.rel.logical.LogicalFilter;
  */
 public class FilterMultiJoinMergeRule extends RelOptRule {
   public static final FilterMultiJoinMergeRule INSTANCE =
-      new FilterMultiJoinMergeRule();
+      new FilterMultiJoinMergeRule(RelFactories.LOGICAL_BUILDER);
 
   //~ Constructors -----------------------------------------------------------
 
   /**
    * Creates a FilterMultiJoinMergeRule.
    */
-  private FilterMultiJoinMergeRule() {
+  public FilterMultiJoinMergeRule(RelBuilderFactory relBuilderFactory) {
     super(
         operand(LogicalFilter.class,
-            operand(MultiJoin.class, any())));
+            operand(MultiJoin.class, any())),
+        relBuilderFactory, null);
   }
 
   //~ Methods ----------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/FilterRemoveIsNotDistinctFromRule.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/rel/rules/FilterRemoveIsNotDistinctFromRule.java
 
b/core/src/main/java/org/apache/calcite/rel/rules/FilterRemoveIsNotDistinctFromRule.java
index adfb14d..5739ed9 100644
--- 
a/core/src/main/java/org/apache/calcite/rel/rules/FilterRemoveIsNotDistinctFromRule.java
+++ 
b/core/src/main/java/org/apache/calcite/rel/rules/FilterRemoveIsNotDistinctFromRule.java
@@ -28,6 +28,7 @@ import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.rex.RexShuttle;
 import org.apache.calcite.rex.RexUtil;
 import org.apache.calcite.sql.fun.SqlStdOperatorTable;
+import org.apache.calcite.tools.RelBuilderFactory;
 
 /**
  * Planner rule that replaces {@code IS NOT DISTINCT FROM}
@@ -41,12 +42,18 @@ public final class FilterRemoveIsNotDistinctFromRule 
extends RelOptRule {
 
   /** The singleton. */
   public static final FilterRemoveIsNotDistinctFromRule INSTANCE =
-      new FilterRemoveIsNotDistinctFromRule();
+      new FilterRemoveIsNotDistinctFromRule(RelFactories.LOGICAL_BUILDER);
 
   //~ Constructors -----------------------------------------------------------
 
-  private FilterRemoveIsNotDistinctFromRule() {
-    super(operand(LogicalFilter.class, any()));
+  /**
+   * Creates a FilterRemoveIsNotDistinctFromRule.
+   *
+   * @param relBuilderFactory Builder for relational expressions
+   */
+  public FilterRemoveIsNotDistinctFromRule(
+      RelBuilderFactory relBuilderFactory) {
+    super(operand(LogicalFilter.class, any()), relBuilderFactory, null);
   }
 
   //~ Methods ----------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/FilterTableFunctionTransposeRule.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/rel/rules/FilterTableFunctionTransposeRule.java
 
b/core/src/main/java/org/apache/calcite/rel/rules/FilterTableFunctionTransposeRule.java
index 3f517ab..a151487 100644
--- 
a/core/src/main/java/org/apache/calcite/rel/rules/FilterTableFunctionTransposeRule.java
+++ 
b/core/src/main/java/org/apache/calcite/rel/rules/FilterTableFunctionTransposeRule.java
@@ -21,12 +21,14 @@ import org.apache.calcite.plan.RelOptRule;
 import org.apache.calcite.plan.RelOptRuleCall;
 import org.apache.calcite.plan.RelOptUtil;
 import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.logical.LogicalFilter;
 import org.apache.calcite.rel.logical.LogicalTableFunctionScan;
 import org.apache.calcite.rel.metadata.RelColumnMapping;
 import org.apache.calcite.rel.type.RelDataTypeField;
 import org.apache.calcite.rex.RexBuilder;
 import org.apache.calcite.rex.RexNode;
+import org.apache.calcite.tools.RelBuilderFactory;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -39,17 +41,18 @@ import java.util.Set;
  */
 public class FilterTableFunctionTransposeRule extends RelOptRule {
   public static final FilterTableFunctionTransposeRule INSTANCE =
-      new FilterTableFunctionTransposeRule();
+      new FilterTableFunctionTransposeRule(RelFactories.LOGICAL_BUILDER);
 
   //~ Constructors -----------------------------------------------------------
 
   /**
    * Creates a FilterTableFunctionTransposeRule.
    */
-  private FilterTableFunctionTransposeRule() {
+  public FilterTableFunctionTransposeRule(RelBuilderFactory relBuilderFactory) 
{
     super(
         operand(LogicalFilter.class,
-            operand(LogicalTableFunctionScan.class, any())));
+            operand(LogicalTableFunctionScan.class, any())),
+        relBuilderFactory, null);
   }
 
   //~ Methods ----------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/FilterTableScanRule.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/rel/rules/FilterTableScanRule.java 
b/core/src/main/java/org/apache/calcite/rel/rules/FilterTableScanRule.java
index d090d79..1a52eec 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/FilterTableScanRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/FilterTableScanRule.java
@@ -23,12 +23,14 @@ import org.apache.calcite.plan.RelOptRuleCall;
 import org.apache.calcite.plan.RelOptRuleOperand;
 import org.apache.calcite.plan.RelOptTable;
 import org.apache.calcite.rel.core.Filter;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.core.TableScan;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.rex.RexUtil;
 import org.apache.calcite.runtime.PredicateImpl;
 import org.apache.calcite.schema.FilterableTable;
 import org.apache.calcite.schema.ProjectableFilterableTable;
+import org.apache.calcite.tools.RelBuilderFactory;
 import org.apache.calcite.util.ImmutableIntList;
 import org.apache.calcite.util.mapping.Mapping;
 import org.apache.calcite.util.mapping.Mappings;
@@ -66,7 +68,8 @@ public abstract class FilterTableScanRule extends RelOptRule {
       new FilterTableScanRule(
           operand(Filter.class,
               operand(TableScan.class, null, PREDICATE, none())),
-          "FilterTableRule") {
+          RelFactories.LOGICAL_BUILDER,
+          "FilterTableScanRule") {
         public void onMatch(RelOptRuleCall call) {
           final Filter filter = call.rel(0);
           final TableScan scan = call.rel(1);
@@ -80,7 +83,8 @@ public abstract class FilterTableScanRule extends RelOptRule {
           operand(Filter.class,
               operand(EnumerableInterpreter.class,
                   operand(TableScan.class, null, PREDICATE, none()))),
-          "FilterTableRule:interpreter") {
+          RelFactories.LOGICAL_BUILDER,
+          "FilterTableScanRule:interpreter") {
         public void onMatch(RelOptRuleCall call) {
           final Filter filter = call.rel(0);
           final TableScan scan = call.rel(2);
@@ -90,9 +94,15 @@ public abstract class FilterTableScanRule extends RelOptRule 
{
 
   //~ Constructors -----------------------------------------------------------
 
-  /** Creates a FilterTableRule. */
+  @Deprecated // to be removed before 2.0
   protected FilterTableScanRule(RelOptRuleOperand operand, String description) 
{
-    super(operand, description);
+    this(operand, RelFactories.LOGICAL_BUILDER, description);
+  }
+
+  /** Creates a FilterTableScanRule. */
+  protected FilterTableScanRule(RelOptRuleOperand operand,
+      RelBuilderFactory relBuilderFactory, String description) {
+    super(operand, relBuilderFactory, description);
   }
 
   //~ Methods ----------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/FilterToCalcRule.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/rel/rules/FilterToCalcRule.java 
b/core/src/main/java/org/apache/calcite/rel/rules/FilterToCalcRule.java
index 2e7feaf..d8d1a49 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/FilterToCalcRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/FilterToCalcRule.java
@@ -19,12 +19,14 @@ package org.apache.calcite.rel.rules;
 import org.apache.calcite.plan.RelOptRule;
 import org.apache.calcite.plan.RelOptRuleCall;
 import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.logical.LogicalCalc;
 import org.apache.calcite.rel.logical.LogicalFilter;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rex.RexBuilder;
 import org.apache.calcite.rex.RexProgram;
 import org.apache.calcite.rex.RexProgramBuilder;
+import org.apache.calcite.tools.RelBuilderFactory;
 
 /**
  * Planner rule that converts a
@@ -43,12 +45,18 @@ import org.apache.calcite.rex.RexProgramBuilder;
 public class FilterToCalcRule extends RelOptRule {
   //~ Static fields/initializers ---------------------------------------------
 
-  public static final FilterToCalcRule INSTANCE = new FilterToCalcRule();
+  public static final FilterToCalcRule INSTANCE =
+      new FilterToCalcRule(RelFactories.LOGICAL_BUILDER);
 
   //~ Constructors -----------------------------------------------------------
 
-  private FilterToCalcRule() {
-    super(operand(LogicalFilter.class, any()));
+  /**
+   * Creates a FilterToCalcRule.
+   *
+   * @param relBuilderFactory Builder for relational expressions
+   */
+  public FilterToCalcRule(RelBuilderFactory relBuilderFactory) {
+    super(operand(LogicalFilter.class, any()), relBuilderFactory, null);
   }
 
   //~ Methods ----------------------------------------------------------------

Reply via email to