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 2015/04/16 18:16:44 UTC

[4/5] incubator-calcite git commit: [CALCITE-679] Factory method for SemiJoin

[CALCITE-679] Factory method for SemiJoin


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

Branch: refs/heads/master
Commit: 57311b6bd1b1a279a836b11381771ac0121f99da
Parents: ec925e2
Author: Julian Hyde <jh...@apache.org>
Authored: Fri Apr 10 16:47:51 2015 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Mon Apr 13 14:55:10 2015 -0700

----------------------------------------------------------------------
 .../adapter/enumerable/EnumerableSemiJoin.java  | 18 +++++++++
 .../enumerable/EnumerableSemiJoinRule.java      | 18 ++-------
 .../apache/calcite/rel/core/RelFactories.java   |  2 +-
 .../org/apache/calcite/rel/core/SemiJoin.java   | 11 ++++++
 .../rel/rules/JoinAddRedundantSemiJoinRule.java |  6 +--
 .../rel/rules/LoptSemiJoinOptimizer.java        | 41 +++++++-------------
 .../rel/rules/SemiJoinFilterTransposeRule.java  |  6 +--
 .../rel/rules/SemiJoinJoinTransposeRule.java    |  6 +--
 .../rel/rules/SemiJoinProjectTransposeRule.java | 17 +++-----
 .../apache/calcite/rel/rules/SemiJoinRule.java  |  8 +---
 10 files changed, 57 insertions(+), 76 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/57311b6b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSemiJoin.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSemiJoin.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSemiJoin.java
index fc87572..569e79e 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSemiJoin.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSemiJoin.java
@@ -37,6 +37,9 @@ import org.apache.calcite.util.Util;
 /** Implementation of {@link org.apache.calcite.rel.core.SemiJoin} in
  * {@link org.apache.calcite.adapter.enumerable.EnumerableConvention enumerable calling convention}. */
 public class EnumerableSemiJoin extends SemiJoin implements EnumerableRel {
+  /** Creates an EnumerableSemiJoin.
+   *
+   * <p>Use {@link #create} unless you know what you're doing. */
   EnumerableSemiJoin(
       RelOptCluster cluster,
       RelTraitSet traits,
@@ -49,6 +52,21 @@ public class EnumerableSemiJoin extends SemiJoin implements EnumerableRel {
     super(cluster, traits, left, right, condition, leftKeys, rightKeys);
   }
 
+  /** Creates an EnumerableSemiJoin. */
+  public static EnumerableSemiJoin create(RelNode left, RelNode right, RexNode condition,
+      ImmutableIntList leftKeys, ImmutableIntList rightKeys) {
+    final RelOptCluster cluster = left.getCluster();
+    try {
+      return new EnumerableSemiJoin(cluster,
+          cluster.traitSetOf(EnumerableConvention.INSTANCE), left,
+          right, condition, leftKeys, rightKeys);
+    } catch (InvalidRelException e) {
+      // Semantic error not possible. Must be a bug. Convert to
+      // internal error.
+      throw new AssertionError(e);
+    }
+  }
+
   @Override public SemiJoin copy(RelTraitSet traitSet, RexNode condition,
       RelNode left, RelNode right, JoinRelType joinType,
       boolean semiJoinDone) {

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/57311b6b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSemiJoinRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSemiJoinRule.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSemiJoinRule.java
index f078e7a..96f4be7 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSemiJoinRule.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSemiJoinRule.java
@@ -17,7 +17,6 @@
 package org.apache.calcite.adapter.enumerable;
 
 import org.apache.calcite.plan.Convention;
-import org.apache.calcite.rel.InvalidRelException;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.convert.ConverterRule;
 import org.apache.calcite.rel.core.SemiJoin;
@@ -36,7 +35,7 @@ class EnumerableSemiJoinRule extends ConverterRule {
 
   @Override public RelNode convert(RelNode rel) {
     final SemiJoin semiJoin = (SemiJoin) rel;
-    List<RelNode> newInputs = new ArrayList<RelNode>();
+    final List<RelNode> newInputs = new ArrayList<>();
     for (RelNode input : semiJoin.getInputs()) {
       if (!(input.getConvention() instanceof EnumerableConvention)) {
         input =
@@ -45,19 +44,8 @@ class EnumerableSemiJoinRule extends ConverterRule {
       }
       newInputs.add(input);
     }
-    try {
-      return new EnumerableSemiJoin(
-          semiJoin.getCluster(),
-          semiJoin.getTraitSet().replace(EnumerableConvention.INSTANCE),
-          newInputs.get(0),
-          newInputs.get(1),
-          semiJoin.getCondition(),
-          semiJoin.leftKeys,
-          semiJoin.rightKeys);
-    } catch (InvalidRelException e) {
-      EnumerableRules.LOGGER.fine(e.toString());
-      return null;
-    }
+    return EnumerableSemiJoin.create(newInputs.get(0), newInputs.get(1),
+        semiJoin.getCondition(), semiJoin.leftKeys, semiJoin.rightKeys);
   }
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/57311b6b/core/src/main/java/org/apache/calcite/rel/core/RelFactories.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/core/RelFactories.java b/core/src/main/java/org/apache/calcite/rel/core/RelFactories.java
index eaa2c43..2e2225a 100644
--- a/core/src/main/java/org/apache/calcite/rel/core/RelFactories.java
+++ b/core/src/main/java/org/apache/calcite/rel/core/RelFactories.java
@@ -243,7 +243,7 @@ public class RelFactories {
     public RelNode createSemiJoin(RelNode left, RelNode right,
         RexNode condition) {
       final JoinInfo joinInfo = JoinInfo.of(left, right, condition);
-      return new SemiJoin(left.getCluster(), left.getTraitSet(), left, right,
+      return SemiJoin.create(left, right,
         condition, joinInfo.leftKeys, joinInfo.rightKeys);
     }
   }

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/57311b6b/core/src/main/java/org/apache/calcite/rel/core/SemiJoin.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/core/SemiJoin.java b/core/src/main/java/org/apache/calcite/rel/core/SemiJoin.java
index 65f7887..77129b1 100644
--- a/core/src/main/java/org/apache/calcite/rel/core/SemiJoin.java
+++ b/core/src/main/java/org/apache/calcite/rel/core/SemiJoin.java
@@ -16,6 +16,7 @@
  */
 package org.apache.calcite.rel.core;
 
+import org.apache.calcite.plan.Convention;
 import org.apache.calcite.plan.RelOptCluster;
 import org.apache.calcite.plan.RelOptCost;
 import org.apache.calcite.plan.RelOptPlanner;
@@ -44,6 +45,8 @@ public class SemiJoin extends EquiJoin {
   /**
    * Creates a SemiJoin.
    *
+   * <p>Use {@link #create} unless you know what you're doing.
+   *
    * @param cluster   cluster that join belongs to
    * @param traitSet  Trait set
    * @param left      left join input
@@ -72,6 +75,14 @@ public class SemiJoin extends EquiJoin {
         ImmutableSet.<String>of());
   }
 
+  /** Creates a SemiJoin. */
+  public static SemiJoin create(RelNode left, RelNode right, RexNode condition,
+      ImmutableIntList leftKeys, ImmutableIntList rightKeys) {
+    final RelOptCluster cluster = left.getCluster();
+    return new SemiJoin(cluster, cluster.traitSetOf(Convention.NONE), left,
+        right, condition, leftKeys, rightKeys);
+  }
+
   //~ Methods ----------------------------------------------------------------
 
   @Override public SemiJoin copy(RelTraitSet traitSet, RexNode condition,

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/57311b6b/core/src/main/java/org/apache/calcite/rel/rules/JoinAddRedundantSemiJoinRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/JoinAddRedundantSemiJoinRule.java b/core/src/main/java/org/apache/calcite/rel/rules/JoinAddRedundantSemiJoinRule.java
index 2940ac4..ae68a91 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/JoinAddRedundantSemiJoinRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/JoinAddRedundantSemiJoinRule.java
@@ -16,7 +16,6 @@
  */
 package org.apache.calcite.rel.rules;
 
-import org.apache.calcite.plan.Convention;
 import org.apache.calcite.plan.RelOptRule;
 import org.apache.calcite.plan.RelOptRuleCall;
 import org.apache.calcite.rel.RelNode;
@@ -68,10 +67,7 @@ public class JoinAddRedundantSemiJoinRule extends RelOptRule {
     }
 
     RelNode semiJoin =
-        new SemiJoin(
-            origJoinRel.getCluster(),
-            origJoinRel.getCluster().traitSetOf(Convention.NONE),
-            origJoinRel.getLeft(),
+        SemiJoin.create(origJoinRel.getLeft(),
             origJoinRel.getRight(),
             origJoinRel.getCondition(),
             joinInfo.leftKeys,

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/57311b6b/core/src/main/java/org/apache/calcite/rel/rules/LoptSemiJoinOptimizer.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/LoptSemiJoinOptimizer.java b/core/src/main/java/org/apache/calcite/rel/rules/LoptSemiJoinOptimizer.java
index 402cd0f..080cb9c 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/LoptSemiJoinOptimizer.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/LoptSemiJoinOptimizer.java
@@ -16,7 +16,6 @@
  */
 package org.apache.calcite.rel.rules;
 
-import org.apache.calcite.plan.Convention;
 import org.apache.calcite.plan.RelOptCost;
 import org.apache.calcite.plan.RelOptTable;
 import org.apache.calcite.plan.RelOptUtil;
@@ -108,7 +107,7 @@ public class LoptSemiJoinOptimizer {
    * @param multiJoin join factors being optimized
    */
   public void makePossibleSemiJoins(LoptMultiJoin multiJoin) {
-    possibleSemiJoins = new HashMap<Integer, Map<Integer, SemiJoin>>();
+    possibleSemiJoins = new HashMap<>();
 
     // semijoins can't be used with any type of outer join, including full
     if (multiJoin.getMultiJoinRel().isFullOuterJoin()) {
@@ -117,10 +116,8 @@ public class LoptSemiJoinOptimizer {
 
     int nJoinFactors = multiJoin.getNumJoinFactors();
     for (int factIdx = 0; factIdx < nJoinFactors; factIdx++) {
-      Map<Integer, List<RexNode>> dimFilters =
-          new HashMap<Integer, List<RexNode>>();
-      Map<Integer, SemiJoin> semiJoinMap =
-          new HashMap<Integer, SemiJoin>();
+      final Map<Integer, List<RexNode>> dimFilters = new HashMap<>();
+      final Map<Integer, SemiJoin> semiJoinMap = new HashMap<>();
 
       // loop over all filters and find equality filters that reference
       // this factor and one other factor
@@ -142,7 +139,7 @@ public class LoptSemiJoinOptimizer {
         // that dimension factor; otherwise, create a new entry
         List<RexNode> currDimFilters = dimFilters.get(dimIdx);
         if (currDimFilters == null) {
-          currDimFilters = new ArrayList<RexNode>();
+          currDimFilters = new ArrayList<>();
         }
         currDimFilters.add(joinFilter);
         dimFilters.put(dimIdx, currDimFilters);
@@ -267,7 +264,7 @@ public class LoptSemiJoinOptimizer {
 
     // make sure all the fact table keys originate from the same table
     // and are simple column references
-    List<Integer> actualLeftKeys = new ArrayList<Integer>();
+    final List<Integer> actualLeftKeys = new ArrayList<>();
     LcsTable factTable =
         validateKeys(
             factRel,
@@ -279,7 +276,7 @@ public class LoptSemiJoinOptimizer {
     }
 
     // find the best index
-    List<Integer> bestKeyOrder = new ArrayList<Integer>();
+    final List<Integer> bestKeyOrder = new ArrayList<>();
     LcsTableScan tmpFactRel =
         (LcsTableScan) factTable.toRel(
             RelOptUtil.getContext(factRel.getCluster()));
@@ -301,14 +298,14 @@ public class LoptSemiJoinOptimizer {
     // the condition; note that we don't save the actual keys here because
     // later when the semijoin is pushed past other RelNodes, the keys will
     // be converted
-    List<Integer> truncatedLeftKeys;
-    List<Integer> truncatedRightKeys;
+    final List<Integer> truncatedLeftKeys;
+    final List<Integer> truncatedRightKeys;
     if (actualLeftKeys.size() == bestKeyOrder.size()) {
       truncatedLeftKeys = leftKeys;
       truncatedRightKeys = rightKeys;
     } else {
-      truncatedLeftKeys = new ArrayList<Integer>();
-      truncatedRightKeys = new ArrayList<Integer>();
+      truncatedLeftKeys = new ArrayList<>();
+      truncatedRightKeys = new ArrayList<>();
       for (int key : bestKeyOrder) {
         truncatedLeftKeys.add(leftKeys.get(key));
         truncatedRightKeys.add(rightKeys.get(key));
@@ -319,16 +316,9 @@ public class LoptSemiJoinOptimizer {
               multiJoin.getNumFieldsInJoinFactor(factIdx),
               semiJoinCondition);
     }
-    SemiJoin semiJoin =
-        new SemiJoin(
-            factRel.getCluster(),
-            factRel.getCluster().traitSetOf(Convention.NONE),
-            factRel,
-            dimRel,
-            semiJoinCondition,
-            ImmutableIntList.copyOf(truncatedLeftKeys),
-            ImmutableIntList.copyOf(truncatedRightKeys));
-    return semiJoin;
+    return SemiJoin.create(factRel, dimRel, semiJoinCondition,
+        ImmutableIntList.copyOf(truncatedLeftKeys),
+        ImmutableIntList.copyOf(truncatedRightKeys));
   }
 
   /**
@@ -589,10 +579,7 @@ public class LoptSemiJoinOptimizer {
       if (bestDimIdx != -1) {
         SemiJoin semiJoin = possibleDimensions.get(bestDimIdx);
         SemiJoin chosenSemiJoin =
-            new SemiJoin(
-                factRel.getCluster(),
-                factRel.getCluster().traitSetOf(Convention.NONE),
-                factRel,
+            SemiJoin.create(factRel,
                 chosenSemiJoins[bestDimIdx],
                 semiJoin.getCondition(),
                 semiJoin.getLeftKeys(),

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/57311b6b/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinFilterTransposeRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinFilterTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinFilterTransposeRule.java
index 9fa288d..0a6b26e 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinFilterTransposeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinFilterTransposeRule.java
@@ -16,7 +16,6 @@
  */
 package org.apache.calcite.rel.rules;
 
-import org.apache.calcite.plan.Convention;
 import org.apache.calcite.plan.RelOptRule;
 import org.apache.calcite.plan.RelOptRuleCall;
 import org.apache.calcite.plan.RelOptUtil;
@@ -59,10 +58,7 @@ public class SemiJoinFilterTransposeRule extends RelOptRule {
     LogicalFilter filter = call.rel(1);
 
     RelNode newSemiJoin =
-        new SemiJoin(
-            semiJoin.getCluster(),
-            semiJoin.getCluster().traitSetOf(Convention.NONE),
-            filter.getInput(),
+        SemiJoin.create(filter.getInput(),
             semiJoin.getRight(),
             semiJoin.getCondition(),
             semiJoin.getLeftKeys(),

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/57311b6b/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinJoinTransposeRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinJoinTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinJoinTransposeRule.java
index a859161..42821e7 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinJoinTransposeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinJoinTransposeRule.java
@@ -16,7 +16,6 @@
  */
 package org.apache.calcite.rel.rules;
 
-import org.apache.calcite.plan.Convention;
 import org.apache.calcite.plan.RelOptRule;
 import org.apache.calcite.plan.RelOptRuleCall;
 import org.apache.calcite.plan.RelOptUtil;
@@ -156,10 +155,7 @@ public class SemiJoinJoinTransposeRule extends RelOptRule {
       leftSemiJoinOp = join.getRight();
     }
     SemiJoin newSemiJoin =
-        new SemiJoin(
-            semiJoin.getCluster(),
-            semiJoin.getCluster().traitSetOf(Convention.NONE),
-            leftSemiJoinOp,
+        SemiJoin.create(leftSemiJoinOp,
             semiJoin.getRight(),
             newSemiJoinFilter,
             ImmutableIntList.copyOf(newLeftKeys),

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/57311b6b/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinProjectTransposeRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinProjectTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinProjectTransposeRule.java
index dfae5f0..8cb450e 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinProjectTransposeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinProjectTransposeRule.java
@@ -16,7 +16,6 @@
  */
 package org.apache.calcite.rel.rules;
 
-import org.apache.calcite.plan.Convention;
 import org.apache.calcite.plan.RelOptRule;
 import org.apache.calcite.plan.RelOptRuleCall;
 import org.apache.calcite.plan.RelOptUtil;
@@ -75,9 +74,9 @@ public class SemiJoinProjectTransposeRule extends RelOptRule {
     // convert the LHS semijoin keys to reference the child projection
     // expression; all projection expressions must be RexInputRefs,
     // otherwise, we wouldn't have created this semijoin
-    List<Integer> newLeftKeys = new ArrayList<Integer>();
-    List<Integer> leftKeys = semiJoin.getLeftKeys();
-    List<RexNode> projExprs = project.getProjects();
+    final List<Integer> newLeftKeys = new ArrayList<>();
+    final List<Integer> leftKeys = semiJoin.getLeftKeys();
+    final List<RexNode> projExprs = project.getProjects();
     for (int leftKey : leftKeys) {
       RexInputRef inputRef = (RexInputRef) projExprs.get(leftKey);
       newLeftKeys.add(inputRef.getIndex());
@@ -88,14 +87,8 @@ public class SemiJoinProjectTransposeRule extends RelOptRule {
     RexNode newCondition = adjustCondition(project, semiJoin);
 
     SemiJoin newSemiJoin =
-        new SemiJoin(
-            semiJoin.getCluster(),
-            semiJoin.getCluster().traitSetOf(Convention.NONE),
-            project.getInput(),
-            semiJoin.getRight(),
-            newCondition,
-            ImmutableIntList.copyOf(newLeftKeys),
-            semiJoin.getRightKeys());
+        SemiJoin.create(project.getInput(), semiJoin.getRight(), newCondition,
+            ImmutableIntList.copyOf(newLeftKeys), semiJoin.getRightKeys());
 
     // Create the new projection.  Note that the projection expressions
     // are the same as the original because they only reference the LHS

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/57311b6b/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinRule.java b/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinRule.java
index 532f3bc..a08c167 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinRule.java
@@ -16,7 +16,6 @@
  */
 package org.apache.calcite.rel.rules;
 
-import org.apache.calcite.plan.Convention;
 import org.apache.calcite.plan.RelOptRule;
 import org.apache.calcite.plan.RelOptRuleCall;
 import org.apache.calcite.plan.RelOptUtil;
@@ -77,11 +76,8 @@ public class SemiJoinRule extends RelOptRule {
       newRightKeys.add(aggregateKeys.get(key));
     }
     final SemiJoin semiJoin =
-        new SemiJoin(join.getCluster(),
-            join.getCluster().traitSetOf(Convention.NONE),
-            left, aggregate.getInput(),
-            join.getCondition(), joinInfo.leftKeys,
-            ImmutableIntList.copyOf(newRightKeys));
+        SemiJoin.create(left, aggregate.getInput(), join.getCondition(),
+            joinInfo.leftKeys, ImmutableIntList.copyOf(newRightKeys));
     final Project newProject =
         project.copy(project.getTraitSet(), semiJoin, project.getProjects(),
             project.getRowType());