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 2014/08/25 20:42:31 UTC

[6/8] git commit: [OPTIQ-382] Refactoring rules to use factories

[OPTIQ-382] Refactoring rules to use factories


Project: http://git-wip-us.apache.org/repos/asf/incubator-optiq/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-optiq/commit/48bcaddc
Tree: http://git-wip-us.apache.org/repos/asf/incubator-optiq/tree/48bcaddc
Diff: http://git-wip-us.apache.org/repos/asf/incubator-optiq/diff/48bcaddc

Branch: refs/heads/master
Commit: 48bcaddc9a3bf4b5a34a430e927a90efba62b8f6
Parents: 5836698
Author: John Pullokkaran <jp...@hortonworks.com>
Authored: Wed Aug 20 17:50:54 2014 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Fri Aug 22 00:55:36 2014 -0700

----------------------------------------------------------------------
 .../eigenbase/rel/rules/MergeFilterRule.java    | 24 ++++++++++---------
 .../eigenbase/rel/rules/MergeProjectRule.java   |  8 +++----
 .../rel/rules/PushFilterPastJoinRule.java       | 25 +++++++++++++-------
 .../rel/rules/PushFilterPastSetOpRule.java      |  2 +-
 .../rel/rules/RemoveTrivialProjectRule.java     |  8 +++----
 .../java/org/eigenbase/relopt/RelOptUtil.java   | 24 +++++++++++++++++--
 6 files changed, 61 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-optiq/blob/48bcaddc/core/src/main/java/org/eigenbase/rel/rules/MergeFilterRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/eigenbase/rel/rules/MergeFilterRule.java b/core/src/main/java/org/eigenbase/rel/rules/MergeFilterRule.java
index 5725bd5..51cabd0 100644
--- a/core/src/main/java/org/eigenbase/rel/rules/MergeFilterRule.java
+++ b/core/src/main/java/org/eigenbase/rel/rules/MergeFilterRule.java
@@ -24,26 +24,29 @@ import org.eigenbase.rex.*;
  * MergeFilterRule implements the rule for combining two {@link FilterRel}s
  */
 public class MergeFilterRule extends RelOptRule {
-  public static final MergeFilterRule INSTANCE = new MergeFilterRule();
+  public static final MergeFilterRule INSTANCE =
+      new MergeFilterRule(RelFactories.DEFAULT_FILTER_FACTORY);
+
+  private final RelFactories.FilterFactory filterFactory;
 
   //~ Constructors -----------------------------------------------------------
 
   /**
    * Creates a MergeFilterRule.
    */
-  private MergeFilterRule() {
+  public MergeFilterRule(RelFactories.FilterFactory filterFactory) {
     super(
-        operand(
-            FilterRel.class,
-            operand(FilterRel.class, any())));
+        operand(FilterRelBase.class,
+            operand(FilterRelBase.class, any())));
+    this.filterFactory = filterFactory;
   }
 
   //~ Methods ----------------------------------------------------------------
 
   // implement RelOptRule
   public void onMatch(RelOptRuleCall call) {
-    FilterRel topFilter = call.rel(0);
-    FilterRel bottomFilter = call.rel(1);
+    final FilterRelBase topFilter = call.rel(0);
+    final FilterRelBase bottomFilter = call.rel(1);
 
     // use RexPrograms to merge the two FilterRels into a single program
     // so we can convert the two FilterRel conditions to directly
@@ -62,9 +65,8 @@ public class MergeFilterRule extends RelOptRule {
         mergedProgram.expandLocalRef(
             mergedProgram.getCondition());
 
-    FilterRel newFilterRel =
-        new FilterRel(
-            topFilter.getCluster(),
+    FilterRelBase newFilterRel =
+        (FilterRelBase) filterFactory.createFilter(
             bottomFilter.getChild(),
             newCondition);
 
@@ -77,7 +79,7 @@ public class MergeFilterRule extends RelOptRule {
    * @param filterRel the FilterRel
    * @return created RexProgram
    */
-  private RexProgram createProgram(FilterRel filterRel) {
+  private RexProgram createProgram(FilterRelBase filterRel) {
     RexProgramBuilder programBuilder =
         new RexProgramBuilder(
             filterRel.getRowType(),

http://git-wip-us.apache.org/repos/asf/incubator-optiq/blob/48bcaddc/core/src/main/java/org/eigenbase/rel/rules/MergeProjectRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/eigenbase/rel/rules/MergeProjectRule.java b/core/src/main/java/org/eigenbase/rel/rules/MergeProjectRule.java
index 2a616f0..d802171 100644
--- a/core/src/main/java/org/eigenbase/rel/rules/MergeProjectRule.java
+++ b/core/src/main/java/org/eigenbase/rel/rules/MergeProjectRule.java
@@ -24,7 +24,8 @@ import org.eigenbase.relopt.*;
 import org.eigenbase.rex.*;
 
 /**
- * MergeProjectRule merges a {@link ProjectRelBase} into another {@link ProjectRelBase},
+ * MergeProjectRule merges a {@link ProjectRelBase} into
+ * another {@link ProjectRelBase},
  * provided the projects aren't projecting identical sets of input references.
  */
 public class MergeProjectRule extends RelOptRule {
@@ -56,9 +57,8 @@ public class MergeProjectRule extends RelOptRule {
    */
   public MergeProjectRule(boolean force, ProjectFactory pFactory) {
     super(
-        operand(
-            ProjectRel.class,
-            operand(ProjectRel.class, any())),
+        operand(ProjectRelBase.class,
+            operand(ProjectRelBase.class, any())),
         "MergeProjectRule" + (force ? ": force mode" : ""));
     this.force = force;
     projectFactory = pFactory;

http://git-wip-us.apache.org/repos/asf/incubator-optiq/blob/48bcaddc/core/src/main/java/org/eigenbase/rel/rules/PushFilterPastJoinRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/eigenbase/rel/rules/PushFilterPastJoinRule.java b/core/src/main/java/org/eigenbase/rel/rules/PushFilterPastJoinRule.java
index 7ecbd5b..69af944 100644
--- a/core/src/main/java/org/eigenbase/rel/rules/PushFilterPastJoinRule.java
+++ b/core/src/main/java/org/eigenbase/rel/rules/PushFilterPastJoinRule.java
@@ -40,13 +40,16 @@ public abstract class PushFilterPastJoinRule extends RelOptRule {
       new PushFilterIntoJoinRule(false);
 
   public static final PushFilterPastJoinRule JOIN =
-      new PushDownJoinConditionRule(RelFactories.DEFAULT_FILTER_FACTORY);
+      new PushDownJoinConditionRule(RelFactories.DEFAULT_FILTER_FACTORY,
+          RelFactories.DEFAULT_PROJECT_FACTORY);
 
   /** Whether to try to strengthen join-type. */
   private final boolean smart;
 
   private final RelFactories.FilterFactory filterFactory;
 
+  private final RelFactories.ProjectFactory projectFactory;
+
   //~ Constructors -----------------------------------------------------------
 
   /**
@@ -54,10 +57,12 @@ public abstract class PushFilterPastJoinRule extends RelOptRule {
    * factories.
    */
   protected PushFilterPastJoinRule(RelOptRuleOperand operand, String id,
-      boolean smart, RelFactories.FilterFactory filterFactory) {
+      boolean smart, RelFactories.FilterFactory filterFactory,
+      RelFactories.ProjectFactory projectFactory) {
     super(operand, "PushFilterRule: " + id);
     this.smart = smart;
     this.filterFactory = filterFactory;
+    this.projectFactory = projectFactory;
   }
 
   //~ Methods ----------------------------------------------------------------
@@ -188,7 +193,8 @@ public abstract class PushFilterPastJoinRule extends RelOptRule {
 
     // Create a project on top of the join if some of the columns have become
     // NOT NULL due to the join-type getting stricter.
-    newJoinRel = RelOptUtil.createCastRel(newJoinRel, join.getRowType(), false);
+    newJoinRel = RelOptUtil.createCastRel(newJoinRel, join.getRowType(),
+        false, projectFactory);
 
     // create a FilterRel on top of the join if needed
     RelNode newRel =
@@ -221,10 +227,11 @@ public abstract class PushFilterPastJoinRule extends RelOptRule {
   /** Rule that pushes parts of the join condition to its inputs. */
   public static class PushDownJoinConditionRule
       extends PushFilterPastJoinRule {
-    public PushDownJoinConditionRule(RelFactories.FilterFactory filterFactory) {
+    public PushDownJoinConditionRule(RelFactories.FilterFactory filterFactory,
+        RelFactories.ProjectFactory projectFactory) {
       super(RelOptRule.operand(JoinRelBase.class, RelOptRule.any()),
           "PushFilterPastJoinRule:no-filter",
-          true, filterFactory);
+          true, filterFactory, projectFactory);
     }
 
     @Override
@@ -238,16 +245,18 @@ public abstract class PushFilterPastJoinRule extends RelOptRule {
    * condition and into the inputs of the join. */
   public static class PushFilterIntoJoinRule extends PushFilterPastJoinRule {
     public PushFilterIntoJoinRule(boolean smart) {
-      this(smart, RelFactories.DEFAULT_FILTER_FACTORY);
+      this(smart, RelFactories.DEFAULT_FILTER_FACTORY,
+          RelFactories.DEFAULT_PROJECT_FACTORY);
     }
 
     public PushFilterIntoJoinRule(boolean smart,
-        RelFactories.FilterFactory filterFactory) {
+        RelFactories.FilterFactory filterFactory,
+        RelFactories.ProjectFactory projectFactory) {
       super(
           RelOptRule.operand(FilterRelBase.class,
               RelOptRule.operand(JoinRelBase.class, RelOptRule.any())),
           "PushFilterPastJoinRule:filter",
-          smart, filterFactory);
+          smart, filterFactory, projectFactory);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-optiq/blob/48bcaddc/core/src/main/java/org/eigenbase/rel/rules/PushFilterPastSetOpRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/eigenbase/rel/rules/PushFilterPastSetOpRule.java b/core/src/main/java/org/eigenbase/rel/rules/PushFilterPastSetOpRule.java
index 6743a3c..14b93cb 100644
--- a/core/src/main/java/org/eigenbase/rel/rules/PushFilterPastSetOpRule.java
+++ b/core/src/main/java/org/eigenbase/rel/rules/PushFilterPastSetOpRule.java
@@ -39,7 +39,7 @@ public class PushFilterPastSetOpRule extends RelOptRule {
   /**
    * Creates a PushFilterPastSetOpRule.
    */
-  private PushFilterPastSetOpRule(RelFactories.FilterFactory filterFactory) {
+  public PushFilterPastSetOpRule(RelFactories.FilterFactory filterFactory) {
     super(
         operand(FilterRelBase.class,
             operand(SetOpRel.class, any())));

http://git-wip-us.apache.org/repos/asf/incubator-optiq/blob/48bcaddc/core/src/main/java/org/eigenbase/rel/rules/RemoveTrivialProjectRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/eigenbase/rel/rules/RemoveTrivialProjectRule.java b/core/src/main/java/org/eigenbase/rel/rules/RemoveTrivialProjectRule.java
index 630b343..d850351 100644
--- a/core/src/main/java/org/eigenbase/rel/rules/RemoveTrivialProjectRule.java
+++ b/core/src/main/java/org/eigenbase/rel/rules/RemoveTrivialProjectRule.java
@@ -24,7 +24,7 @@ import org.eigenbase.reltype.*;
 import org.eigenbase.rex.*;
 
 /**
- * Rule which, given a {@link ProjectRel} node which merely returns its input,
+ * Rule which, given a {@link ProjectRelBase} node which merely returns its input,
  * converts the node into its child.
  *
  * <p>For example, <code>ProjectRel(ArrayReader(a), {$input0})</code> becomes
@@ -44,10 +44,10 @@ public class RemoveTrivialProjectRule extends RelOptRule {
     // Create a specialized operand to detect non-matches early. This keeps
     // the rule queue short.
     super(
-      new RelOptRuleOperand(ProjectRel.class, null, any()) {
+      new RelOptRuleOperand(ProjectRelBase.class, null, any()) {
         @Override public boolean matches(RelNode rel) {
           return super.matches(rel)
-              && isTrivial((ProjectRel) rel);
+              && isTrivial((ProjectRelBase) rel);
         }
       });
   }
@@ -55,7 +55,7 @@ public class RemoveTrivialProjectRule extends RelOptRule {
   //~ Methods ----------------------------------------------------------------
 
   public void onMatch(RelOptRuleCall call) {
-    ProjectRel project = call.rel(0);
+    ProjectRelBase project = call.rel(0);
     assert isTrivial(project);
     RelNode stripped = project.getChild();
     RelNode child = call.getPlanner().register(stripped, project);

http://git-wip-us.apache.org/repos/asf/incubator-optiq/blob/48bcaddc/core/src/main/java/org/eigenbase/relopt/RelOptUtil.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/eigenbase/relopt/RelOptUtil.java b/core/src/main/java/org/eigenbase/relopt/RelOptUtil.java
index 2593966..52ddd18 100644
--- a/core/src/main/java/org/eigenbase/relopt/RelOptUtil.java
+++ b/core/src/main/java/org/eigenbase/relopt/RelOptUtil.java
@@ -496,6 +496,26 @@ public abstract class RelOptUtil {
       final RelNode rel,
       RelDataType castRowType,
       boolean rename) {
+    return createCastRel(rel, castRowType, rename,
+        RelFactories.DEFAULT_PROJECT_FACTORY);
+  }
+
+  /**
+   * Creates a projection which casts a rel's output to a desired row type.
+   *
+   * @param rel         producer of rows to be converted
+   * @param castRowType row type after cast
+   * @param rename      if true, use field names from castRowType; if false,
+   *                    preserve field names from rel
+   * @param projectFactory Project Factory
+   * @return conversion rel
+   */
+  public static RelNode createCastRel(
+      final RelNode rel,
+      RelDataType castRowType,
+      boolean rename,
+      RelFactories.ProjectFactory projectFactory) {
+    assert projectFactory != null;
     RelDataType rowType = rel.getRowType();
     if (areRowTypesEqual(rowType, castRowType, rename)) {
       // nothing to do
@@ -506,13 +526,13 @@ public abstract class RelOptUtil {
             rel.getCluster().getRexBuilder(), castRowType, rowType);
     if (rename) {
       // Use names and types from castRowType.
-      return CalcRel.createProject(
+      return projectFactory.createProject(
           rel,
           castExps,
           castRowType.getFieldNames());
     } else {
       // Use names from rowType, types from castRowType.
-      return CalcRel.createProject(
+      return projectFactory.createProject(
           rel,
           castExps,
           rowType.getFieldNames());