Repository: calcite Updated Branches: refs/heads/master ca858dd72 -> 62a0de58d
[CALCITE-2465] Enable use of materialized views for any planner Includes change to HepPlanner to check whether a transformation already produced a reference to an existing vertex based on existing graph vertices. Project: http://git-wip-us.apache.org/repos/asf/calcite/repo Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/62a0de58 Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/62a0de58 Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/62a0de58 Branch: refs/heads/master Commit: 62a0de58d38abb2c1fe85172ff9945fb39da7696 Parents: ca858dd Author: Jesus Camacho Rodriguez <[email protected]> Authored: Mon Aug 13 19:20:56 2018 -0700 Committer: Jesus Camacho Rodriguez <[email protected]> Committed: Mon Aug 13 19:20:56 2018 -0700 ---------------------------------------------------------------------- .../calcite/plan/AbstractRelOptPlanner.java | 4 ++++ .../org/apache/calcite/plan/RelOptPlanner.java | 5 +++++ .../org/apache/calcite/plan/hep/HepPlanner.java | 15 ++++++++++++++- .../calcite/plan/volcano/VolcanoPlanner.java | 2 +- .../rel/rules/AbstractMaterializedViewRule.java | 5 +---- .../rel/rules/MaterializedViewFilterScanRule.java | 11 +++-------- .../org/apache/calcite/test/HepPlannerTest.java | 18 ++++++++++++++++++ 7 files changed, 46 insertions(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite/blob/62a0de58/core/src/main/java/org/apache/calcite/plan/AbstractRelOptPlanner.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/plan/AbstractRelOptPlanner.java b/core/src/main/java/org/apache/calcite/plan/AbstractRelOptPlanner.java index 9eab16e..48af98d 100644 --- a/core/src/main/java/org/apache/calcite/plan/AbstractRelOptPlanner.java +++ b/core/src/main/java/org/apache/calcite/plan/AbstractRelOptPlanner.java @@ -198,6 +198,10 @@ public abstract class AbstractRelOptPlanner implements RelOptPlanner { // ignore - this planner does not support materializations } + public List<RelOptMaterialization> getMaterializations() { + return ImmutableList.of(); + } + public void addLattice(RelOptLattice lattice) { // ignore - this planner does not support lattices } http://git-wip-us.apache.org/repos/asf/calcite/blob/62a0de58/core/src/main/java/org/apache/calcite/plan/RelOptPlanner.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/plan/RelOptPlanner.java b/core/src/main/java/org/apache/calcite/plan/RelOptPlanner.java index 6143aa7..acbcf76 100644 --- a/core/src/main/java/org/apache/calcite/plan/RelOptPlanner.java +++ b/core/src/main/java/org/apache/calcite/plan/RelOptPlanner.java @@ -172,6 +172,11 @@ public interface RelOptPlanner { void addMaterialization(RelOptMaterialization materialization); /** + * Returns the materializations that have been registered with the planner. + */ + List<RelOptMaterialization> getMaterializations(); + + /** * Defines a lattice. * * <p>The lattice may have materializations; it is not necessary to call http://git-wip-us.apache.org/repos/asf/calcite/blob/62a0de58/core/src/main/java/org/apache/calcite/plan/hep/HepPlanner.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/plan/hep/HepPlanner.java b/core/src/main/java/org/apache/calcite/plan/hep/HepPlanner.java index ded7672..1388b7a 100644 --- a/core/src/main/java/org/apache/calcite/plan/hep/HepPlanner.java +++ b/core/src/main/java/org/apache/calcite/plan/hep/HepPlanner.java @@ -24,6 +24,7 @@ import org.apache.calcite.plan.Context; import org.apache.calcite.plan.RelOptCost; import org.apache.calcite.plan.RelOptCostFactory; import org.apache.calcite.plan.RelOptCostImpl; +import org.apache.calcite.plan.RelOptMaterialization; import org.apache.calcite.plan.RelOptPlanner; import org.apache.calcite.plan.RelOptRule; import org.apache.calcite.plan.RelOptRuleOperand; @@ -96,6 +97,9 @@ public class HepPlanner extends AbstractRelOptPlanner { private final Function2<RelNode, RelNode, Void> onCopyHook; + private final List<RelOptMaterialization> materializations = + new ArrayList<>(); + //~ Constructors ----------------------------------------------------------- /** @@ -174,6 +178,7 @@ public class HepPlanner extends AbstractRelOptPlanner { for (RelOptRule rule : ImmutableList.copyOf(allRules)) { removeRule(rule); } + this.materializations.clear(); } public boolean removeRule(RelOptRule rule) { @@ -794,7 +799,7 @@ public class HepPlanner extends AbstractRelOptPlanner { RelNode rel) { // Check if a transformation already produced a reference // to an existing vertex. - if (rel instanceof HepRelVertex) { + if (graph.vertexSet().contains(rel)) { return (HepRelVertex) rel; } @@ -1024,6 +1029,14 @@ public class HepPlanner extends AbstractRelOptPlanner { // vertices and all ancestors on each transformation. return nTransformations; } + + @Override public ImmutableList<RelOptMaterialization> getMaterializations() { + return ImmutableList.copyOf(materializations); + } + + @Override public void addMaterialization(RelOptMaterialization materialization) { + materializations.add(materialization); + } } // End HepPlanner.java http://git-wip-us.apache.org/repos/asf/calcite/blob/62a0de58/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoPlanner.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoPlanner.java b/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoPlanner.java index 231de4d..f7b1601 100644 --- a/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoPlanner.java +++ b/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoPlanner.java @@ -317,7 +317,7 @@ public class VolcanoPlanner extends AbstractRelOptPlanner { return root; } - public ImmutableList<RelOptMaterialization> getMaterializations() { + @Override public List<RelOptMaterialization> getMaterializations() { return ImmutableList.copyOf(materializations); } http://git-wip-us.apache.org/repos/asf/calcite/blob/62a0de58/core/src/main/java/org/apache/calcite/rel/rules/AbstractMaterializedViewRule.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/rel/rules/AbstractMaterializedViewRule.java b/core/src/main/java/org/apache/calcite/rel/rules/AbstractMaterializedViewRule.java index f5ebafa..709b824 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/AbstractMaterializedViewRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/AbstractMaterializedViewRule.java @@ -29,7 +29,6 @@ import org.apache.calcite.plan.SubstitutionVisitor; 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.plan.volcano.VolcanoPlanner; import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.RelReferentialConstraint; import org.apache.calcite.rel.core.Aggregate; @@ -212,9 +211,7 @@ public abstract class AbstractMaterializedViewRule extends RelOptRule { new RexSimplify(rexBuilder, predicates, true, executor); final List<RelOptMaterialization> materializations = - (planner instanceof VolcanoPlanner) - ? ((VolcanoPlanner) planner).getMaterializations() - : ImmutableList.of(); + planner.getMaterializations(); if (!materializations.isEmpty()) { // 1. Explore query plan to recognize whether preconditions to http://git-wip-us.apache.org/repos/asf/calcite/blob/62a0de58/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 88e752b..bec6c5e 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 @@ -26,15 +26,12 @@ import org.apache.calcite.plan.RelOptUtil; 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.plan.volcano.VolcanoPlanner; import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.core.Filter; import org.apache.calcite.rel.core.RelFactories; import org.apache.calcite.rel.core.TableScan; import org.apache.calcite.tools.RelBuilderFactory; -import com.google.common.collect.ImmutableList; - import java.util.Collections; import java.util.List; @@ -70,11 +67,9 @@ public class MaterializedViewFilterScanRule extends RelOptRule { } protected void apply(RelOptRuleCall call, Filter filter, TableScan scan) { - RelOptPlanner planner = call.getPlanner(); - List<RelOptMaterialization> materializations = - (planner instanceof VolcanoPlanner) - ? ((VolcanoPlanner) planner).getMaterializations() - : ImmutableList.of(); + final RelOptPlanner planner = call.getPlanner(); + final List<RelOptMaterialization> materializations = + planner.getMaterializations(); if (!materializations.isEmpty()) { RelNode root = filter.copy(filter.getTraitSet(), Collections.singletonList((RelNode) scan)); http://git-wip-us.apache.org/repos/asf/calcite/blob/62a0de58/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 7a08d0c..dff2486 100644 --- a/core/src/test/java/org/apache/calcite/test/HepPlannerTest.java +++ b/core/src/test/java/org/apache/calcite/test/HepPlannerTest.java @@ -17,6 +17,7 @@ package org.apache.calcite.test; import org.apache.calcite.plan.RelOptListener; +import org.apache.calcite.plan.RelOptMaterialization; import org.apache.calcite.plan.hep.HepMatchOrder; import org.apache.calcite.plan.hep.HepPlanner; import org.apache.calcite.plan.hep.HepProgram; @@ -33,11 +34,15 @@ import org.apache.calcite.rel.rules.ProjectToCalcRule; import org.apache.calcite.rel.rules.ReduceExpressionsRule; import org.apache.calcite.rel.rules.UnionToDistinctRule; +import com.google.common.collect.ImmutableList; + import org.junit.Test; import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; + /** * HepPlannerTest is a unit test for {@link HepPlanner}. See * {@link RelOptRulesTest} for an explanation of how to add tests; the tests in @@ -336,6 +341,19 @@ public class HepPlannerTest extends RelOptTestBase { assertThat(applyTimes1 > applyTimes2 * 10, is(true)); } + @Test public void testMaterialization() throws Exception { + HepPlanner planner = new HepPlanner(HepProgram.builder().build()); + RelNode tableRel = tester.convertSqlToRel("select * from dept").rel; + RelNode queryRel = tableRel; + RelOptMaterialization mat1 = new RelOptMaterialization( + tableRel, queryRel, null, ImmutableList.of("default", "mv")); + planner.addMaterialization(mat1); + assertEquals(planner.getMaterializations().size(), 1); + assertEquals(planner.getMaterializations().get(0), mat1); + planner.clear(); + assertEquals(planner.getMaterializations().size(), 0); + } + private long checkRuleApplyCount(HepMatchOrder matchOrder) { final HepProgramBuilder programBuilder = HepProgram.builder(); programBuilder.addMatchOrder(matchOrder);
