You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jc...@apache.org on 2018/08/14 02:21:52 UTC
calcite git commit: [CALCITE-2465] Enable use of materialized views
for any planner
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 <jc...@apache.org>
Authored: Mon Aug 13 19:20:56 2018 -0700
Committer: Jesus Camacho Rodriguez <jc...@apache.org>
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);