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);