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 2015/09/03 00:16:17 UTC

[29/50] incubator-calcite git commit: Fix up [CALCITE-714]

Fix up [CALCITE-714]

Also, forgot to close the pull request for [CALCITE-761] Pre-populated materializations, so:

Close apache/incubator-calcite#98


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

Branch: refs/heads/branch-release
Commit: e03dafcf20c8c5af5fffda88b4813017dca30048
Parents: 29030d8
Author: Julian Hyde <jh...@apache.org>
Authored: Thu Jul 23 14:11:35 2015 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Thu Jul 23 14:21:38 2015 -0700

----------------------------------------------------------------------
 .../org/apache/calcite/rel/core/Filter.java     | 28 -------------
 .../calcite/rel/rules/FilterCorrelateRule.java  | 42 ++++++++------------
 .../rel/rules/FilterProjectTransposeRule.java   |  4 +-
 .../java/org/apache/calcite/rex/RexUtil.java    | 24 +++++++++++
 .../apache/calcite/sql2rel/RelDecorrelator.java | 22 ++++------
 5 files changed, 49 insertions(+), 71 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/e03dafcf/core/src/main/java/org/apache/calcite/rel/core/Filter.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/core/Filter.java b/core/src/main/java/org/apache/calcite/rel/core/Filter.java
index 4b6ebfa..0dc3009 100644
--- a/core/src/main/java/org/apache/calcite/rel/core/Filter.java
+++ b/core/src/main/java/org/apache/calcite/rel/core/Filter.java
@@ -26,17 +26,12 @@ import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.RelWriter;
 import org.apache.calcite.rel.SingleRel;
 import org.apache.calcite.rel.metadata.RelMetadataQuery;
-import org.apache.calcite.rex.RexCall;
 import org.apache.calcite.rex.RexChecker;
-import org.apache.calcite.rex.RexCorrelVariable;
 import org.apache.calcite.rex.RexLocalRef;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.rex.RexProgram;
 import org.apache.calcite.rex.RexShuttle;
 import org.apache.calcite.rex.RexUtil;
-import org.apache.calcite.rex.RexVisitor;
-import org.apache.calcite.rex.RexVisitorImpl;
-import org.apache.calcite.util.Util;
 
 import com.google.common.collect.ImmutableList;
 
@@ -115,29 +110,6 @@ public abstract class Filter extends SingleRel {
     return condition;
   }
 
-  /**
-   * Check if any of the operands of the filter contains a
-   * correlation variable
-   */
-  public boolean hasCorrelation() {
-    if (condition instanceof RexCall) {
-      try {
-        RexVisitor<Void> visitor =
-            new RexVisitorImpl<Void>(true) {
-              public Void visitCorrelVariable(RexCorrelVariable var) {
-                throw new Util.FoundOne(var);
-              }
-            };
-        condition.accept(visitor);
-        return false;
-      } catch (Util.FoundOne e) {
-        Util.swallow(e,  null);
-        return true;
-      }
-    }
-    return false;
-  }
-
   @Override public boolean isValid(boolean fail) {
     if (RexUtil.isNullabilityCast(getCluster().getTypeFactory(), condition)) {
       assert !fail : "Cast for just nullability not allowed";

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/e03dafcf/core/src/main/java/org/apache/calcite/rel/rules/FilterCorrelateRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/FilterCorrelateRule.java b/core/src/main/java/org/apache/calcite/rel/rules/FilterCorrelateRule.java
index f156ec0..2b38074 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/FilterCorrelateRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/FilterCorrelateRule.java
@@ -27,14 +27,16 @@ import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rex.RexBuilder;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.rex.RexUtil;
+import org.apache.calcite.util.Util;
 
-import com.google.common.collect.Lists;
+import com.google.common.collect.ImmutableList;
 
 import java.util.ArrayList;
 import java.util.List;
 
 /**
- * Planner rule that pushes filters above Correlate node into the children of the Correlate.
+ * Planner rule that pushes a {@link Filter} above a {@link Correlate} into the
+ * inputs of the Correlate.
  */
 public class FilterCorrelateRule extends RelOptRule {
 
@@ -44,8 +46,6 @@ public class FilterCorrelateRule extends RelOptRule {
 
   private final RelFactories.FilterFactory filterFactory;
 
-  private final RelFactories.ProjectFactory projectFactory;
-
   //~ Constructors -----------------------------------------------------------
 
   /**
@@ -59,26 +59,20 @@ public class FilterCorrelateRule extends RelOptRule {
             operand(Correlate.class, RelOptRule.any())),
         "FilterCorrelateRule");
     this.filterFactory = filterFactory;
-    this.projectFactory = projectFactory;
+    Util.discard(projectFactory); // for future use
   }
 
   //~ Methods ----------------------------------------------------------------
 
   public void onMatch(RelOptRuleCall call) {
-    Filter filter = call.rel(0);
-    Correlate corr = call.rel(1);
-
-    if (filter == null) {
-      return;
-    }
+    final Filter filter = call.rel(0);
+    final Correlate corr = call.rel(1);
 
     final List<RexNode> aboveFilters =
-        filter != null
-            ? RelOptUtil.conjunctions(filter.getCondition())
-            : Lists.<RexNode>newArrayList();
+        RelOptUtil.conjunctions(filter.getCondition());
 
-    List<RexNode> leftFilters = new ArrayList<RexNode>();
-    List<RexNode> rightFilters = new ArrayList<RexNode>();
+    final List<RexNode> leftFilters = new ArrayList<>();
+    final List<RexNode> rightFilters = new ArrayList<>();
 
     // Try to push down above filters. These are typically where clause
     // filters. They can be pushed down if they are not on the NULL
@@ -100,20 +94,17 @@ public class FilterCorrelateRule extends RelOptRule {
       return;
     }
 
-    // create FilterRels on top of the children if any filters were
-    // pushed to them
+    // Create Filters on top of the children if any filters were
+    // pushed to them.
     final RexBuilder rexBuilder = corr.getCluster().getRexBuilder();
     RelNode leftRel =
         RelOptUtil.createFilter(corr.getLeft(), leftFilters, filterFactory);
     RelNode rightRel =
         RelOptUtil.createFilter(corr.getRight(), rightFilters, filterFactory);
 
-    // create the new LogicalCorrelate rel
-    List<RelNode> corrInputs = Lists.newArrayList();
-    corrInputs.add(leftRel);
-    corrInputs.add(rightRel);
-
-    RelNode newCorrRel = corr.copy(corr.getTraitSet(), corrInputs);
+    // Create the new Correlate
+    RelNode newCorrRel =
+        corr.copy(corr.getTraitSet(), ImmutableList.of(leftRel, rightRel));
 
     call.getPlanner().onCopy(corr, newCorrRel);
 
@@ -124,7 +115,7 @@ public class FilterCorrelateRule extends RelOptRule {
       call.getPlanner().onCopy(filter, rightRel);
     }
 
-    // create a LogicalFilter on top of the join if needed
+    // Create a Filter on top of the join if needed
     RelNode newRel =
         RelOptUtil.createFilter(newCorrRel,
             RexUtil.fixUp(rexBuilder, aboveFilters, newCorrRel.getRowType()),
@@ -132,7 +123,6 @@ public class FilterCorrelateRule extends RelOptRule {
 
     call.transformTo(newRel);
   }
-
 }
 
 // End FilterCorrelateRule.java

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/e03dafcf/core/src/main/java/org/apache/calcite/rel/rules/FilterProjectTransposeRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/FilterProjectTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/FilterProjectTransposeRule.java
index ff006a9..a81d595 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/FilterProjectTransposeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/FilterProjectTransposeRule.java
@@ -86,10 +86,10 @@ public class FilterProjectTransposeRule extends RelOptRule {
       return;
     }
 
-    if (filter.hasCorrelation()) {
+    if (RexUtil.containsCorrelation(filter.getCondition())) {
       // If there is a correlation condition anywhere in the filter, don't
       // push this filter past project since in some cases it can prevent a
-      // Correlate from being decorrelated
+      // Correlate from being de-correlated.
       return;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/e03dafcf/core/src/main/java/org/apache/calcite/rex/RexUtil.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rex/RexUtil.java b/core/src/main/java/org/apache/calcite/rex/RexUtil.java
index 5347855..1cac0f8 100644
--- a/core/src/main/java/org/apache/calcite/rex/RexUtil.java
+++ b/core/src/main/java/org/apache/calcite/rex/RexUtil.java
@@ -1459,6 +1459,16 @@ public class RexUtil {
     };
   }
 
+  /** Returns whether an expression contains a {@link RexCorrelVariable}. */
+  public static boolean containsCorrelation(RexNode condition) {
+    try {
+      condition.accept(CorrelationFinder.INSTANCE);
+      return false;
+    } catch (Util.FoundOne e) {
+      return true;
+    }
+  }
+
   //~ Inner Classes ----------------------------------------------------------
 
   /**
@@ -1841,6 +1851,20 @@ public class RexUtil {
       return new RexInputRef(input.getIndex() + offset, input.getType());
     }
   }
+
+  /** Visitor that throws {@link org.apache.calcite.util.Util.FoundOne} if
+   * there an expression contains a {@link RexCorrelVariable}. */
+  private static class CorrelationFinder extends RexVisitorImpl<Void> {
+    static final CorrelationFinder INSTANCE = new CorrelationFinder();
+
+    private CorrelationFinder() {
+      super(true);
+    }
+
+    @Override public Void visitCorrelVariable(RexCorrelVariable var) {
+      throw Util.FoundOne.NULL;
+    }
+  }
 }
 
 // End RexUtil.java

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/e03dafcf/core/src/main/java/org/apache/calcite/sql2rel/RelDecorrelator.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql2rel/RelDecorrelator.java b/core/src/main/java/org/apache/calcite/sql2rel/RelDecorrelator.java
index 80767c2..2f1d6b9 100644
--- a/core/src/main/java/org/apache/calcite/sql2rel/RelDecorrelator.java
+++ b/core/src/main/java/org/apache/calcite/sql2rel/RelDecorrelator.java
@@ -44,11 +44,9 @@ import org.apache.calcite.rel.logical.LogicalJoin;
 import org.apache.calcite.rel.logical.LogicalProject;
 import org.apache.calcite.rel.logical.LogicalSort;
 import org.apache.calcite.rel.metadata.RelMdUtil;
-import org.apache.calcite.rel.rules.FilterAggregateTransposeRule;
 import org.apache.calcite.rel.rules.FilterCorrelateRule;
 import org.apache.calcite.rel.rules.FilterJoinRule;
 import org.apache.calcite.rel.rules.FilterProjectTransposeRule;
-import org.apache.calcite.rel.rules.ProjectMergeRule;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rel.type.RelDataTypeFactory;
 import org.apache.calcite.rel.type.RelDataTypeField;
@@ -241,24 +239,18 @@ public class RelDecorrelator implements ReflectiveVisitor {
 
     if (mapOldToNewRel.containsKey(root)) {
       // has been rewritten; apply rules post-decorrelation
-      HepProgram program2 = HepProgram.builder()
+      final HepProgram program2 = HepProgram.builder()
           .addRuleInstance(FilterJoinRule.FILTER_ON_JOIN)
           .addRuleInstance(FilterJoinRule.JOIN)
           .build();
 
-      HepPlanner planner2 = createPlanner(program2);
-
-      RelNode newroot = mapOldToNewRel.get(root);
-      // planner.setRoot(newroot);
-      planner2.setRoot(newroot);
-      // newroot = planner.findBestExp();
-      newroot = planner2.findBestExp();
-
-      return newroot;
-    } else {
-      // not rewritten
-      return root;
+      final HepPlanner planner2 = createPlanner(program2);
+      final RelNode newRoot = mapOldToNewRel.get(root);
+      planner2.setRoot(newRoot);
+      return planner2.findBestExp();
     }
+
+    return root;
   }
 
   private Function2<RelNode, RelNode, Void> createCopyHook() {