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/10/30 05:20:49 UTC
calcite git commit: [CALCITE-891] When substituting materializations,
match TableScan without Project (Maryann Xue)
Repository: calcite
Updated Branches:
refs/heads/master 97df1acbe -> 5c4554758
[CALCITE-891] When substituting materializations, match TableScan without Project (Maryann Xue)
Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/5c455475
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/5c455475
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/5c455475
Branch: refs/heads/master
Commit: 5c45547582d8a05fc929c97d0930122a15817fdd
Parents: 97df1ac
Author: maryannxue <we...@intel.com>
Authored: Thu Oct 29 11:40:00 2015 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Thu Oct 29 21:20:11 2015 -0700
----------------------------------------------------------------------
.../calcite/plan/SubstitutionVisitor.java | 38 ++++++++++++++++++++
.../calcite/test/MaterializationTest.java | 13 +++++++
2 files changed, 51 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/calcite/blob/5c455475/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java b/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java
index 28d7b32..b52dc8a 100644
--- a/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java
+++ b/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java
@@ -147,6 +147,7 @@ public class SubstitutionVisitor {
protected static final ImmutableList<UnifyRule> DEFAULT_RULES =
ImmutableList.<UnifyRule>of(
// TrivialRule.INSTANCE,
+ ScanToProjectUnifyRule.INSTANCE,
ProjectToProjectUnifyRule.INSTANCE,
FilterToProjectUnifyRule.INSTANCE,
// ProjectToFilterUnifyRule.INSTANCE,
@@ -842,6 +843,43 @@ public class SubstitutionVisitor {
}
/** Implementation of {@link UnifyRule} that matches
+ * {@link org.apache.calcite.rel.logical.LogicalTableScan}. */
+ private static class ScanToProjectUnifyRule extends AbstractUnifyRule {
+ public static final ScanToProjectUnifyRule INSTANCE =
+ new ScanToProjectUnifyRule();
+
+ private ScanToProjectUnifyRule() {
+ super(any(MutableScan.class),
+ any(MutableProject.class), 0);
+ }
+
+ public UnifyResult apply(UnifyRuleCall call) {
+ final MutableProject target = (MutableProject) call.target;
+ final MutableScan query = (MutableScan) call.query;
+ // We do not need to check query's parent type to avoid duplication
+ // of ProjectToProjectUnifyRule or FilterToProjectUnifyRule, since
+ // SubstitutionVisitor performs a top-down match.
+ if (!query.equals(target.getInput())) {
+ return null;
+ }
+ final RexShuttle shuttle = getRexShuttle(target);
+ final RexBuilder rexBuilder = target.cluster.getRexBuilder();
+ final List<RexNode> newProjects;
+ try {
+ newProjects = (List<RexNode>)
+ shuttle.apply(rexBuilder.identityProjects(query.getRowType()));
+ } catch (MatchFailed e) {
+ return null;
+ }
+ final MutableProject newProject =
+ MutableProject.of(
+ query.getRowType(), target, newProjects);
+ final MutableRel newProject2 = MutableRels.strip(newProject);
+ return call.result(newProject2);
+ }
+ }
+
+ /** Implementation of {@link UnifyRule} that matches
* {@link org.apache.calcite.rel.logical.LogicalProject}. */
private static class ProjectToProjectUnifyRule extends AbstractUnifyRule {
public static final ProjectToProjectUnifyRule INSTANCE =
http://git-wip-us.apache.org/repos/asf/calcite/blob/5c455475/core/src/test/java/org/apache/calcite/test/MaterializationTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/MaterializationTest.java b/core/src/test/java/org/apache/calcite/test/MaterializationTest.java
index 07d5a44..d65804e 100644
--- a/core/src/test/java/org/apache/calcite/test/MaterializationTest.java
+++ b/core/src/test/java/org/apache/calcite/test/MaterializationTest.java
@@ -790,6 +790,19 @@ public class MaterializationTest {
}
/** Test case for
+ * <a href="https://issues.apache.org/jira/browse/CALCITE-891">[CALCITE-891]
+ * TableScan without Project cannot be substituted by any projected
+ * materialization</a>. */
+ @Test public void testJoinMaterialization2() {
+ String q = "select *\n"
+ + "from \"emps\"\n"
+ + "join \"depts\" using (\"deptno\")";
+ final String m = "select \"deptno\", \"empid\", \"name\",\n"
+ + "\"salary\", \"commission\" from \"emps\"";
+ checkMaterialize(m, q);
+ }
+
+ /** Test case for
* <a href="https://issues.apache.org/jira/browse/CALCITE-761">[CALCITE-761]
* Pre-populated materializations</a>. */
@Test public void testPrePopulated() {