This is an automated email from the ASF dual-hosted git repository.
rubenql pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/master by this push:
new 55cc3ab [CALCITE-3309] Refactor generatePredicate method from
EnumerableNestedLoopJoin/EnumerableHashJoin/EnumerableBatchNestedLoopJoin into
a single location
55cc3ab is described below
commit 55cc3abfbcb906935a703a5cf77b1b0359fca734
Author: rubenada <[email protected]>
AuthorDate: Fri Aug 30 09:46:21 2019 +0200
[CALCITE-3309] Refactor generatePredicate method from
EnumerableNestedLoopJoin/EnumerableHashJoin/EnumerableBatchNestedLoopJoin into
a single location
---
.../calcite/adapter/enumerable/EnumUtils.java | 41 ++++++++++++++++++++
.../enumerable/EnumerableBatchNestedLoopJoin.java | 40 ++------------------
.../adapter/enumerable/EnumerableHashJoin.java | 44 ++--------------------
.../enumerable/EnumerableNestedLoopJoin.java | 43 ++-------------------
4 files changed, 52 insertions(+), 116 deletions(-)
diff --git
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumUtils.java
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumUtils.java
index 028011d..4bac2a6 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumUtils.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumUtils.java
@@ -20,6 +20,8 @@ import org.apache.calcite.adapter.java.JavaTypeFactory;
import org.apache.calcite.linq4j.JoinType;
import org.apache.calcite.linq4j.Ord;
import org.apache.calcite.linq4j.function.Function2;
+import org.apache.calcite.linq4j.function.Predicate2;
+import org.apache.calcite.linq4j.tree.BlockBuilder;
import org.apache.calcite.linq4j.tree.BlockStatement;
import org.apache.calcite.linq4j.tree.ConstantUntypedNull;
import org.apache.calcite.linq4j.tree.Expression;
@@ -27,11 +29,15 @@ import org.apache.calcite.linq4j.tree.Expressions;
import org.apache.calcite.linq4j.tree.MethodDeclaration;
import org.apache.calcite.linq4j.tree.ParameterExpression;
import org.apache.calcite.linq4j.tree.Primitive;
+import org.apache.calcite.rel.RelNode;
import org.apache.calcite.rel.core.JoinRelType;
import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.rel.type.RelDataTypeField;
+import org.apache.calcite.rex.RexBuilder;
import org.apache.calcite.rex.RexNode;
+import org.apache.calcite.rex.RexProgramBuilder;
import org.apache.calcite.util.BuiltInMethod;
+import org.apache.calcite.util.Pair;
import org.apache.calcite.util.Util;
import com.google.common.collect.ImmutableList;
@@ -282,6 +288,41 @@ public class EnumUtils {
throw new IllegalStateException(
"Unable to convert " + joinRelType + " to Linq4j JoinType");
}
+
+ /** Returns a predicate expression based on a join condition. **/
+ static Expression generatePredicate(
+ EnumerableRelImplementor implementor,
+ RexBuilder rexBuilder,
+ RelNode left,
+ RelNode right,
+ PhysType leftPhysType,
+ PhysType rightPhysType,
+ RexNode condition) {
+ final BlockBuilder builder = new BlockBuilder();
+ final ParameterExpression left_ =
+ Expressions.parameter(leftPhysType.getJavaRowType(), "left");
+ final ParameterExpression right_ =
+ Expressions.parameter(rightPhysType.getJavaRowType(), "right");
+ final RexProgramBuilder program =
+ new RexProgramBuilder(
+ implementor.getTypeFactory().builder()
+ .addAll(left.getRowType().getFieldList())
+ .addAll(right.getRowType().getFieldList())
+ .build(),
+ rexBuilder);
+ program.addCondition(condition);
+ builder.add(
+ Expressions.return_(null,
+ RexToLixTranslator.translateCondition(program.getProgram(),
+ implementor.getTypeFactory(),
+ builder,
+ new RexToLixTranslator.InputGetterImpl(
+ ImmutableList.of(Pair.of(left_, leftPhysType),
+ Pair.of(right_, rightPhysType))),
+ implementor.allCorrelateVariables,
+ implementor.getConformance())));
+ return Expressions.lambda(Predicate2.class, builder.toBlock(), left_,
right_);
+ }
}
// End EnumUtils.java
diff --git
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBatchNestedLoopJoin.java
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBatchNestedLoopJoin.java
index c2cdfb4..9860bf9 100644
---
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBatchNestedLoopJoin.java
+++
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBatchNestedLoopJoin.java
@@ -16,7 +16,6 @@
*/
package org.apache.calcite.adapter.enumerable;
-import org.apache.calcite.linq4j.function.Predicate2;
import org.apache.calcite.linq4j.tree.BlockBuilder;
import org.apache.calcite.linq4j.tree.DeclarationStatement;
import org.apache.calcite.linq4j.tree.Expression;
@@ -36,10 +35,8 @@ import org.apache.calcite.rel.core.JoinRelType;
import org.apache.calcite.rel.metadata.RelMdCollation;
import org.apache.calcite.rel.metadata.RelMetadataQuery;
import org.apache.calcite.rex.RexNode;
-import org.apache.calcite.rex.RexProgramBuilder;
import org.apache.calcite.util.BuiltInMethod;
import org.apache.calcite.util.ImmutableBitSet;
-import org.apache.calcite.util.Pair;
import com.google.common.collect.ImmutableList;
@@ -202,11 +199,9 @@ public class EnumerableBatchNestedLoopJoin extends Join
implements EnumerableRel
joinType, physType,
ImmutableList.of(leftResult.physType, rightResult.physType));
- final BlockBuilder builderPredicate = new BlockBuilder();
- final Expression predicate = generatePredicate(implementor,
- builderPredicate,
- leftResult.physType,
- rightResult.physType);
+ final Expression predicate =
+ EnumUtils.generatePredicate(implementor, getCluster().getRexBuilder(),
left, right,
+ leftResult.physType, rightResult.physType, condition);
builder.append(
Expressions.call(BuiltInMethod.CORRELATE_BATCH_JOIN.method,
@@ -218,35 +213,6 @@ public class EnumerableBatchNestedLoopJoin extends Join
implements EnumerableRel
Expressions.constant(variablesSet.size())));
return implementor.result(physType, builder.toBlock());
}
-
- // Predicate "matches" that is going to be used in correlateBatchJoin to
compare two tuples
- private Expression generatePredicate(EnumerableRelImplementor implementor,
- BlockBuilder builder, PhysType leftPhysType, PhysType rightPhysType) {
- final ParameterExpression left_ =
- Expressions.parameter(leftPhysType.getJavaRowType(), "left");
- final ParameterExpression right_ =
- Expressions.parameter(rightPhysType.getJavaRowType(), "right");
- final RexProgramBuilder program =
- new RexProgramBuilder(
- implementor.getTypeFactory().builder()
- .addAll(left.getRowType().getFieldList())
- .addAll(right.getRowType().getFieldList())
- .build(),
- getCluster().getRexBuilder());
- program.addCondition(condition);
- builder.add(
- Expressions.return_(null,
- RexToLixTranslator.translateCondition(program.getProgram(),
- implementor.getTypeFactory(),
- builder,
- new RexToLixTranslator.InputGetterImpl(
- ImmutableList.of(Pair.of(left_, leftPhysType),
- Pair.of(right_, rightPhysType))),
- implementor.allCorrelateVariables,
- implementor.getConformance())));
- return Expressions.lambda(Predicate2.class, builder.toBlock(), left_,
- right_);
- }
}
// End EnumerableBatchNestedLoopJoin.java
diff --git
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableHashJoin.java
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableHashJoin.java
index 69c294e..1667260 100644
---
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableHashJoin.java
+++
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableHashJoin.java
@@ -16,11 +16,9 @@
*/
package org.apache.calcite.adapter.enumerable;
-import org.apache.calcite.linq4j.function.Predicate2;
import org.apache.calcite.linq4j.tree.BlockBuilder;
import org.apache.calcite.linq4j.tree.Expression;
import org.apache.calcite.linq4j.tree.Expressions;
-import org.apache.calcite.linq4j.tree.ParameterExpression;
import org.apache.calcite.plan.RelOptCluster;
import org.apache.calcite.plan.RelOptCost;
import org.apache.calcite.plan.RelOptPlanner;
@@ -35,11 +33,9 @@ import org.apache.calcite.rel.metadata.RelMdCollation;
import org.apache.calcite.rel.metadata.RelMdUtil;
import org.apache.calcite.rel.metadata.RelMetadataQuery;
import org.apache.calcite.rex.RexNode;
-import org.apache.calcite.rex.RexProgramBuilder;
import org.apache.calcite.rex.RexUtil;
import org.apache.calcite.util.BuiltInMethod;
import org.apache.calcite.util.ImmutableIntList;
-import org.apache.calcite.util.Pair;
import org.apache.calcite.util.Util;
import com.google.common.collect.ImmutableList;
@@ -180,9 +176,8 @@ public class EnumerableHashJoin extends Join implements
EnumerableRel {
RexNode nonEquiCondition = RexUtil.composeConjunction(
getCluster().getRexBuilder(), joinInfo.nonEquiConditions, true);
if (nonEquiCondition != null) {
- predicate = generatePredicate(implementor,
- leftResult.physType,
- rightResult.physType, nonEquiCondition);
+ predicate = EnumUtils.generatePredicate(implementor,
getCluster().getRexBuilder(),
+ left, right, leftResult.physType, rightResult.physType,
nonEquiCondition);
}
}
return implementor.result(
@@ -224,9 +219,8 @@ public class EnumerableHashJoin extends Join implements
EnumerableRel {
RexNode nonEquiCondition = RexUtil.composeConjunction(
getCluster().getRexBuilder(), joinInfo.nonEquiConditions, true);
if (nonEquiCondition != null) {
- predicate = generatePredicate(implementor,
- leftResult.physType,
- rightResult.physType, nonEquiCondition);
+ predicate = EnumUtils.generatePredicate(implementor,
getCluster().getRexBuilder(),
+ left, right, leftResult.physType, rightResult.physType,
nonEquiCondition);
}
}
return implementor.result(
@@ -254,36 +248,6 @@ public class EnumerableHashJoin extends Join implements
EnumerableRel {
))
.toBlock());
}
-
- Expression generatePredicate(EnumerableRelImplementor implementor,
- PhysType leftPhysType, PhysType rightPhysType,
- RexNode condition) {
- BlockBuilder builder = new BlockBuilder();
- final ParameterExpression left_ =
- Expressions.parameter(leftPhysType.getJavaRowType(), "left");
- final ParameterExpression right_ =
- Expressions.parameter(rightPhysType.getJavaRowType(), "right");
- final RexProgramBuilder program =
- new RexProgramBuilder(
- implementor.getTypeFactory().builder()
- .addAll(left.getRowType().getFieldList())
- .addAll(right.getRowType().getFieldList())
- .build(),
- getCluster().getRexBuilder());
- program.addCondition(condition);
- builder.add(
- Expressions.return_(null,
- RexToLixTranslator.translateCondition(program.getProgram(),
- implementor.getTypeFactory(),
- builder,
- new RexToLixTranslator.InputGetterImpl(
- ImmutableList.of(Pair.of(left_, leftPhysType),
- Pair.of(right_, rightPhysType))),
- implementor.allCorrelateVariables,
- implementor.getConformance())));
- return Expressions.lambda(Predicate2.class, builder.toBlock(), left_,
- right_);
- }
}
// End EnumerableHashJoin.java
diff --git
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableNestedLoopJoin.java
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableNestedLoopJoin.java
index a4e7b81..d79cb03 100644
---
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableNestedLoopJoin.java
+++
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableNestedLoopJoin.java
@@ -16,11 +16,9 @@
*/
package org.apache.calcite.adapter.enumerable;
-import org.apache.calcite.linq4j.function.Predicate2;
import org.apache.calcite.linq4j.tree.BlockBuilder;
import org.apache.calcite.linq4j.tree.Expression;
import org.apache.calcite.linq4j.tree.Expressions;
-import org.apache.calcite.linq4j.tree.ParameterExpression;
import org.apache.calcite.plan.RelOptCluster;
import org.apache.calcite.plan.RelOptCost;
import org.apache.calcite.plan.RelOptPlanner;
@@ -34,9 +32,7 @@ import org.apache.calcite.rel.metadata.RelMdCollation;
import org.apache.calcite.rel.metadata.RelMdUtil;
import org.apache.calcite.rel.metadata.RelMetadataQuery;
import org.apache.calcite.rex.RexNode;
-import org.apache.calcite.rex.RexProgramBuilder;
import org.apache.calcite.util.BuiltInMethod;
-import org.apache.calcite.util.Pair;
import com.google.common.collect.ImmutableList;
@@ -127,18 +123,16 @@ public class EnumerableNestedLoopJoin extends Join
implements EnumerableRel {
PhysTypeImpl.of(implementor.getTypeFactory(),
getRowType(),
pref.preferArray());
- final BlockBuilder builder2 = new BlockBuilder();
+ final Expression predicate =
+ EnumUtils.generatePredicate(implementor, getCluster().getRexBuilder(),
left, right,
+ leftResult.physType, rightResult.physType, condition);
return implementor.result(
physType,
builder.append(
Expressions.call(BuiltInMethod.NESTED_LOOP_JOIN.method,
leftExpression,
rightExpression,
- predicate(implementor,
- builder2,
- leftResult.physType,
- rightResult.physType,
- condition),
+ predicate,
EnumUtils.joinSelector(joinType,
physType,
ImmutableList.of(leftResult.physType,
@@ -146,35 +140,6 @@ public class EnumerableNestedLoopJoin extends Join
implements EnumerableRel {
Expressions.constant(EnumUtils.toLinq4jJoinType(joinType))))
.toBlock());
}
-
- Expression predicate(EnumerableRelImplementor implementor,
- BlockBuilder builder, PhysType leftPhysType, PhysType rightPhysType,
- RexNode condition) {
- final ParameterExpression left_ =
- Expressions.parameter(leftPhysType.getJavaRowType(), "left");
- final ParameterExpression right_ =
- Expressions.parameter(rightPhysType.getJavaRowType(), "right");
- final RexProgramBuilder program =
- new RexProgramBuilder(
- implementor.getTypeFactory().builder()
- .addAll(left.getRowType().getFieldList())
- .addAll(right.getRowType().getFieldList())
- .build(),
- getCluster().getRexBuilder());
- program.addCondition(condition);
- builder.add(
- Expressions.return_(null,
- RexToLixTranslator.translateCondition(program.getProgram(),
- implementor.getTypeFactory(),
- builder,
- new RexToLixTranslator.InputGetterImpl(
- ImmutableList.of(Pair.of((Expression) left_, leftPhysType),
- Pair.of((Expression) right_, rightPhysType))),
- implementor.allCorrelateVariables,
- implementor.getConformance())));
- return Expressions.lambda(Predicate2.class, builder.toBlock(), left_,
- right_);
- }
}
// End EnumerableNestedLoopJoin.java