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:42 UTC
[2/5] incubator-calcite git commit: [CALCITE-678] SemiJoinRule mixes
up fields when Aggregate.groupSet is not field #0
[CALCITE-678] SemiJoinRule mixes up fields when Aggregate.groupSet is not field #0
Project: http://git-wip-us.apache.org/repos/asf/incubator-calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-calcite/commit/615065ac
Tree: http://git-wip-us.apache.org/repos/asf/incubator-calcite/tree/615065ac
Diff: http://git-wip-us.apache.org/repos/asf/incubator-calcite/diff/615065ac
Branch: refs/heads/master
Commit: 615065ac7e4aca3edf1bfb3fd8e56bf4ddba3da3
Parents: 57311b6
Author: Julian Hyde <jh...@apache.org>
Authored: Fri Apr 10 16:35:51 2015 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Mon Apr 13 14:55:10 2015 -0700
----------------------------------------------------------------------
.../apache/calcite/rel/rules/SemiJoinRule.java | 22 ++++++++++++++++----
1 file changed, 18 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/615065ac/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 a08c167..020090c 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,6 +16,7 @@
*/
package org.apache.calcite.rel.rules;
+import org.apache.calcite.plan.RelOptCluster;
import org.apache.calcite.plan.RelOptRule;
import org.apache.calcite.plan.RelOptRuleCall;
import org.apache.calcite.plan.RelOptUtil;
@@ -25,6 +26,8 @@ import org.apache.calcite.rel.core.Join;
import org.apache.calcite.rel.core.JoinInfo;
import org.apache.calcite.rel.core.Project;
import org.apache.calcite.rel.core.SemiJoin;
+import org.apache.calcite.rex.RexBuilder;
+import org.apache.calcite.rex.RexNode;
import org.apache.calcite.util.ImmutableBitSet;
import org.apache.calcite.util.ImmutableIntList;
import org.apache.calcite.util.IntList;
@@ -55,6 +58,8 @@ public class SemiJoinRule extends RelOptRule {
final Join join = call.rel(1);
final RelNode left = call.rel(2);
final Aggregate aggregate = call.rel(3);
+ final RelOptCluster cluster = join.getCluster();
+ final RexBuilder rexBuilder = cluster.getRexBuilder();
final ImmutableBitSet bits =
RelOptUtil.InputFinder.bits(project.getProjects(), null);
final ImmutableBitSet rightBits =
@@ -70,14 +75,23 @@ public class SemiJoinRule extends RelOptRule {
// By the way, neither a super-set nor a sub-set would work.
return;
}
- final List<Integer> newRightKeys = Lists.newArrayList();
+ if (!joinInfo.isEqui()) {
+ return;
+ }
+ final List<Integer> newRightKeyBuilder = Lists.newArrayList();
final IntList aggregateKeys = aggregate.getGroupSet().toList();
for (int key : joinInfo.rightKeys) {
- newRightKeys.add(aggregateKeys.get(key));
+ newRightKeyBuilder.add(aggregateKeys.get(key));
}
+ final ImmutableIntList newRightKeys =
+ ImmutableIntList.copyOf(newRightKeyBuilder);
+ final RelNode newRight = aggregate.getInput();
+ final RexNode newCondition =
+ RelOptUtil.createEquiJoinCondition(left, joinInfo.leftKeys, newRight,
+ newRightKeys, rexBuilder);
final SemiJoin semiJoin =
- SemiJoin.create(left, aggregate.getInput(), join.getCondition(),
- joinInfo.leftKeys, ImmutableIntList.copyOf(newRightKeys));
+ SemiJoin.create(left, newRight, newCondition, joinInfo.leftKeys,
+ newRightKeys);
final Project newProject =
project.copy(project.getTraitSet(), semiJoin, project.getProjects(),
project.getRowType());