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/09/03 00:16:30 UTC
[42/50] incubator-calcite git commit: [CALCITE-834]
StackOverflowError getting predicates from the metadata provider
[CALCITE-834] StackOverflowError getting predicates from the metadata provider
Project: http://git-wip-us.apache.org/repos/asf/incubator-calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-calcite/commit/c9d7233d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-calcite/tree/c9d7233d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-calcite/diff/c9d7233d
Branch: refs/heads/branch-release
Commit: c9d7233d4e2be531814663f2a2ef3fc5600c4950
Parents: a61be0d
Author: Jesus Camacho Rodriguez <jc...@apache.org>
Authored: Tue Aug 18 19:57:42 2015 +0300
Committer: Julian Hyde <jh...@apache.org>
Committed: Tue Aug 18 11:00:33 2015 -0700
----------------------------------------------------------------------
.../calcite/rel/metadata/RelMdPredicates.java | 42 ++++++++++++++++----
.../apache/calcite/test/RelMetadataTest.java | 2 +-
2 files changed, 35 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/c9d7233d/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPredicates.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPredicates.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPredicates.java
index 5e14ba7..1912087 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPredicates.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPredicates.java
@@ -193,11 +193,21 @@ public class RelMdPredicates {
/** Infers predicates for a {@link org.apache.calcite.rel.core.SemiJoin}. */
public RelOptPredicateList getPredicates(SemiJoin semiJoin) {
- final RelNode left = semiJoin.getInput(0);
- final RelOptPredicateList leftInfo =
+ RexBuilder rB = semiJoin.getCluster().getRexBuilder();
+ RelNode left = semiJoin.getInput(0);
+ RelNode right = semiJoin.getInput(1);
+
+ RelOptPredicateList leftInfo =
RelMetadataQuery.getPulledUpPredicates(left);
- return RelOptPredicateList.of(leftInfo.pulledUpPredicates,
- leftInfo.pulledUpPredicates, ImmutableList.<RexNode>of());
+ RelOptPredicateList rightInfo =
+ RelMetadataQuery.getPulledUpPredicates(right);
+
+ JoinConditionBasedPredicateInference jI =
+ new JoinConditionBasedPredicateInference(semiJoin,
+ RexUtil.composeConjunction(rB, leftInfo.pulledUpPredicates, false),
+ RexUtil.composeConjunction(rB, rightInfo.pulledUpPredicates, false));
+
+ return jI.inferPredicates(false);
}
/** Infers predicates for a {@link org.apache.calcite.rel.core.Join}. */
@@ -325,6 +335,7 @@ public class RelMdPredicates {
*/
static class JoinConditionBasedPredicateInference {
final Join joinRel;
+ final boolean isSemiJoin;
final int nSysFields;
final int nFieldsLeft;
final int nFieldsRight;
@@ -339,9 +350,15 @@ public class RelMdPredicates {
final RexNode rightChildPredicates;
public JoinConditionBasedPredicateInference(Join joinRel,
+ RexNode lPreds, RexNode rPreds) {
+ this(joinRel, joinRel instanceof SemiJoin, lPreds, rPreds);
+ }
+
+ private JoinConditionBasedPredicateInference(Join joinRel, boolean isSemiJoin,
RexNode lPreds, RexNode rPreds) {
super();
this.joinRel = joinRel;
+ this.isSemiJoin = isSemiJoin;
nFieldsLeft = joinRel.getLeft().getRowType().getFieldList().size();
nFieldsRight = joinRel.getRight().getRowType().getFieldList().size();
nSysFields = joinRel.getSystemFieldList().size();
@@ -453,6 +470,7 @@ public class RelMdPredicates {
nSysFields + nFieldsLeft, 0, nSysFields, nFieldsLeft);
final RexPermuteInputsShuttle leftPermute =
new RexPermuteInputsShuttle(leftMapping, joinRel);
+
List<RexNode> leftInferredPredicates = new ArrayList<RexNode>();
List<RexNode> rightInferredPredicates = new ArrayList<RexNode>();
@@ -467,12 +485,20 @@ public class RelMdPredicates {
switch (joinType) {
case INNER:
- return RelOptPredicateList.of(
- Iterables.concat(RelOptUtil.conjunctions(leftChildPredicates),
+ Iterable<RexNode> pulledUpPredicates;
+ if (isSemiJoin) {
+ pulledUpPredicates = Iterables.concat(
+ RelOptUtil.conjunctions(leftChildPredicates),
+ leftInferredPredicates);
+ } else {
+ pulledUpPredicates = Iterables.concat(
+ RelOptUtil.conjunctions(leftChildPredicates),
RelOptUtil.conjunctions(rightChildPredicates),
RelOptUtil.conjunctions(joinRel.getCondition()),
- inferredPredicates),
- leftInferredPredicates, rightInferredPredicates);
+ inferredPredicates);
+ }
+ return RelOptPredicateList.of(pulledUpPredicates,
+ leftInferredPredicates, rightInferredPredicates);
case LEFT:
return RelOptPredicateList.of(
RelOptUtil.conjunctions(leftChildPredicates),
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/c9d7233d/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java b/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java
index ddb116f..5ade0c8 100644
--- a/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java
@@ -1074,7 +1074,7 @@ public class RelMetadataTest extends SqlToRelTestBase {
predicates = RelMetadataQuery.getPulledUpPredicates(semiJoin);
assertThat(predicates.pulledUpPredicates.toString(), is("[=($0, 1)]"));
- assertThat(predicates.leftInferredPredicates.toString(), is("[=($0, 1)]"));
+ assertThat(predicates.leftInferredPredicates.toString(), is("[]"));
assertThat(predicates.rightInferredPredicates.isEmpty(), is(true));
}