You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jn...@apache.org on 2015/12/01 00:22:52 UTC

calcite git commit: [CALCITE-966] VolcanoPlanner should clear ruleNames in order to avoid rule name conflicting error

Repository: calcite
Updated Branches:
  refs/heads/master 3e49bc438 -> d3c5acd3a


[CALCITE-966] VolcanoPlanner should clear ruleNames in order to avoid rule name conflicting error

close apache/calcite#167


Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/d3c5acd3
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/d3c5acd3
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/d3c5acd3

Branch: refs/heads/master
Commit: d3c5acd3a95e1926e0985e99a2d802a60e096b32
Parents: 3e49bc4
Author: Jinfeng Ni <jn...@apache.org>
Authored: Thu Aug 13 17:05:05 2015 -0700
Committer: Jinfeng Ni <jn...@apache.org>
Committed: Mon Nov 30 12:13:25 2015 -0800

----------------------------------------------------------------------
 .../calcite/plan/volcano/VolcanoPlanner.java    |  1 +
 .../org/apache/calcite/tools/PlannerTest.java   | 60 ++++++++++++++++++++
 2 files changed, 61 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/d3c5acd3/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 b6ccd28..10ea16d 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
@@ -598,6 +598,7 @@ public class VolcanoPlanner extends AbstractRelOptPlanner {
     this.mapRel2Subset.clear();
     this.relImportances.clear();
     this.ruleQueue.clear();
+    this.ruleNames.clear();
   }
 
   public boolean addRule(RelOptRule rule) {

http://git-wip-us.apache.org/repos/asf/calcite/blob/d3c5acd3/core/src/test/java/org/apache/calcite/tools/PlannerTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/tools/PlannerTest.java b/core/src/test/java/org/apache/calcite/tools/PlannerTest.java
index 8b24317..01816df 100644
--- a/core/src/test/java/org/apache/calcite/tools/PlannerTest.java
+++ b/core/src/test/java/org/apache/calcite/tools/PlannerTest.java
@@ -31,6 +31,7 @@ import org.apache.calcite.plan.RelOptCluster;
 import org.apache.calcite.plan.RelOptPlanner;
 import org.apache.calcite.plan.RelOptPredicateList;
 import org.apache.calcite.plan.RelOptRule;
+import org.apache.calcite.plan.RelOptRuleCall;
 import org.apache.calcite.plan.RelOptTable;
 import org.apache.calcite.plan.RelOptUtil;
 import org.apache.calcite.plan.RelTraitDef;
@@ -40,6 +41,8 @@ import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.convert.ConverterRule;
 import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.core.TableScan;
+import org.apache.calcite.rel.logical.LogicalFilter;
+import org.apache.calcite.rel.logical.LogicalProject;
 import org.apache.calcite.rel.metadata.RelMetadataQuery;
 import org.apache.calcite.rel.rules.FilterMergeRule;
 import org.apache.calcite.rel.rules.ProjectMergeRule;
@@ -78,9 +81,12 @@ import org.junit.Test;
 import java.util.ArrayList;
 import java.util.List;
 
+import static org.apache.calcite.plan.RelOptRule.operand;
+
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.CoreMatchers.notNullValue;
+
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.fail;
@@ -511,6 +517,60 @@ public class PlannerTest {
             + "  EnumerableTableScan(table=[[hr, emps]])\n"));
   }
 
+  /** Unit test that calls {@link Planner#transform} twice with
+   *  rule name conflicts */
+  @Test public void testPlanTransformWithRuleNameConflicts() throws Exception {
+    // Create two dummy rules with identical rules.
+    RelOptRule rule1 = new RelOptRule(
+        operand(LogicalProject.class,
+            operand(LogicalFilter.class, RelOptRule.any())),
+        "MYRULE") {
+      @Override public boolean matches(RelOptRuleCall call) {
+        return false;
+      }
+
+      public void onMatch(RelOptRuleCall call) {
+      }
+    };
+
+    RelOptRule rule2 = new RelOptRule(
+        operand(LogicalFilter.class,
+            operand(LogicalProject.class, RelOptRule.any())),
+        "MYRULE") {
+
+      @Override public boolean matches(RelOptRuleCall call) {
+        return false;
+      }
+
+      public void onMatch(RelOptRuleCall call) {
+      }
+    };
+
+    RuleSet ruleSet1 =
+        RuleSets.ofList(
+            rule1,
+            EnumerableRules.ENUMERABLE_FILTER_RULE,
+            EnumerableRules.ENUMERABLE_PROJECT_RULE);
+
+    RuleSet ruleSet2 =
+        RuleSets.ofList(
+            rule2);
+
+    Planner planner = getPlanner(null, Programs.of(ruleSet1),
+        Programs.of(ruleSet2));
+    SqlNode parse = planner.parse("select * from \"emps\"");
+    SqlNode validate = planner.validate(parse);
+    RelNode convert = planner.convert(validate);
+    RelTraitSet traitSet = planner.getEmptyTraitSet()
+        .replace(EnumerableConvention.INSTANCE);
+    RelNode transform = planner.transform(0, traitSet, convert);
+    RelNode transform2 = planner.transform(1, traitSet, transform);
+    assertThat(toString(transform2),
+        equalTo(
+            "EnumerableProject(empid=[$0], deptno=[$1], name=[$2], salary=[$3], commission=[$4])\n"
+                + "  EnumerableTableScan(table=[[hr, emps]])\n"));
+  }
+
   /** Tests that Hive dialect does not generate "AS". */
   @Test public void testHiveDialect() throws SqlParseException {
     Planner planner = getPlanner(null);