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

Reply via email to