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