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() {