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 2014/11/23 11:44:21 UTC

[2/4] incubator-calcite git commit: [CALCITE-474] Clean up rule naming in order to support enabling/disabling rules

[CALCITE-474] Clean up rule naming in order to support enabling/disabling rules


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

Branch: refs/heads/master
Commit: 7882a5b958663f417df3f4e5cfca6f79c298537f
Parents: ac85beb
Author: Julian Hyde <jh...@apache.org>
Authored: Sun Nov 23 00:10:04 2014 -0800
Committer: Julian Hyde <jh...@apache.org>
Committed: Sun Nov 23 01:04:42 2014 -0800

----------------------------------------------------------------------
 .../java/org/apache/calcite/plan/RelOptRule.java    | 11 ++++++++++-
 .../apache/calcite/plan/volcano/VolcanoPlanner.java | 16 ++++++++++++++++
 .../apache/calcite/rel/rules/FilterJoinRule.java    |  2 +-
 .../calcite/rel/rules/JoinProjectTransposeRule.java |  6 +++---
 .../calcite/rel/rules/JoinUnionTransposeRule.java   |  9 +++++----
 .../calcite/rel/rules/ReduceExpressionsRule.java    |  8 ++++----
 .../apache/calcite/rel/rules/ValuesReduceRule.java  |  6 +++---
 7 files changed, 42 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/7882a5b9/core/src/main/java/org/apache/calcite/plan/RelOptRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/plan/RelOptRule.java b/core/src/main/java/org/apache/calcite/plan/RelOptRule.java
index d9d2e6f..788b88d 100644
--- a/core/src/main/java/org/apache/calcite/plan/RelOptRule.java
+++ b/core/src/main/java/org/apache/calcite/plan/RelOptRule.java
@@ -80,6 +80,10 @@ public abstract class RelOptRule {
     if (description == null) {
       description = guessDescription(getClass().getName());
     }
+    if (!description.matches("[A-Za-z][-A-Za-z0-9_.():]*")) {
+      throw new RuntimeException("Rule description '" + description
+          + "' is not valid");
+    }
     this.description = description;
     this.operands = flattenOperands(operand);
     assignSolveOrder();
@@ -429,7 +433,12 @@ public abstract class RelOptRule {
     return null;
   }
 
-  public String toString() {
+  /** Returns the description of this rule.
+   *
+   * <p>It must be unique (for rules that are not equal) and must consist of
+   * only the characters A-Z, a-z, 0-9, '_', '.', '(', ')'. It must start with
+   * a letter. */
+  public final String toString() {
     return description;
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/7882a5b9/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 87623ea..b605a60 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
@@ -76,10 +76,12 @@ import com.google.common.base.Supplier;
 import com.google.common.base.Suppliers;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
+import com.google.common.collect.LinkedHashMultimap;
 import com.google.common.collect.LinkedListMultimap;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Multimap;
+import com.google.common.collect.SetMultimap;
 import com.google.common.collect.Sets;
 
 import java.io.PrintWriter;
@@ -266,6 +268,11 @@ public class VolcanoPlanner extends AbstractRelOptPlanner {
    * {@link org.apache.calcite.plan.volcano.VolcanoCost}. */
   private final RelOptCost zeroCost;
 
+  /** Maps rule classes to their name, to ensure that the names are unique and
+   * conform to rules. */
+  private final SetMultimap<String, Class> ruleNames =
+      LinkedHashMultimap.create();
+
   //~ Constructors -----------------------------------------------------------
 
   /**
@@ -572,6 +579,15 @@ public class VolcanoPlanner extends AbstractRelOptPlanner {
     final boolean added = ruleSet.add(rule);
     assert added;
 
+    final String ruleName = rule.toString();
+    if (ruleNames.put(ruleName, rule.getClass())) {
+      Set<Class> x = ruleNames.get(ruleName);
+      if (x.size() > 1) {
+        throw new RuntimeException("Rule description '" + ruleName
+            + "' is not unique; classes: " + x);
+      }
+    }
+
     mapRuleDescription(rule);
 
     // Each of this rule's operands is an 'entry point' for a rule call.

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/7882a5b9/core/src/main/java/org/apache/calcite/rel/rules/FilterJoinRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/FilterJoinRule.java b/core/src/main/java/org/apache/calcite/rel/rules/FilterJoinRule.java
index 9ea4c40..bef2844 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/FilterJoinRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/FilterJoinRule.java
@@ -71,7 +71,7 @@ public abstract class FilterJoinRule extends RelOptRule {
   protected FilterJoinRule(RelOptRuleOperand operand, String id,
       boolean smart, RelFactories.FilterFactory filterFactory,
       RelFactories.ProjectFactory projectFactory) {
-    super(operand, "PushFilterRule: " + id);
+    super(operand, "PushFilterRule:" + id);
     this.smart = smart;
     this.filterFactory = filterFactory;
     this.projectFactory = projectFactory;

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/7882a5b9/core/src/main/java/org/apache/calcite/rel/rules/JoinProjectTransposeRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/JoinProjectTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/JoinProjectTransposeRule.java
index b266e68..2f41648 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/JoinProjectTransposeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/JoinProjectTransposeRule.java
@@ -59,13 +59,13 @@ public class JoinProjectTransposeRule extends RelOptRule {
           operand(LogicalJoin.class,
               operand(LogicalProject.class, any()),
               operand(LogicalProject.class, any())),
-          "JoinProjectTransposeRule: with two LogicalProject children");
+          "JoinProjectTransposeRule(Project-Project)");
 
   public static final JoinProjectTransposeRule LEFT_PROJECT =
       new JoinProjectTransposeRule(
           operand(LogicalJoin.class,
               some(operand(LogicalProject.class, any()))),
-          "JoinProjectTransposeRule: with LogicalProject on left");
+          "JoinProjectTransposeRule(Project-Other)");
 
   public static final JoinProjectTransposeRule RIGHT_PROJECT =
       new JoinProjectTransposeRule(
@@ -73,7 +73,7 @@ public class JoinProjectTransposeRule extends RelOptRule {
               LogicalJoin.class,
               operand(RelNode.class, any()),
               operand(LogicalProject.class, any())),
-          "JoinProjectTransposeRule: with LogicalProject on right");
+          "JoinProjectTransposeRule(Other-Project)");
 
   private final ProjectFactory projectFactory;
 

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/7882a5b9/core/src/main/java/org/apache/calcite/rel/rules/JoinUnionTransposeRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/JoinUnionTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/JoinUnionTransposeRule.java
index c0fa8af..c1a7f84 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/JoinUnionTransposeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/JoinUnionTransposeRule.java
@@ -39,17 +39,18 @@ public class JoinUnionTransposeRule extends RelOptRule {
           operand(Join.class,
               operand(Union.class, any()),
               operand(RelNode.class, any())),
-          "union on left");
+          "JoinUnionTransposeRule(Union-Other)");
 
   public static final JoinUnionTransposeRule RIGHT_UNION =
       new JoinUnionTransposeRule(
           operand(Join.class,
               operand(RelNode.class, any()),
               operand(Union.class, any())),
-          "union on right");
+          "JoinUnionTransposeRule(Other-Union)");
 
-  private JoinUnionTransposeRule(RelOptRuleOperand operand, String id) {
-    super(operand, "JoinUnionTransposeRule: " + id);
+  private JoinUnionTransposeRule(RelOptRuleOperand operand,
+      String description) {
+    super(operand, description);
   }
 
   public void onMatch(RelOptRuleCall call) {

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/7882a5b9/core/src/main/java/org/apache/calcite/rel/rules/ReduceExpressionsRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ReduceExpressionsRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ReduceExpressionsRule.java
index 620096e..5bf65de 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/ReduceExpressionsRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/ReduceExpressionsRule.java
@@ -85,7 +85,7 @@ public abstract class ReduceExpressionsRule extends RelOptRule {
    */
   public static final ReduceExpressionsRule FILTER_INSTANCE =
       new ReduceExpressionsRule(LogicalFilter.class,
-          "ReduceExpressionsRule[Filter]") {
+          "ReduceExpressionsRule(Filter)") {
         public void onMatch(RelOptRuleCall call) {
           LogicalFilter filter = call.rel(0);
           List<RexNode> expList = new ArrayList<RexNode>(filter.getChildExps());
@@ -174,7 +174,7 @@ public abstract class ReduceExpressionsRule extends RelOptRule {
 
   public static final ReduceExpressionsRule PROJECT_INSTANCE =
       new ReduceExpressionsRule(LogicalProject.class,
-          "ReduceExpressionsRule[Project]") {
+          "ReduceExpressionsRule(Project)") {
         public void onMatch(RelOptRuleCall call) {
           LogicalProject project = call.rel(0);
           List<RexNode> expList =
@@ -197,7 +197,7 @@ public abstract class ReduceExpressionsRule extends RelOptRule {
 
   public static final ReduceExpressionsRule JOIN_INSTANCE =
       new ReduceExpressionsRule(Join.class,
-          "ReduceExpressionsRule[Join]") {
+          "ReduceExpressionsRule(Join)") {
         public void onMatch(RelOptRuleCall call) {
           final Join join = call.rel(0);
           List<RexNode> expList = new ArrayList<RexNode>(join.getChildExps());
@@ -219,7 +219,7 @@ public abstract class ReduceExpressionsRule extends RelOptRule {
 
   public static final ReduceExpressionsRule CALC_INSTANCE =
       new ReduceExpressionsRule(LogicalCalc.class,
-          "ReduceExpressionsRule[Calc]") {
+          "ReduceExpressionsRule(Calc)") {
         public void onMatch(RelOptRuleCall call) {
           LogicalCalc calc = call.rel(0);
           RexProgram program = calc.getProgram();

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/7882a5b9/core/src/main/java/org/apache/calcite/rel/rules/ValuesReduceRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ValuesReduceRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ValuesReduceRule.java
index 533c027..0f77897 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/ValuesReduceRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/ValuesReduceRule.java
@@ -68,7 +68,7 @@ public abstract class ValuesReduceRule extends RelOptRule {
       new ValuesReduceRule(
           operand(LogicalFilter.class,
               operand(LogicalValues.class, none())),
-          "ValuesReduceRule[Filter") {
+          "ValuesReduceRule(Filter)") {
         public void onMatch(RelOptRuleCall call) {
           LogicalFilter filter = call.rel(0);
           LogicalValues values = call.rel(1);
@@ -84,7 +84,7 @@ public abstract class ValuesReduceRule extends RelOptRule {
       new ValuesReduceRule(
           operand(LogicalProject.class,
               operand(LogicalValues.class, none())),
-          "ValuesReduceRule[Project]") {
+          "ValuesReduceRule(Project)") {
         public void onMatch(RelOptRuleCall call) {
           LogicalProject project = call.rel(0);
           LogicalValues values = call.rel(1);
@@ -101,7 +101,7 @@ public abstract class ValuesReduceRule extends RelOptRule {
           operand(LogicalProject.class,
               operand(LogicalFilter.class,
                   operand(LogicalValues.class, none()))),
-          "ValuesReduceRule[Project+Filter]") {
+          "ValuesReduceRule(Project-Filter)") {
         public void onMatch(RelOptRuleCall call) {
           LogicalProject project = call.rel(0);
           LogicalFilter filter = call.rel(1);