You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2017/11/15 19:49:30 UTC

[2/4] calcite git commit: [CALCITE-2043] Use custom RelBuilder implementation in some rules (Volodymyr Vysotskyi)

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/JoinAddRedundantSemiJoinRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/JoinAddRedundantSemiJoinRule.java b/core/src/main/java/org/apache/calcite/rel/rules/JoinAddRedundantSemiJoinRule.java
index ae68a91..494ab78 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/JoinAddRedundantSemiJoinRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/JoinAddRedundantSemiJoinRule.java
@@ -22,8 +22,10 @@ import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.core.Join;
 import org.apache.calcite.rel.core.JoinInfo;
 import org.apache.calcite.rel.core.JoinRelType;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.core.SemiJoin;
 import org.apache.calcite.rel.logical.LogicalJoin;
+import org.apache.calcite.tools.RelBuilderFactory;
 
 /**
  * Rule to add a semi-join into a join. Transformation is as follows:
@@ -36,15 +38,17 @@ import org.apache.calcite.rel.logical.LogicalJoin;
  */
 public class JoinAddRedundantSemiJoinRule extends RelOptRule {
   public static final JoinAddRedundantSemiJoinRule INSTANCE =
-      new JoinAddRedundantSemiJoinRule(LogicalJoin.class);
+      new JoinAddRedundantSemiJoinRule(LogicalJoin.class,
+          RelFactories.LOGICAL_BUILDER);
 
   //~ Constructors -----------------------------------------------------------
 
   /**
    * Creates an JoinAddRedundantSemiJoinRule.
    */
-  private JoinAddRedundantSemiJoinRule(Class<? extends Join> clazz) {
-    super(operand(clazz, any()));
+  public JoinAddRedundantSemiJoinRule(Class<? extends Join> clazz,
+      RelBuilderFactory relBuilderFactory) {
+    super(operand(clazz, any()), relBuilderFactory, null);
   }
 
   //~ Methods ----------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/JoinAssociateRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/JoinAssociateRule.java b/core/src/main/java/org/apache/calcite/rel/rules/JoinAssociateRule.java
index 455176f..ad6b3c6 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/JoinAssociateRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/JoinAssociateRule.java
@@ -23,10 +23,12 @@ import org.apache.calcite.plan.volcano.RelSubset;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.core.Join;
 import org.apache.calcite.rel.core.JoinRelType;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rex.RexBuilder;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.rex.RexPermuteInputsShuttle;
 import org.apache.calcite.rex.RexUtil;
+import org.apache.calcite.tools.RelBuilderFactory;
 import org.apache.calcite.util.ImmutableBitSet;
 import org.apache.calcite.util.mapping.Mappings;
 
@@ -49,18 +51,20 @@ public class JoinAssociateRule extends RelOptRule {
   //~ Static fields/initializers ---------------------------------------------
 
   /** The singleton. */
-  public static final JoinAssociateRule INSTANCE = new JoinAssociateRule();
+  public static final JoinAssociateRule INSTANCE =
+      new JoinAssociateRule(RelFactories.LOGICAL_BUILDER);
 
   //~ Constructors -----------------------------------------------------------
 
   /**
    * Creates a JoinAssociateRule.
    */
-  private JoinAssociateRule() {
+  public JoinAssociateRule(RelBuilderFactory relBuilderFactory) {
     super(
         operand(Join.class,
             operand(Join.class, any()),
-            operand(RelSubset.class, any())));
+            operand(RelSubset.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/JoinExtractFilterRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/JoinExtractFilterRule.java b/core/src/main/java/org/apache/calcite/rel/rules/JoinExtractFilterRule.java
index 8d3f665..8c4a02d 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/JoinExtractFilterRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/JoinExtractFilterRule.java
@@ -23,6 +23,7 @@ import org.apache.calcite.rel.core.Join;
 import org.apache.calcite.rel.core.JoinRelType;
 import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.logical.LogicalJoin;
+import org.apache.calcite.tools.RelBuilderFactory;
 
 /**
  * Rule to convert an
@@ -43,15 +44,25 @@ public final class JoinExtractFilterRule extends RelOptRule {
 
   /** The singleton. */
   public static final JoinExtractFilterRule INSTANCE =
-      new JoinExtractFilterRule(LogicalJoin.class);
+      new JoinExtractFilterRule(LogicalJoin.class,
+          RelFactories.LOGICAL_BUILDER);
 
   //~ Constructors -----------------------------------------------------------
 
   /**
    * Creates an JoinExtractFilterRule.
    */
+  @Deprecated // to be removed before 2.0
   public JoinExtractFilterRule(Class<? extends Join> clazz) {
-    super(operand(clazz, any()));
+    this(clazz, RelFactories.LOGICAL_BUILDER);
+  }
+
+  /**
+   * Creates a JoinExtractFilterRule.
+   */
+  public JoinExtractFilterRule(Class<? extends Join> clazz,
+      RelBuilderFactory relBuilderFactory) {
+    super(operand(clazz, any()), relBuilderFactory, null);
   }
 
   //~ Methods ----------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/JoinToCorrelateRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/JoinToCorrelateRule.java b/core/src/main/java/org/apache/calcite/rel/rules/JoinToCorrelateRule.java
index 5afbe2a..47a128d 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/JoinToCorrelateRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/JoinToCorrelateRule.java
@@ -66,9 +66,9 @@ public class JoinToCorrelateRule extends RelOptRule {
   //~ Constructors -----------------------------------------------------------
 
   /**
-   * Private constructor; use singleton {@link #INSTANCE}.
+   * Creates a JoinToCorrelateRule.
    */
-  protected JoinToCorrelateRule(RelBuilderFactory relBuilderFactory) {
+  public JoinToCorrelateRule(RelBuilderFactory relBuilderFactory) {
     super(operand(LogicalJoin.class, any()), relBuilderFactory, null);
   }
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/JoinToMultiJoinRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/JoinToMultiJoinRule.java b/core/src/main/java/org/apache/calcite/rel/rules/JoinToMultiJoinRule.java
index 7d6c059..ecccad1 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/JoinToMultiJoinRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/JoinToMultiJoinRule.java
@@ -22,6 +22,7 @@ import org.apache.calcite.plan.RelOptUtil;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.core.Join;
 import org.apache.calcite.rel.core.JoinRelType;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.logical.LogicalJoin;
 import org.apache.calcite.rel.type.RelDataTypeField;
 import org.apache.calcite.rex.RexBuilder;
@@ -29,6 +30,7 @@ import org.apache.calcite.rex.RexInputRef;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.rex.RexUtil;
 import org.apache.calcite.rex.RexVisitorImpl;
+import org.apache.calcite.tools.RelBuilderFactory;
 import org.apache.calcite.util.ImmutableBitSet;
 import org.apache.calcite.util.ImmutableIntList;
 import org.apache.calcite.util.Pair;
@@ -102,18 +104,25 @@ import java.util.Map;
  */
 public class JoinToMultiJoinRule extends RelOptRule {
   public static final JoinToMultiJoinRule INSTANCE =
-      new JoinToMultiJoinRule(LogicalJoin.class);
+      new JoinToMultiJoinRule(LogicalJoin.class, RelFactories.LOGICAL_BUILDER);
 
   //~ Constructors -----------------------------------------------------------
 
+  @Deprecated // to be removed before 2.0
+  public JoinToMultiJoinRule(Class<? extends Join> clazz) {
+    this(clazz, RelFactories.LOGICAL_BUILDER);
+  }
+
   /**
    * Creates a JoinToMultiJoinRule.
    */
-  public JoinToMultiJoinRule(Class<? extends Join> clazz) {
+  public JoinToMultiJoinRule(Class<? extends Join> clazz,
+      RelBuilderFactory relBuilderFactory) {
     super(
         operand(clazz,
             operand(RelNode.class, any()),
-            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/JoinUnionTransposeRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/JoinUnionTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/JoinUnionTransposeRule.java
index 0a3bee9..acd4577 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/JoinUnionTransposeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/JoinUnionTransposeRule.java
@@ -21,8 +21,10 @@ import org.apache.calcite.plan.RelOptRuleCall;
 import org.apache.calcite.plan.RelOptRuleOperand;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.core.Join;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.core.SetOp;
 import org.apache.calcite.rel.core.Union;
+import org.apache.calcite.tools.RelBuilderFactory;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -38,6 +40,7 @@ public class JoinUnionTransposeRule extends RelOptRule {
           operand(Join.class,
               operand(Union.class, any()),
               operand(RelNode.class, any())),
+          RelFactories.LOGICAL_BUILDER,
           "JoinUnionTransposeRule(Union-Other)");
 
   public static final JoinUnionTransposeRule RIGHT_UNION =
@@ -45,11 +48,19 @@ public class JoinUnionTransposeRule extends RelOptRule {
           operand(Join.class,
               operand(RelNode.class, any()),
               operand(Union.class, any())),
+          RelFactories.LOGICAL_BUILDER,
           "JoinUnionTransposeRule(Other-Union)");
 
-  private JoinUnionTransposeRule(RelOptRuleOperand operand,
-      String description) {
-    super(operand, description);
+  /**
+   * Creates a JoinUnionTransposeRule.
+   *
+   * @param operand           root operand, must not be null
+   * @param description       Description, or null to guess description
+   * @param relBuilderFactory Builder for relational expressions
+   */
+  public JoinUnionTransposeRule(RelOptRuleOperand operand,
+      RelBuilderFactory relBuilderFactory, String description) {
+    super(operand, relBuilderFactory, description);
   }
 
   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/MaterializedViewFilterScanRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/MaterializedViewFilterScanRule.java b/core/src/main/java/org/apache/calcite/rel/rules/MaterializedViewFilterScanRule.java
index f1775aa..b382f52 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/MaterializedViewFilterScanRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/MaterializedViewFilterScanRule.java
@@ -56,7 +56,7 @@ public class MaterializedViewFilterScanRule extends RelOptRule {
   //~ Constructors -----------------------------------------------------------
 
   /** Creates a MaterializedViewFilterScanRule. */
-  protected MaterializedViewFilterScanRule(RelBuilderFactory relBuilderFactory) {
+  public MaterializedViewFilterScanRule(RelBuilderFactory relBuilderFactory) {
     super(operand(Filter.class, operand(TableScan.class, null, none())),
         relBuilderFactory, "MaterializedViewFilterScanRule");
   }

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/MultiJoinProjectTransposeRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/MultiJoinProjectTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/MultiJoinProjectTransposeRule.java
index 4c254fb..8579816 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/MultiJoinProjectTransposeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/MultiJoinProjectTransposeRule.java
@@ -20,8 +20,10 @@ import org.apache.calcite.plan.RelOptRuleCall;
 import org.apache.calcite.plan.RelOptRuleOperand;
 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.LogicalJoin;
 import org.apache.calcite.rel.logical.LogicalProject;
+import org.apache.calcite.tools.RelBuilderFactory;
 
 /**
  * MultiJoinProjectTransposeRule implements the rule for pulling
@@ -64,6 +66,7 @@ public class MultiJoinProjectTransposeRule extends JoinProjectTransposeRule {
                   operand(MultiJoin.class, any())),
               operand(LogicalProject.class,
                   operand(MultiJoin.class, any()))),
+          RelFactories.LOGICAL_BUILDER,
           "MultiJoinProjectTransposeRule: with two LogicalProject children");
 
   public static final MultiJoinProjectTransposeRule MULTI_LEFT_PROJECT =
@@ -72,6 +75,7 @@ public class MultiJoinProjectTransposeRule extends JoinProjectTransposeRule {
               some(
                   operand(LogicalProject.class,
                       operand(MultiJoin.class, any())))),
+          RelFactories.LOGICAL_BUILDER,
           "MultiJoinProjectTransposeRule: with LogicalProject on left");
 
   public static final MultiJoinProjectTransposeRule MULTI_RIGHT_PROJECT =
@@ -80,14 +84,24 @@ public class MultiJoinProjectTransposeRule extends JoinProjectTransposeRule {
               operand(RelNode.class, any()),
               operand(LogicalProject.class,
                   operand(MultiJoin.class, any()))),
+          RelFactories.LOGICAL_BUILDER,
           "MultiJoinProjectTransposeRule: with LogicalProject on right");
 
   //~ Constructors -----------------------------------------------------------
 
+  @Deprecated // to be removed before 2.0
   public MultiJoinProjectTransposeRule(
       RelOptRuleOperand operand,
       String description) {
-    super(operand, description);
+    this(operand, RelFactories.LOGICAL_BUILDER, description);
+  }
+
+  /** Creates a MultiJoinProjectTransposeRule. */
+  public MultiJoinProjectTransposeRule(
+      RelOptRuleOperand operand,
+      RelBuilderFactory relBuilderFactory,
+      String description) {
+    super(operand, description, false, relBuilderFactory);
   }
 
   //~ Methods ----------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/ProjectCalcMergeRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ProjectCalcMergeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ProjectCalcMergeRule.java
index 9ecd044..568c31b 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectCalcMergeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectCalcMergeRule.java
@@ -19,6 +19,7 @@ package org.apache.calcite.rel.rules;
 import org.apache.calcite.plan.RelOptCluster;
 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.LogicalCalc;
 import org.apache.calcite.rel.logical.LogicalProject;
 import org.apache.calcite.rex.RexBuilder;
@@ -26,6 +27,7 @@ import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.rex.RexOver;
 import org.apache.calcite.rex.RexProgram;
 import org.apache.calcite.rex.RexProgramBuilder;
+import org.apache.calcite.tools.RelBuilderFactory;
 import org.apache.calcite.util.Pair;
 
 /**
@@ -44,15 +46,21 @@ public class ProjectCalcMergeRule extends RelOptRule {
   //~ Static fields/initializers ---------------------------------------------
 
   public static final ProjectCalcMergeRule INSTANCE =
-      new ProjectCalcMergeRule();
+      new ProjectCalcMergeRule(RelFactories.LOGICAL_BUILDER);
 
   //~ Constructors -----------------------------------------------------------
 
-  private ProjectCalcMergeRule() {
+  /**
+   * Creates a ProjectCalcMergeRule.
+   *
+   * @param relBuilderFactory Builder for relational expressions
+   */
+  public ProjectCalcMergeRule(RelBuilderFactory relBuilderFactory) {
     super(
         operand(
             LogicalProject.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/ProjectMultiJoinMergeRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ProjectMultiJoinMergeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ProjectMultiJoinMergeRule.java
index 0cf5d58..95a568f 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectMultiJoinMergeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectMultiJoinMergeRule.java
@@ -39,7 +39,7 @@ public class ProjectMultiJoinMergeRule extends RelOptRule {
   //~ Constructors -----------------------------------------------------------
 
   /** Creates a ProjectMultiJoinMergeRule. */
-  private ProjectMultiJoinMergeRule(RelBuilderFactory relBuilderFactory) {
+  public ProjectMultiJoinMergeRule(RelBuilderFactory relBuilderFactory) {
     super(
         operand(LogicalProject.class,
             operand(MultiJoin.class, any())), relBuilderFactory, null);

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/ProjectRemoveRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ProjectRemoveRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ProjectRemoveRule.java
index 7a92ccb..cc773fb 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectRemoveRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectRemoveRule.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.Project;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.rex.RexUtil;
 import org.apache.calcite.runtime.PredicateImpl;
+import org.apache.calcite.tools.RelBuilderFactory;
 
 import com.google.common.base.Predicate;
 
@@ -49,15 +51,21 @@ public class ProjectRemoveRule extends RelOptRule {
         }
       };
 
-  public static final ProjectRemoveRule INSTANCE = new ProjectRemoveRule();
+  public static final ProjectRemoveRule INSTANCE =
+      new ProjectRemoveRule(RelFactories.LOGICAL_BUILDER);
 
   //~ Constructors -----------------------------------------------------------
 
-  /** Creates a ProjectRemoveRule. */
-  private ProjectRemoveRule() {
+  /**
+   * Creates a ProjectRemoveRule.
+   *
+   * @param relBuilderFactory Builder for relational expressions
+   */
+  public ProjectRemoveRule(RelBuilderFactory relBuilderFactory) {
     // Create a specialized operand to detect non-matches early. This keeps
     // the rule queue short.
-    super(operand(Project.class, null, PREDICATE, any()));
+    super(operand(Project.class, null, PREDICATE, any()), relBuilderFactory,
+        null);
   }
 
   //~ Methods ----------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/ProjectSortTransposeRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ProjectSortTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ProjectSortTransposeRule.java
index 727f5dd..d1dd14e 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectSortTransposeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectSortTransposeRule.java
@@ -21,7 +21,9 @@ import org.apache.calcite.plan.RelOptRuleCall;
 import org.apache.calcite.plan.RelOptRuleOperand;
 import org.apache.calcite.rel.RelNode;
 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.tools.RelBuilderFactory;
 
 import com.google.common.collect.ImmutableList;
 
@@ -34,21 +36,29 @@ import com.google.common.collect.ImmutableList;
  */
 public class ProjectSortTransposeRule extends RelOptRule {
   public static final ProjectSortTransposeRule INSTANCE =
-      new ProjectSortTransposeRule();
+      new ProjectSortTransposeRule(Project.class, Sort.class,
+          RelFactories.LOGICAL_BUILDER);
 
   //~ Constructors -----------------------------------------------------------
 
-  /**
-   * Creates a ProjectSortTransposeRule.
-   */
-  private ProjectSortTransposeRule() {
-    super(
-        operand(Project.class,
-            operand(Sort.class, any())));
+  /** Creates a ProjectSortTransposeRule. */
+  private ProjectSortTransposeRule(Class<Project> projectClass,
+      Class<Sort> sortClass, RelBuilderFactory relBuilderFactory) {
+    this(
+        operand(projectClass,
+            operand(sortClass, any())),
+        relBuilderFactory, null);
   }
 
+  @Deprecated // to be removed before 2.0
   protected ProjectSortTransposeRule(RelOptRuleOperand operand) {
-    super(operand);
+    this(operand, RelFactories.LOGICAL_BUILDER, null);
+  }
+
+  /** Creates a ProjectSortTransposeRule with an operand. */
+  protected ProjectSortTransposeRule(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/ProjectTableScanRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ProjectTableScanRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ProjectTableScanRule.java
index eff4e52..bd4b5fe 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectTableScanRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectTableScanRule.java
@@ -23,10 +23,12 @@ import org.apache.calcite.plan.RelOptRuleCall;
 import org.apache.calcite.plan.RelOptRuleOperand;
 import org.apache.calcite.plan.RelOptTable;
 import org.apache.calcite.rel.core.Project;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.core.TableScan;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.runtime.PredicateImpl;
 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;
@@ -62,6 +64,7 @@ public abstract class ProjectTableScanRule extends RelOptRule {
       new ProjectTableScanRule(
           operand(Project.class,
               operand(TableScan.class, null, PREDICATE, none())),
+          RelFactories.LOGICAL_BUILDER,
           "ProjectScanRule") {
         @Override public void onMatch(RelOptRuleCall call) {
           final Project project = call.rel(0);
@@ -76,6 +79,7 @@ public abstract class ProjectTableScanRule extends RelOptRule {
           operand(Project.class,
               operand(EnumerableInterpreter.class,
                   operand(TableScan.class, null, PREDICATE, none()))),
+          RelFactories.LOGICAL_BUILDER,
           "ProjectScanRule:interpreter") {
         @Override public void onMatch(RelOptRuleCall call) {
           final Project project = call.rel(0);
@@ -86,9 +90,10 @@ public abstract class ProjectTableScanRule extends RelOptRule {
 
   //~ Constructors -----------------------------------------------------------
 
-  /** Creates a ProjectScanRule. */
-  private ProjectTableScanRule(RelOptRuleOperand operand, String description) {
-    super(operand, description);
+  /** Creates a ProjectTableScanRule. */
+  public ProjectTableScanRule(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/ProjectToCalcRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ProjectToCalcRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ProjectToCalcRule.java
index b6f05c9..e16bc81 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectToCalcRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectToCalcRule.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.RelNode;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.logical.LogicalCalc;
 import org.apache.calcite.rel.logical.LogicalProject;
 import org.apache.calcite.rex.RexProgram;
+import org.apache.calcite.tools.RelBuilderFactory;
 
 /**
  * Rule to convert a
@@ -40,12 +42,18 @@ import org.apache.calcite.rex.RexProgram;
 public class ProjectToCalcRule extends RelOptRule {
   //~ Static fields/initializers ---------------------------------------------
 
-  public static final ProjectToCalcRule INSTANCE = new ProjectToCalcRule();
+  public static final ProjectToCalcRule INSTANCE =
+      new ProjectToCalcRule(RelFactories.LOGICAL_BUILDER);
 
   //~ Constructors -----------------------------------------------------------
 
-  private ProjectToCalcRule() {
-    super(operand(LogicalProject.class, any()));
+  /**
+   * Creates a ProjectToCalcRule.
+   *
+   * @param relBuilderFactory Builder for relational expressions
+   */
+  public ProjectToCalcRule(RelBuilderFactory relBuilderFactory) {
+    super(operand(LogicalProject.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/ProjectToWindowRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ProjectToWindowRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ProjectToWindowRule.java
index 4c441e2..2a37522 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectToWindowRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectToWindowRule.java
@@ -25,6 +25,7 @@ import org.apache.calcite.plan.RelTraitSet;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.core.Calc;
 import org.apache.calcite.rel.core.Project;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.logical.LogicalCalc;
 import org.apache.calcite.rel.logical.LogicalWindow;
 import org.apache.calcite.rex.RexCall;
@@ -39,6 +40,7 @@ import org.apache.calcite.rex.RexVisitorImpl;
 import org.apache.calcite.rex.RexWindow;
 import org.apache.calcite.runtime.PredicateImpl;
 import org.apache.calcite.tools.RelBuilder;
+import org.apache.calcite.tools.RelBuilderFactory;
 import org.apache.calcite.util.ImmutableIntList;
 import org.apache.calcite.util.Pair;
 import org.apache.calcite.util.graph.DefaultDirectedGraph;
@@ -90,25 +92,56 @@ public abstract class ProjectToWindowRule extends RelOptRule {
         }
       };
 
+  public static final ProjectToWindowRule INSTANCE =
+      new CalcToWindowRule(RelFactories.LOGICAL_BUILDER);
+
+  public static final ProjectToWindowRule PROJECT =
+      new ProjectToLogicalProjectAndWindowRule(RelFactories.LOGICAL_BUILDER);
+
+  //~ Constructors -----------------------------------------------------------
+
+  /**
+   * Creates a ProjectToWindowRule.
+   *
+   * @param operand           Root operand, must not be null
+   * @param description       Description, or null to guess description
+   * @param relBuilderFactory Builder for relational expressions
+   */
+  public ProjectToWindowRule(RelOptRuleOperand operand,
+      RelBuilderFactory relBuilderFactory, String description) {
+    super(operand, relBuilderFactory, description);
+  }
+
+  //~ Inner Classes ----------------------------------------------------------
+
   /**
    * Instance of the rule that applies to a
    * {@link org.apache.calcite.rel.core.Calc} that contains
    * windowed aggregates and converts it into a mixture of
    * {@link org.apache.calcite.rel.logical.LogicalWindow} and {@code Calc}.
    */
-  public static final ProjectToWindowRule INSTANCE =
-      new ProjectToWindowRule(
-        operand(Calc.class, null, PREDICATE, any()),
-        "ProjectToWindowRule") {
-        public void onMatch(RelOptRuleCall call) {
-          Calc calc = call.rel(0);
-          assert RexOver.containsOver(calc.getProgram());
-          final CalcRelSplitter transform =
-              new WindowedAggRelSplitter(calc, call.builder());
-          RelNode newRel = transform.execute();
-          call.transformTo(newRel);
-        }
-      };
+  public static class CalcToWindowRule extends ProjectToWindowRule {
+
+    /**
+     * Creates a CalcToWindowRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
+     */
+    public CalcToWindowRule(RelBuilderFactory relBuilderFactory) {
+      super(
+          operand(Calc.class, null, PREDICATE, any()),
+          relBuilderFactory, "ProjectToWindowRule");
+    }
+
+    public void onMatch(RelOptRuleCall call) {
+      Calc calc = call.rel(0);
+      assert RexOver.containsOver(calc.getProgram());
+      final CalcRelSplitter transform =
+          new WindowedAggRelSplitter(calc, call.builder());
+      RelNode newRel = transform.execute();
+      call.transformTo(newRel);
+    }
+  }
 
   /**
    * Instance of the rule that can be applied to a
@@ -116,63 +149,63 @@ public abstract class ProjectToWindowRule extends RelOptRule {
    * a mixture of {@code LogicalProject}
    * and {@link org.apache.calcite.rel.logical.LogicalWindow}.
    */
-  public static final ProjectToWindowRule PROJECT =
-      new ProjectToWindowRule(
-        operand(Project.class, null, PREDICATE2, any()),
-        "ProjectToWindowRule:project") {
-        @Override public void onMatch(RelOptRuleCall call) {
-          Project project = call.rel(0);
-          assert RexOver.containsOver(project.getProjects(), null);
-          final RelNode input = project.getInput();
-          final RexProgram program =
-              RexProgram.create(
-                  input.getRowType(),
-                  project.getProjects(),
-                  null,
-                  project.getRowType(),
-                  project.getCluster().getRexBuilder());
-          // temporary LogicalCalc, never registered
-          final LogicalCalc calc = LogicalCalc.create(input, program);
-          final CalcRelSplitter transform = new WindowedAggRelSplitter(calc,
-              call.builder()) {
-            @Override protected RelNode handle(RelNode rel) {
-              if (!(rel instanceof LogicalCalc)) {
-                return rel;
-              }
-              final LogicalCalc calc = (LogicalCalc) rel;
-              final RexProgram program = calc.getProgram();
-              relBuilder.push(calc.getInput());
-              if (program.getCondition() != null) {
-                relBuilder.filter(
-                    program.expandLocalRef(program.getCondition()));
-              }
-              if (!program.projectsOnlyIdentity()) {
-                relBuilder.project(
-                    Lists.transform(program.getProjectList(),
-                        new Function<RexLocalRef, RexNode>() {
-                          public RexNode apply(RexLocalRef a0) {
-                            return program.expandLocalRef(a0);
-                          }
-                        }),
-                    calc.getRowType().getFieldNames());
-              }
-              return relBuilder.build();
-            }
-          };
-          RelNode newRel = transform.execute();
-          call.transformTo(newRel);
+  public static class ProjectToLogicalProjectAndWindowRule
+      extends ProjectToWindowRule {
+    /**
+     * Creates a ProjectToWindowRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
+     */
+    public ProjectToLogicalProjectAndWindowRule(
+        RelBuilderFactory relBuilderFactory) {
+      super(operand(Project.class, null, PREDICATE2, any()),
+          relBuilderFactory, "ProjectToWindowRule:project");
+    }
+
+    @Override public void onMatch(RelOptRuleCall call) {
+      Project project = call.rel(0);
+      assert RexOver.containsOver(project.getProjects(), null);
+      final RelNode input = project.getInput();
+      final RexProgram program =
+          RexProgram.create(
+              input.getRowType(),
+              project.getProjects(),
+              null,
+              project.getRowType(),
+              project.getCluster().getRexBuilder());
+      // temporary LogicalCalc, never registered
+      final LogicalCalc calc = LogicalCalc.create(input, program);
+      final CalcRelSplitter transform = new WindowedAggRelSplitter(calc,
+          call.builder()) {
+        @Override protected RelNode handle(RelNode rel) {
+          if (!(rel instanceof LogicalCalc)) {
+            return rel;
+          }
+          final LogicalCalc calc = (LogicalCalc) rel;
+          final RexProgram program = calc.getProgram();
+          relBuilder.push(calc.getInput());
+          if (program.getCondition() != null) {
+            relBuilder.filter(
+                program.expandLocalRef(program.getCondition()));
+          }
+          if (!program.projectsOnlyIdentity()) {
+            relBuilder.project(
+                Lists.transform(program.getProjectList(),
+                    new Function<RexLocalRef, RexNode>() {
+                      public RexNode apply(RexLocalRef a0) {
+                        return program.expandLocalRef(a0);
+                      }
+                    }),
+              calc.getRowType().getFieldNames());
+          }
+          return relBuilder.build();
         }
       };
-
-  //~ Constructors -----------------------------------------------------------
-
-  /** Creates a ProjectToWindowRule. */
-  private ProjectToWindowRule(RelOptRuleOperand operand, String description) {
-    super(operand, description);
+      RelNode newRel = transform.execute();
+      call.transformTo(newRel);
+    }
   }
 
-  //~ Inner Classes ----------------------------------------------------------
-
   /**
    * Splitter that distinguishes between windowed aggregation expressions
    * (calls to {@link RexOver}) and ordinary expressions.

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/ProjectWindowTransposeRule.java
----------------------------------------------------------------------
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 152a3d2..10afd40 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
@@ -21,6 +21,7 @@ import org.apache.calcite.plan.RelOptRule;
 import org.apache.calcite.plan.RelOptRuleCall;
 import org.apache.calcite.rel.RelCollations;
 import org.apache.calcite.rel.RelFieldCollation;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.core.Window;
 import org.apache.calcite.rel.logical.LogicalProject;
 import org.apache.calcite.rel.logical.LogicalWindow;
@@ -31,6 +32,7 @@ import org.apache.calcite.rex.RexInputRef;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.rex.RexShuttle;
 import org.apache.calcite.sql.SqlAggFunction;
+import org.apache.calcite.tools.RelBuilderFactory;
 import org.apache.calcite.util.BitSets;
 import org.apache.calcite.util.ImmutableBitSet;
 
@@ -46,12 +48,18 @@ public class ProjectWindowTransposeRule extends RelOptRule {
   /** The default instance of
    * {@link org.apache.calcite.rel.rules.ProjectWindowTransposeRule}. */
   public static final ProjectWindowTransposeRule INSTANCE =
-      new ProjectWindowTransposeRule();
-
-  private ProjectWindowTransposeRule() {
+      new ProjectWindowTransposeRule(RelFactories.LOGICAL_BUILDER);
+
+  /**
+   * Creates ProjectWindowTransposeRule.
+   *
+   * @param relBuilderFactory Builder for relational expressions
+   */
+  public ProjectWindowTransposeRule(RelBuilderFactory relBuilderFactory) {
     super(
         operand(LogicalProject.class,
-            operand(LogicalWindow.class, any())));
+            operand(LogicalWindow.class, any())),
+        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/ReduceDecimalsRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ReduceDecimalsRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ReduceDecimalsRule.java
index 3dac4ed..2d27fc5 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/ReduceDecimalsRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/ReduceDecimalsRule.java
@@ -20,6 +20,7 @@ import org.apache.calcite.linq4j.Ord;
 import org.apache.calcite.plan.Convention;
 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.LogicalCalc;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rel.type.RelDataTypeSystem;
@@ -36,6 +37,7 @@ import org.apache.calcite.sql.SqlOperator;
 import org.apache.calcite.sql.fun.SqlStdOperatorTable;
 import org.apache.calcite.sql.type.SqlTypeName;
 import org.apache.calcite.sql.type.SqlTypeUtil;
+import org.apache.calcite.tools.RelBuilderFactory;
 import org.apache.calcite.util.Pair;
 import org.apache.calcite.util.Util;
 
@@ -65,15 +67,16 @@ import static org.apache.calcite.util.Static.RESOURCE;
  * would like to push down decimal operations to an external database.
  */
 public class ReduceDecimalsRule extends RelOptRule {
-  public static final ReduceDecimalsRule INSTANCE = new ReduceDecimalsRule();
+  public static final ReduceDecimalsRule INSTANCE =
+      new ReduceDecimalsRule(RelFactories.LOGICAL_BUILDER);
 
   //~ Constructors -----------------------------------------------------------
 
   /**
    * Creates a ReduceDecimalsRule.
    */
-  private ReduceDecimalsRule() {
-    super(operand(LogicalCalc.class, any()));
+  public ReduceDecimalsRule(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/SemiJoinFilterTransposeRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinFilterTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinFilterTransposeRule.java
index 486e43c..6103720 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinFilterTransposeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinFilterTransposeRule.java
@@ -22,6 +22,7 @@ import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.core.SemiJoin;
 import org.apache.calcite.rel.logical.LogicalFilter;
+import org.apache.calcite.tools.RelBuilderFactory;
 
 /**
  * Planner rule that pushes
@@ -37,17 +38,18 @@ import org.apache.calcite.rel.logical.LogicalFilter;
  */
 public class SemiJoinFilterTransposeRule extends RelOptRule {
   public static final SemiJoinFilterTransposeRule INSTANCE =
-      new SemiJoinFilterTransposeRule();
+      new SemiJoinFilterTransposeRule(RelFactories.LOGICAL_BUILDER);
 
   //~ Constructors -----------------------------------------------------------
 
   /**
    * Creates a SemiJoinFilterTransposeRule.
    */
-  private SemiJoinFilterTransposeRule() {
+  public SemiJoinFilterTransposeRule(RelBuilderFactory relBuilderFactory) {
     super(
         operand(SemiJoin.class,
-            some(operand(LogicalFilter.class, any()))));
+            some(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/SemiJoinJoinTransposeRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinJoinTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinJoinTransposeRule.java
index 42821e7..f7e4f48 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinJoinTransposeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinJoinTransposeRule.java
@@ -21,9 +21,11 @@ import org.apache.calcite.plan.RelOptRuleCall;
 import org.apache.calcite.plan.RelOptUtil;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.core.Join;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.core.SemiJoin;
 import org.apache.calcite.rel.type.RelDataTypeField;
 import org.apache.calcite.rex.RexNode;
+import org.apache.calcite.tools.RelBuilderFactory;
 import org.apache.calcite.util.ImmutableIntList;
 
 import java.util.ArrayList;
@@ -45,17 +47,18 @@ import java.util.List;
  */
 public class SemiJoinJoinTransposeRule extends RelOptRule {
   public static final SemiJoinJoinTransposeRule INSTANCE =
-      new SemiJoinJoinTransposeRule();
+      new SemiJoinJoinTransposeRule(RelFactories.LOGICAL_BUILDER);
 
   //~ Constructors -----------------------------------------------------------
 
   /**
    * Creates a SemiJoinJoinTransposeRule.
    */
-  private SemiJoinJoinTransposeRule() {
+  public SemiJoinJoinTransposeRule(RelBuilderFactory relBuilderFactory) {
     super(
         operand(SemiJoin.class,
-            some(operand(Join.class, any()))));
+            some(operand(Join.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/SemiJoinRemoveRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinRemoveRule.java b/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinRemoveRule.java
index 4c6a20d..24ee4fb 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinRemoveRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinRemoveRule.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.core.SemiJoin;
+import org.apache.calcite.tools.RelBuilderFactory;
 
 /**
  * Planner rule that removes a {@link org.apache.calcite.rel.core.SemiJoin}s
@@ -33,13 +35,13 @@ import org.apache.calcite.rel.core.SemiJoin;
  */
 public class SemiJoinRemoveRule extends RelOptRule {
   public static final SemiJoinRemoveRule INSTANCE =
-      new SemiJoinRemoveRule();
+      new SemiJoinRemoveRule(RelFactories.LOGICAL_BUILDER);
 
   //~ Constructors -----------------------------------------------------------
 
   /** Creates a SemiJoinRemoveRule. */
-  private SemiJoinRemoveRule() {
-    super(operand(SemiJoin.class, any()));
+  public SemiJoinRemoveRule(RelBuilderFactory relBuilderFactory) {
+    super(operand(SemiJoin.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/SortJoinTransposeRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/SortJoinTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/SortJoinTransposeRule.java
index 86d3e5e..04fbb6d 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/SortJoinTransposeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/SortJoinTransposeRule.java
@@ -26,11 +26,13 @@ import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.core.Join;
 import org.apache.calcite.rel.core.JoinInfo;
 import org.apache.calcite.rel.core.JoinRelType;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.core.Sort;
 import org.apache.calcite.rel.logical.LogicalJoin;
 import org.apache.calcite.rel.logical.LogicalSort;
 import org.apache.calcite.rel.metadata.RelMdUtil;
 import org.apache.calcite.rel.metadata.RelMetadataQuery;
+import org.apache.calcite.tools.RelBuilderFactory;
 
 
 /**
@@ -45,16 +47,24 @@ public class SortJoinTransposeRule extends RelOptRule {
 
   public static final SortJoinTransposeRule INSTANCE =
       new SortJoinTransposeRule(LogicalSort.class,
-          LogicalJoin.class);
+          LogicalJoin.class, RelFactories.LOGICAL_BUILDER);
 
   //~ Constructors -----------------------------------------------------------
 
   /** Creates a SortJoinTransposeRule. */
+  @Deprecated // to be removed before 2.0
   public SortJoinTransposeRule(Class<? extends Sort> sortClass,
       Class<? extends Join> joinClass) {
+    this(sortClass, joinClass, RelFactories.LOGICAL_BUILDER);
+  }
+
+  /** Creates a SortJoinTransposeRule. */
+  public SortJoinTransposeRule(Class<? extends Sort> sortClass,
+      Class<? extends Join> joinClass, RelBuilderFactory relBuilderFactory) {
     super(
         operand(sortClass,
-            operand(joinClass, any())));
+            operand(joinClass, any())),
+        relBuilderFactory, null);
   }
 
   //~ Methods ----------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/SortProjectTransposeRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/SortProjectTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/SortProjectTransposeRule.java
index 127e95e..19cde5f 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/SortProjectTransposeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/SortProjectTransposeRule.java
@@ -27,6 +27,7 @@ import org.apache.calcite.rel.RelCollations;
 import org.apache.calcite.rel.RelFieldCollation;
 import org.apache.calcite.rel.RelNode;
 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.logical.LogicalProject;
 import org.apache.calcite.rex.RexCall;
@@ -35,6 +36,7 @@ import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.rex.RexUtil;
 import org.apache.calcite.sql.SqlKind;
 import org.apache.calcite.sql.validate.SqlMonotonicity;
+import org.apache.calcite.tools.RelBuilderFactory;
 import org.apache.calcite.util.mapping.Mappings;
 
 import com.google.common.collect.ImmutableList;
@@ -51,7 +53,8 @@ import java.util.Map;
  */
 public class SortProjectTransposeRule extends RelOptRule {
   public static final SortProjectTransposeRule INSTANCE =
-      new SortProjectTransposeRule(Sort.class, LogicalProject.class, null);
+      new SortProjectTransposeRule(Sort.class, LogicalProject.class,
+          RelFactories.LOGICAL_BUILDER, null);
 
   //~ Constructors -----------------------------------------------------------
 
@@ -59,20 +62,35 @@ public class SortProjectTransposeRule extends RelOptRule {
   public SortProjectTransposeRule(
       Class<? extends Sort> sortClass,
       Class<? extends Project> projectClass) {
-    this(sortClass, projectClass, null);
+    this(sortClass, projectClass, RelFactories.LOGICAL_BUILDER, null);
   }
 
-  /** Creates a SortProjectTransposeRule.*/
+  @Deprecated // to be removed before 2.0
   public SortProjectTransposeRule(
       Class<? extends Sort> sortClass,
       Class<? extends Project> projectClass,
       String description) {
-    super(
+    this(sortClass, projectClass, RelFactories.LOGICAL_BUILDER, description);
+  }
+
+  /** Creates a SortProjectTransposeRule. */
+  public SortProjectTransposeRule(
+      Class<? extends Sort> sortClass,
+      Class<? extends Project> projectClass,
+      RelBuilderFactory relBuilderFactory, String description) {
+    this(
         operand(sortClass,
             operand(projectClass, any())),
-        description);
+        relBuilderFactory, description);
+  }
+
+  /** Creates a SortProjectTransposeRule with an operand. */
+  protected SortProjectTransposeRule(RelOptRuleOperand operand,
+      RelBuilderFactory relBuilderFactory, String description) {
+    super(operand, relBuilderFactory, description);
   }
 
+  @Deprecated // to be removed before 2.0
   protected SortProjectTransposeRule(RelOptRuleOperand operand) {
     super(operand);
   }

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/SortRemoveRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/SortRemoveRule.java b/core/src/main/java/org/apache/calcite/rel/rules/SortRemoveRule.java
index bd56821..09334ab 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/SortRemoveRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/SortRemoveRule.java
@@ -21,7 +21,9 @@ import org.apache.calcite.plan.RelOptRuleCall;
 import org.apache.calcite.plan.RelTraitSet;
 import org.apache.calcite.rel.RelCollation;
 import org.apache.calcite.rel.RelCollationTraitDef;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.core.Sort;
+import org.apache.calcite.tools.RelBuilderFactory;
 
 /**
  * Planner rule that removes
@@ -30,12 +32,16 @@ import org.apache.calcite.rel.core.Sort;
  * <p>Requires {@link RelCollationTraitDef}.
  */
 public class SortRemoveRule extends RelOptRule {
-  public static final SortRemoveRule INSTANCE = new SortRemoveRule();
+  public static final SortRemoveRule INSTANCE =
+      new SortRemoveRule(RelFactories.LOGICAL_BUILDER);
 
-  private SortRemoveRule() {
-    super(
-        operand(Sort.class, any()),
-        "SortRemoveRule");
+  /**
+   * Creates a SortRemoveRule.
+   *
+   * @param relBuilderFactory Builder for relational expressions
+   */
+  public SortRemoveRule(RelBuilderFactory relBuilderFactory) {
+    super(operand(Sort.class, any()), relBuilderFactory, "SortRemoveRule");
   }
 
   @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/SubQueryRemoveRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/SubQueryRemoveRule.java b/core/src/main/java/org/apache/calcite/rel/rules/SubQueryRemoveRule.java
index 3bed2b3..12ee805 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/SubQueryRemoveRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/SubQueryRemoveRule.java
@@ -148,7 +148,14 @@ public abstract class SubQueryRemoveRule extends RelOptRule {
         }
       };
 
-  private SubQueryRemoveRule(RelOptRuleOperand operand,
+  /**
+   * Creates a SubQueryRemoveRule.
+   *
+   * @param operand     root operand, must not be null
+   * @param description Description, or null to guess description
+   * @param relBuilderFactory Builder for relational expressions
+   */
+  public SubQueryRemoveRule(RelOptRuleOperand operand,
       RelBuilderFactory relBuilderFactory,
       String description) {
     super(operand, relBuilderFactory, description);

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/TableScanRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/TableScanRule.java b/core/src/main/java/org/apache/calcite/rel/rules/TableScanRule.java
index 208fc89..851c7c3 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/TableScanRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/TableScanRule.java
@@ -21,7 +21,9 @@ import org.apache.calcite.plan.RelOptRuleCall;
 import org.apache.calcite.plan.RelOptTable;
 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.LogicalTableScan;
+import org.apache.calcite.tools.RelBuilderFactory;
 
 /**
  * Planner rule that converts a
@@ -31,12 +33,18 @@ import org.apache.calcite.rel.logical.LogicalTableScan;
 public class TableScanRule extends RelOptRule {
   //~ Static fields/initializers ---------------------------------------------
 
-  public static final TableScanRule INSTANCE = new TableScanRule();
+  public static final TableScanRule INSTANCE =
+      new TableScanRule(RelFactories.LOGICAL_BUILDER);
 
   //~ Constructors -----------------------------------------------------------
 
-  private TableScanRule() {
-    super(operand(LogicalTableScan.class, any()));
+  /**
+   * Creates a TableScanRule.
+   *
+   * @param relBuilderFactory Builder for relational expressions
+   */
+  public TableScanRule(RelBuilderFactory relBuilderFactory) {
+    super(operand(LogicalTableScan.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/UnionEliminatorRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/UnionEliminatorRule.java b/core/src/main/java/org/apache/calcite/rel/rules/UnionEliminatorRule.java
index 4e908ec..024dd4e 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/UnionEliminatorRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/UnionEliminatorRule.java
@@ -18,8 +18,10 @@ 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.core.Union;
 import org.apache.calcite.rel.logical.LogicalUnion;
+import org.apache.calcite.tools.RelBuilderFactory;
 
 /**
  * <code>UnionEliminatorRule</code> checks to see if its possible to optimize a
@@ -28,15 +30,16 @@ import org.apache.calcite.rel.logical.LogicalUnion;
  */
 public class UnionEliminatorRule extends RelOptRule {
   public static final UnionEliminatorRule INSTANCE =
-      new UnionEliminatorRule(LogicalUnion.class);
+      new UnionEliminatorRule(LogicalUnion.class, RelFactories.LOGICAL_BUILDER);
 
   //~ Constructors -----------------------------------------------------------
 
   /**
    * Creates a UnionEliminatorRule.
    */
-  private UnionEliminatorRule(Class<? extends Union> clazz) {
-    super(operand(clazz, any()));
+  public UnionEliminatorRule(Class<? extends Union> clazz,
+      RelBuilderFactory relBuilderFactory) {
+    super(operand(clazz, any()), relBuilderFactory, null);
   }
 
   //~ Methods ----------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/UnionPullUpConstantsRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/UnionPullUpConstantsRule.java b/core/src/main/java/org/apache/calcite/rel/rules/UnionPullUpConstantsRule.java
index 05e42be..9fb0426 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/UnionPullUpConstantsRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/UnionPullUpConstantsRule.java
@@ -51,7 +51,7 @@ public class UnionPullUpConstantsRule extends RelOptRule {
       new UnionPullUpConstantsRule(Union.class, RelFactories.LOGICAL_BUILDER);
 
   /** Creates a UnionPullUpConstantsRule. */
-  protected UnionPullUpConstantsRule(Class<? extends Union> unionClass,
+  public UnionPullUpConstantsRule(Class<? extends Union> unionClass,
       RelBuilderFactory relBuilderFactory) {
     super(operand(unionClass, any()), relBuilderFactory, null);
   }

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/ValuesReduceRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ValuesReduceRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ValuesReduceRule.java
index 7a194c0..f7d5b15 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/ValuesReduceRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/ValuesReduceRule.java
@@ -21,6 +21,7 @@ import org.apache.calcite.plan.RelOptRule;
 import org.apache.calcite.plan.RelOptRuleCall;
 import org.apache.calcite.plan.RelOptRuleOperand;
 import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.core.Values;
 import org.apache.calcite.rel.logical.LogicalFilter;
 import org.apache.calcite.rel.logical.LogicalProject;
@@ -32,6 +33,7 @@ import org.apache.calcite.rex.RexLiteral;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.rex.RexShuttle;
 import org.apache.calcite.rex.RexUtil;
+import org.apache.calcite.tools.RelBuilderFactory;
 import org.apache.calcite.util.Util;
 import org.apache.calcite.util.trace.CalciteTrace;
 
@@ -74,6 +76,7 @@ public abstract class ValuesReduceRule extends RelOptRule {
       new ValuesReduceRule(
           operand(LogicalFilter.class,
               operand(LogicalValues.class, null, Values.IS_NOT_EMPTY, none())),
+          RelFactories.LOGICAL_BUILDER,
           "ValuesReduceRule(Filter)") {
         public void onMatch(RelOptRuleCall call) {
           LogicalFilter filter = call.rel(0);
@@ -90,6 +93,7 @@ public abstract class ValuesReduceRule extends RelOptRule {
       new ValuesReduceRule(
           operand(LogicalProject.class,
               operand(LogicalValues.class, null, Values.IS_NOT_EMPTY, none())),
+          RelFactories.LOGICAL_BUILDER,
           "ValuesReduceRule(Project)") {
         public void onMatch(RelOptRuleCall call) {
           LogicalProject project = call.rel(0);
@@ -108,6 +112,7 @@ public abstract class ValuesReduceRule extends RelOptRule {
               operand(LogicalFilter.class,
                   operand(LogicalValues.class, null, Values.IS_NOT_EMPTY,
                       none()))),
+          RelFactories.LOGICAL_BUILDER,
           "ValuesReduceRule(Project-Filter)") {
         public void onMatch(RelOptRuleCall call) {
           LogicalProject project = call.rel(0);
@@ -122,10 +127,13 @@ public abstract class ValuesReduceRule extends RelOptRule {
   /**
    * Creates a ValuesReduceRule.
    *
-   * @param operand class of rels to which this rule should apply
+   * @param operand           Class of rels to which this rule should apply
+   * @param relBuilderFactory Builder for relational expressions
+   * @param desc              Description, or null to guess description
    */
-  private ValuesReduceRule(RelOptRuleOperand operand, String desc) {
-    super(operand, desc);
+  public ValuesReduceRule(RelOptRuleOperand operand,
+      RelBuilderFactory relBuilderFactory, String desc) {
+    super(operand, relBuilderFactory, desc);
     Util.discard(LOGGER);
   }
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/stream/StreamRules.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/stream/StreamRules.java b/core/src/main/java/org/apache/calcite/rel/stream/StreamRules.java
index 80ee68f..a1e0d58 100644
--- a/core/src/main/java/org/apache/calcite/rel/stream/StreamRules.java
+++ b/core/src/main/java/org/apache/calcite/rel/stream/StreamRules.java
@@ -26,6 +26,7 @@ import org.apache.calcite.rel.core.Aggregate;
 import org.apache.calcite.rel.core.Filter;
 import org.apache.calcite.rel.core.Join;
 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;
@@ -40,6 +41,7 @@ import org.apache.calcite.rel.logical.LogicalUnion;
 import org.apache.calcite.schema.StreamableTable;
 import org.apache.calcite.schema.Table;
 import org.apache.calcite.tools.RelBuilder;
+import org.apache.calcite.tools.RelBuilderFactory;
 import org.apache.calcite.util.Util;
 
 import com.google.common.collect.ImmutableList;
@@ -55,21 +57,28 @@ public class StreamRules {
 
   public static final ImmutableList<RelOptRule> RULES =
       ImmutableList.of(
-          new DeltaProjectTransposeRule(),
-          new DeltaFilterTransposeRule(),
-          new DeltaAggregateTransposeRule(),
-          new DeltaSortTransposeRule(),
-          new DeltaUnionTransposeRule(),
-          new DeltaJoinTransposeRule(),
-          new DeltaTableScanRule(),
-          new DeltaTableScanToEmptyRule());
+          new DeltaProjectTransposeRule(RelFactories.LOGICAL_BUILDER),
+          new DeltaFilterTransposeRule(RelFactories.LOGICAL_BUILDER),
+          new DeltaAggregateTransposeRule(RelFactories.LOGICAL_BUILDER),
+          new DeltaSortTransposeRule(RelFactories.LOGICAL_BUILDER),
+          new DeltaUnionTransposeRule(RelFactories.LOGICAL_BUILDER),
+          new DeltaJoinTransposeRule(RelFactories.LOGICAL_BUILDER),
+          new DeltaTableScanRule(RelFactories.LOGICAL_BUILDER),
+          new DeltaTableScanToEmptyRule(RelFactories.LOGICAL_BUILDER));
 
   /** Planner rule that pushes a {@link Delta} through a {@link Project}. */
   public static class DeltaProjectTransposeRule extends RelOptRule {
-    private DeltaProjectTransposeRule() {
+
+    /**
+     * Creates a DeltaProjectTransposeRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
+     */
+    public DeltaProjectTransposeRule(RelBuilderFactory relBuilderFactory) {
       super(
           operand(Delta.class,
-              operand(Project.class, any())));
+              operand(Project.class, any())),
+          relBuilderFactory, null);
     }
 
     @Override public void onMatch(RelOptRuleCall call) {
@@ -86,10 +95,17 @@ public class StreamRules {
 
   /** Planner rule that pushes a {@link Delta} through a {@link Filter}. */
   public static class DeltaFilterTransposeRule extends RelOptRule {
-    private DeltaFilterTransposeRule() {
+
+    /**
+     * Creates a DeltaFilterTransposeRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
+     */
+    public DeltaFilterTransposeRule(RelBuilderFactory relBuilderFactory) {
       super(
           operand(Delta.class,
-              operand(Filter.class, any())));
+              operand(Filter.class, any())),
+          relBuilderFactory, null);
     }
 
     @Override public void onMatch(RelOptRuleCall call) {
@@ -105,10 +121,17 @@ public class StreamRules {
 
   /** Planner rule that pushes a {@link Delta} through an {@link Aggregate}. */
   public static class DeltaAggregateTransposeRule extends RelOptRule {
-    private DeltaAggregateTransposeRule() {
+
+    /**
+     * Creates a DeltaAggregateTransposeRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
+     */
+    public DeltaAggregateTransposeRule(RelBuilderFactory relBuilderFactory) {
       super(
           operand(Delta.class,
-              operand(Aggregate.class, null, Aggregate.NO_INDICATOR, any())));
+              operand(Aggregate.class, null, Aggregate.NO_INDICATOR, any())),
+          relBuilderFactory, null);
     }
 
     @Override public void onMatch(RelOptRuleCall call) {
@@ -126,10 +149,17 @@ public class StreamRules {
 
   /** Planner rule that pushes a {@link Delta} through an {@link Sort}. */
   public static class DeltaSortTransposeRule extends RelOptRule {
-    private DeltaSortTransposeRule() {
+
+    /**
+     * Creates a DeltaSortTransposeRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
+     */
+    public DeltaSortTransposeRule(RelBuilderFactory relBuilderFactory) {
       super(
           operand(Delta.class,
-              operand(Sort.class, any())));
+              operand(Sort.class, any())),
+          relBuilderFactory, null);
     }
 
     @Override public void onMatch(RelOptRuleCall call) {
@@ -146,10 +176,17 @@ public class StreamRules {
 
   /** Planner rule that pushes a {@link Delta} through an {@link Union}. */
   public static class DeltaUnionTransposeRule extends RelOptRule {
-    private DeltaUnionTransposeRule() {
+
+    /**
+     * Creates a DeltaUnionTransposeRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
+     */
+    public DeltaUnionTransposeRule(RelBuilderFactory relBuilderFactory) {
       super(
           operand(Delta.class,
-              operand(Union.class, any())));
+              operand(Union.class, any())),
+          relBuilderFactory, null);
     }
 
     @Override public void onMatch(RelOptRuleCall call) {
@@ -174,10 +211,17 @@ public class StreamRules {
    * with the other relations in the system. The Delta disappears and the stream
    * can be implemented directly. */
   public static class DeltaTableScanRule extends RelOptRule {
-    private DeltaTableScanRule() {
+
+    /**
+     * Creates a DeltaTableScanRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
+     */
+    public DeltaTableScanRule(RelBuilderFactory relBuilderFactory) {
       super(
           operand(Delta.class,
-              operand(TableScan.class, none())));
+              operand(TableScan.class, none())),
+          relBuilderFactory, null);
     }
 
     @Override public void onMatch(RelOptRuleCall call) {
@@ -208,10 +252,17 @@ public class StreamRules {
    * an empty {@link Values}.
    */
   public static class DeltaTableScanToEmptyRule extends RelOptRule {
-    private DeltaTableScanToEmptyRule() {
+
+    /**
+     * Creates a DeltaTableScanToEmptyRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
+     */
+    public DeltaTableScanToEmptyRule(RelBuilderFactory relBuilderFactory) {
       super(
           operand(Delta.class,
-              operand(TableScan.class, none())));
+              operand(TableScan.class, none())),
+          relBuilderFactory, null);
     }
 
     @Override public void onMatch(RelOptRuleCall call) {
@@ -239,10 +290,21 @@ public class StreamRules {
    */
   public static class DeltaJoinTransposeRule extends RelOptRule {
 
+    @Deprecated // to be removed before 2.0
     public DeltaJoinTransposeRule() {
+      this(RelFactories.LOGICAL_BUILDER);
+    }
+
+    /**
+     * Creates a DeltaJoinTransposeRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
+     */
+    public DeltaJoinTransposeRule(RelBuilderFactory relBuilderFactory) {
       super(
           operand(Delta.class,
-              operand(Join.class, any())));
+              operand(Join.class, any())),
+          relBuilderFactory, null);
     }
 
     public void onMatch(RelOptRuleCall call) {

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/test/java/org/apache/calcite/test/HepPlannerTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/HepPlannerTest.java b/core/src/test/java/org/apache/calcite/test/HepPlannerTest.java
index 3145db5..c88fe24 100644
--- a/core/src/test/java/org/apache/calcite/test/HepPlannerTest.java
+++ b/core/src/test/java/org/apache/calcite/test/HepPlannerTest.java
@@ -20,6 +20,7 @@ import org.apache.calcite.plan.hep.HepMatchOrder;
 import org.apache.calcite.plan.hep.HepPlanner;
 import org.apache.calcite.plan.hep.HepProgram;
 import org.apache.calcite.plan.hep.HepProgramBuilder;
+import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.logical.LogicalIntersect;
 import org.apache.calcite.rel.logical.LogicalUnion;
 import org.apache.calcite.rel.rules.CalcMergeRule;
@@ -61,8 +62,12 @@ public class HepPlannerTest extends RelOptTestBase {
         new HepPlanner(
             programBuilder.build());
 
-    planner.addRule(new CoerceInputsRule(LogicalUnion.class, false));
-    planner.addRule(new CoerceInputsRule(LogicalIntersect.class, false));
+    planner.addRule(
+        new CoerceInputsRule(LogicalUnion.class, false,
+            RelFactories.LOGICAL_BUILDER));
+    planner.addRule(
+        new CoerceInputsRule(LogicalIntersect.class, false,
+            RelFactories.LOGICAL_BUILDER));
 
     checkPlanning(planner,
         "(select name from dept union select ename from emp)"

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
----------------------------------------------------------------------
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 c6bc035..53c2c6a 100644
--- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
@@ -33,6 +33,7 @@ import org.apache.calcite.rel.core.Intersect;
 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.RelFactories;
 import org.apache.calcite.rel.core.Union;
 import org.apache.calcite.rel.logical.LogicalTableModify;
 import org.apache.calcite.rel.metadata.CachingRelMetadataProvider;
@@ -2211,7 +2212,8 @@ public class RelOptRulesTest extends RelOptTestBase {
 
         // Simulate the way INSERT will insert casts to the target types
         .addRuleInstance(
-            new CoerceInputsRule(LogicalTableModify.class, false))
+            new CoerceInputsRule(LogicalTableModify.class, false,
+                RelFactories.LOGICAL_BUILDER))
 
             // Convert projects to calcs, merge two calcs, and then
             // reduce redundant casts in merged calc.

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/druid/src/main/java/org/apache/calcite/adapter/druid/DruidRules.java
----------------------------------------------------------------------
diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidRules.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidRules.java
index 7a22012..6779ded 100644
--- a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidRules.java
+++ b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidRules.java
@@ -55,6 +55,7 @@ import org.apache.calcite.sql.fun.SqlStdOperatorTable;
 import org.apache.calcite.sql.type.SqlTypeFamily;
 import org.apache.calcite.sql.type.SqlTypeName;
 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.Util;
@@ -85,26 +86,30 @@ public class DruidRules {
 
   protected static final Logger LOGGER = CalciteTrace.getPlannerTracer();
 
-  public static final DruidFilterRule FILTER = new DruidFilterRule();
-  public static final DruidProjectRule PROJECT = new DruidProjectRule();
-  public static final DruidAggregateRule AGGREGATE = new DruidAggregateRule();
+  public static final DruidFilterRule FILTER =
+      new DruidFilterRule(RelFactories.LOGICAL_BUILDER);
+  public static final DruidProjectRule PROJECT =
+      new DruidProjectRule(RelFactories.LOGICAL_BUILDER);
+  public static final DruidAggregateRule AGGREGATE =
+      new DruidAggregateRule(RelFactories.LOGICAL_BUILDER);
   public static final DruidAggregateProjectRule AGGREGATE_PROJECT =
-      new DruidAggregateProjectRule();
-  public static final DruidSortRule SORT = new DruidSortRule();
+      new DruidAggregateProjectRule(RelFactories.LOGICAL_BUILDER);
+  public static final DruidSortRule SORT =
+      new DruidSortRule(RelFactories.LOGICAL_BUILDER);
   public static final DruidSortProjectTransposeRule SORT_PROJECT_TRANSPOSE =
-      new DruidSortProjectTransposeRule();
+      new DruidSortProjectTransposeRule(RelFactories.LOGICAL_BUILDER);
   public static final DruidProjectSortTransposeRule PROJECT_SORT_TRANSPOSE =
-      new DruidProjectSortTransposeRule();
+      new DruidProjectSortTransposeRule(RelFactories.LOGICAL_BUILDER);
   public static final DruidProjectFilterTransposeRule PROJECT_FILTER_TRANSPOSE =
-      new DruidProjectFilterTransposeRule();
+      new DruidProjectFilterTransposeRule(RelFactories.LOGICAL_BUILDER);
   public static final DruidFilterProjectTransposeRule FILTER_PROJECT_TRANSPOSE =
-      new DruidFilterProjectTransposeRule();
+      new DruidFilterProjectTransposeRule(RelFactories.LOGICAL_BUILDER);
   public static final DruidAggregateFilterTransposeRule AGGREGATE_FILTER_TRANSPOSE =
-      new DruidAggregateFilterTransposeRule();
+      new DruidAggregateFilterTransposeRule(RelFactories.LOGICAL_BUILDER);
   public static final DruidFilterAggregateTransposeRule FILTER_AGGREGATE_TRANSPOSE =
-      new DruidFilterAggregateTransposeRule();
+      new DruidFilterAggregateTransposeRule(RelFactories.LOGICAL_BUILDER);
   public static final DruidPostAggregationProjectRule POST_AGGREGATION_PROJECT =
-      new DruidPostAggregationProjectRule();
+      new DruidPostAggregationProjectRule(RelFactories.LOGICAL_BUILDER);
 
   public static final List<RelOptRule> RULES =
       ImmutableList.of(FILTER,
@@ -181,9 +186,16 @@ public class DruidRules {
   /**
    * Rule to push a {@link org.apache.calcite.rel.core.Filter} into a {@link DruidQuery}.
    */
-  private static class DruidFilterRule extends RelOptRule {
-    private DruidFilterRule() {
-      super(operand(Filter.class, operand(DruidQuery.class, none())));
+  public static class DruidFilterRule extends RelOptRule {
+
+    /**
+     * Creates a DruidFilterRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
+     */
+    public DruidFilterRule(RelBuilderFactory relBuilderFactory) {
+      super(operand(Filter.class, operand(DruidQuery.class, none())),
+          relBuilderFactory, null);
     }
 
     public void onMatch(RelOptRuleCall call) {
@@ -316,9 +328,16 @@ public class DruidRules {
   /**
    * Rule to push a {@link org.apache.calcite.rel.core.Project} into a {@link DruidQuery}.
    */
-  private static class DruidProjectRule extends RelOptRule {
-    private DruidProjectRule() {
-      super(operand(Project.class, operand(DruidQuery.class, none())));
+  public static class DruidProjectRule extends RelOptRule {
+
+    /**
+     * Creates a DruidProjectRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
+     */
+    public DruidProjectRule(RelBuilderFactory relBuilderFactory) {
+      super(operand(Project.class, operand(DruidQuery.class, none())),
+          relBuilderFactory, null);
     }
 
     public void onMatch(RelOptRuleCall call) {
@@ -412,8 +431,18 @@ public class DruidRules {
    * Post aggregator.
    */
   public static class DruidPostAggregationProjectRule extends RelOptRule {
-    private DruidPostAggregationProjectRule() {
-      super(operand(Project.class, operand(DruidQuery.class, none())));
+
+    /**
+     * Creates a DruidPostAggregationProjectRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
+     */
+    public DruidPostAggregationProjectRule(
+        RelBuilderFactory relBuilderFactory) {
+      super(
+          operand(Project.class,
+              operand(DruidQuery.class, none())),
+          relBuilderFactory, null);
     }
 
     public void onMatch(RelOptRuleCall call) {
@@ -603,9 +632,16 @@ public class DruidRules {
   /**
    * Rule to push an {@link org.apache.calcite.rel.core.Aggregate} into a {@link DruidQuery}.
    */
-  private static class DruidAggregateRule extends RelOptRule {
-    private DruidAggregateRule() {
-      super(operand(Aggregate.class, operand(DruidQuery.class, none())));
+  public static class DruidAggregateRule extends RelOptRule {
+
+    /**
+     * Creates a DruidAggregateRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
+     */
+    public DruidAggregateRule(RelBuilderFactory relBuilderFactory) {
+      super(operand(Aggregate.class, operand(DruidQuery.class, none())),
+          relBuilderFactory, null);
     }
 
     public void onMatch(RelOptRuleCall call) {
@@ -642,12 +678,19 @@ public class DruidRules {
    * Rule to push an {@link org.apache.calcite.rel.core.Aggregate} and
    * {@link org.apache.calcite.rel.core.Project} into a {@link DruidQuery}.
    */
-  private static class DruidAggregateProjectRule extends RelOptRule {
-    private DruidAggregateProjectRule() {
+  public static class DruidAggregateProjectRule extends RelOptRule {
+
+    /**
+     * Creates a DruidAggregateProjectRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
+     */
+    public DruidAggregateProjectRule(RelBuilderFactory relBuilderFactory) {
       super(
           operand(Aggregate.class,
               operand(Project.class,
-                  operand(DruidQuery.class, none()))));
+                  operand(DruidQuery.class, none()))),
+          relBuilderFactory, null);
     }
 
     public void onMatch(RelOptRuleCall call) {
@@ -960,12 +1003,19 @@ public class DruidRules {
    * {@link org.apache.calcite.rel.core.Project}. Useful to transform
    * to complex Druid queries.
    */
-  private static class DruidSortProjectTransposeRule
+  public static class DruidSortProjectTransposeRule
       extends SortProjectTransposeRule {
-    private DruidSortProjectTransposeRule() {
+
+    /**
+     * Creates a DruidSortProjectTransposeRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
+     */
+    public DruidSortProjectTransposeRule(RelBuilderFactory relBuilderFactory) {
       super(
           operand(Sort.class,
-              operand(Project.class, operand(DruidQuery.class, none()))));
+              operand(Project.class, operand(DruidQuery.class, none()))),
+          relBuilderFactory, null);
     }
   }
 
@@ -974,12 +1024,19 @@ public class DruidRules {
    * {@link org.apache.calcite.rel.core.Sort}. Useful if after pushing Sort,
    * we could not push it inside DruidQuery.
    */
-  private static class DruidProjectSortTransposeRule
+  public static class DruidProjectSortTransposeRule
       extends ProjectSortTransposeRule {
-    private DruidProjectSortTransposeRule() {
+
+    /**
+     * Creates a DruidProjectSortTransposeRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
+     */
+    public DruidProjectSortTransposeRule(RelBuilderFactory relBuilderFactory) {
       super(
           operand(Project.class,
-              operand(Sort.class, operand(DruidQuery.class, none()))));
+              operand(Sort.class, operand(DruidQuery.class, none()))),
+          relBuilderFactory, null);
     }
   }
 
@@ -987,9 +1044,16 @@ public class DruidRules {
    * Rule to push a {@link org.apache.calcite.rel.core.Sort}
    * into a {@link DruidQuery}.
    */
-  private static class DruidSortRule extends RelOptRule {
-    private DruidSortRule() {
-      super(operand(Sort.class, operand(DruidQuery.class, none())));
+  public static class DruidSortRule extends RelOptRule {
+
+    /**
+     * Creates a DruidSortRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
+     */
+    public DruidSortRule(RelBuilderFactory relBuilderFactory) {
+      super(operand(Sort.class, operand(DruidQuery.class, none())),
+          relBuilderFactory, null);
     }
 
     public void onMatch(RelOptRuleCall call) {
@@ -1139,15 +1203,22 @@ public class DruidRules {
    * past a {@link org.apache.calcite.rel.core.Filter}
    * when {@code Filter} is on top of a {@link DruidQuery}.
    */
-  private static class DruidProjectFilterTransposeRule
+  public static class DruidProjectFilterTransposeRule
       extends ProjectFilterTransposeRule {
-    private DruidProjectFilterTransposeRule() {
+
+    /**
+     * Creates a DruidProjectFilterTransposeRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
+     */
+    public DruidProjectFilterTransposeRule(
+        RelBuilderFactory relBuilderFactory) {
       super(
           operand(Project.class,
               operand(Filter.class,
                   operand(DruidQuery.class, none()))),
           PushProjector.ExprCondition.FALSE,
-          RelFactories.LOGICAL_BUILDER);
+          relBuilderFactory);
     }
   }
 
@@ -1156,14 +1227,21 @@ public class DruidRules {
    * past a {@link org.apache.calcite.rel.core.Project}
    * when {@code Project} is on top of a {@link DruidQuery}.
    */
-  private static class DruidFilterProjectTransposeRule
+  public static class DruidFilterProjectTransposeRule
       extends FilterProjectTransposeRule {
-    private DruidFilterProjectTransposeRule() {
+
+    /**
+     * Creates a DruidFilterProjectTransposeRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
+     */
+    public DruidFilterProjectTransposeRule(
+        RelBuilderFactory relBuilderFactory) {
       super(
           operand(Filter.class,
               operand(Project.class,
                   operand(DruidQuery.class, none()))),
-          true, true, RelFactories.LOGICAL_BUILDER);
+          true, true, relBuilderFactory);
     }
   }
 
@@ -1172,14 +1250,21 @@ public class DruidRules {
    * past a {@link org.apache.calcite.rel.core.Filter}
    * when {@code Filter} is on top of a {@link DruidQuery}.
    */
-  private static class DruidAggregateFilterTransposeRule
+  public static class DruidAggregateFilterTransposeRule
       extends AggregateFilterTransposeRule {
-    private DruidAggregateFilterTransposeRule() {
+
+    /**
+     * Creates a DruidAggregateFilterTransposeRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
+     */
+    public DruidAggregateFilterTransposeRule(
+        RelBuilderFactory relBuilderFactory) {
       super(
           operand(Aggregate.class,
               operand(Filter.class,
                   operand(DruidQuery.class, none()))),
-          RelFactories.LOGICAL_BUILDER);
+          relBuilderFactory);
     }
   }
 
@@ -1188,14 +1273,21 @@ public class DruidRules {
    * past an {@link org.apache.calcite.rel.core.Aggregate}
    * when {@code Aggregate} is on top of a {@link DruidQuery}.
    */
-  private static class DruidFilterAggregateTransposeRule
+  public static class DruidFilterAggregateTransposeRule
       extends FilterAggregateTransposeRule {
-    private DruidFilterAggregateTransposeRule() {
+
+    /**
+     * Creates a DruidFilterAggregateTransposeRule.
+     *
+     * @param relBuilderFactory Builder for relational expressions
+     */
+    public DruidFilterAggregateTransposeRule(
+        RelBuilderFactory relBuilderFactory) {
       super(
           operand(Filter.class,
               operand(Aggregate.class,
                   operand(DruidQuery.class, none()))),
-          RelFactories.LOGICAL_BUILDER);
+          relBuilderFactory);
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvProjectTableScanRule.java
----------------------------------------------------------------------
diff --git a/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvProjectTableScanRule.java b/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvProjectTableScanRule.java
index b0851c7..9c136a9 100644
--- a/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvProjectTableScanRule.java
+++ b/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvProjectTableScanRule.java
@@ -18,9 +18,11 @@ package org.apache.calcite.adapter.csv;
 
 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.LogicalProject;
 import org.apache.calcite.rex.RexInputRef;
 import org.apache.calcite.rex.RexNode;
+import org.apache.calcite.tools.RelBuilderFactory;
 
 import java.util.List;
 
@@ -31,12 +33,18 @@ import java.util.List;
  */
 public class CsvProjectTableScanRule extends RelOptRule {
   public static final CsvProjectTableScanRule INSTANCE =
-      new CsvProjectTableScanRule();
+      new CsvProjectTableScanRule(RelFactories.LOGICAL_BUILDER);
 
-  private CsvProjectTableScanRule() {
+  /**
+   * Creates a CsvProjectTableScanRule.
+   *
+   * @param relBuilderFactory Builder for relational expressions
+   */
+  public CsvProjectTableScanRule(RelBuilderFactory relBuilderFactory) {
     super(
         operand(LogicalProject.class,
             operand(CsvTableScan.class, none())),
+        relBuilderFactory,
         "CsvProjectTableScanRule");
   }