You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by da...@apache.org on 2020/02/15 03:50:10 UTC

[calcite] branch master updated: [CALCITE-3797] RelMdPredicates should not assume the RexExecutor instance is RexExecutorImpl

This is an automated email from the ASF dual-hosted git repository.

danny0405 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 bf3fb49  [CALCITE-3797] RelMdPredicates should not assume the RexExecutor instance is RexExecutorImpl
bf3fb49 is described below

commit bf3fb49eba29f4b90b1232f7abaaa32cf7bb73aa
Author: yuzhao.cyz <yu...@gmail.com>
AuthorDate: Fri Feb 14 17:31:04 2020 +0800

    [CALCITE-3797] RelMdPredicates should not assume the RexExecutor instance is RexExecutorImpl
    
    The RexExecutor is actually pluggable, we should not do such an assumption.
---
 .../java/org/apache/calcite/plan/RexImplicationChecker.java |  8 ++++----
 .../org/apache/calcite/rel/metadata/RelMdPredicates.java    |  8 ++++----
 .../main/java/org/apache/calcite/rex/RexExecutorImpl.java   | 13 +++++++++----
 3 files changed, 17 insertions(+), 12 deletions(-)

diff --git a/core/src/main/java/org/apache/calcite/plan/RexImplicationChecker.java b/core/src/main/java/org/apache/calcite/plan/RexImplicationChecker.java
index 3e56c0a..2a94e61 100644
--- a/core/src/main/java/org/apache/calcite/plan/RexImplicationChecker.java
+++ b/core/src/main/java/org/apache/calcite/plan/RexImplicationChecker.java
@@ -21,6 +21,7 @@ import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rex.RexBuilder;
 import org.apache.calcite.rex.RexCall;
 import org.apache.calcite.rex.RexExecutable;
+import org.apache.calcite.rex.RexExecutor;
 import org.apache.calcite.rex.RexExecutorImpl;
 import org.apache.calcite.rex.RexInputRef;
 import org.apache.calcite.rex.RexNode;
@@ -62,12 +63,12 @@ public class RexImplicationChecker {
       new CalciteLogger(LoggerFactory.getLogger(RexImplicationChecker.class));
 
   final RexBuilder builder;
-  final RexExecutorImpl executor;
+  final RexExecutor executor;
   final RelDataType rowType;
 
   public RexImplicationChecker(
       RexBuilder builder,
-      RexExecutorImpl executor,
+      RexExecutor executor,
       RelDataType rowType) {
     this.builder = Objects.requireNonNull(builder);
     this.executor = Objects.requireNonNull(executor);
@@ -249,8 +250,7 @@ public class RexImplicationChecker {
     }
 
     ImmutableList<RexNode> constExps = ImmutableList.of(second);
-    final RexExecutable exec =
-        executor.getExecutable(builder, constExps, rowType);
+    final RexExecutable exec = RexExecutorImpl.getExecutable(builder, constExps, rowType);
 
     Object[] result;
     exec.setDataContext(dataValues);
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 2aa3091..0061042 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
@@ -41,7 +41,6 @@ import org.apache.calcite.rel.core.Union;
 import org.apache.calcite.rex.RexBuilder;
 import org.apache.calcite.rex.RexCall;
 import org.apache.calcite.rex.RexExecutor;
-import org.apache.calcite.rex.RexExecutorImpl;
 import org.apache.calcite.rex.RexInputRef;
 import org.apache.calcite.rex.RexLiteral;
 import org.apache.calcite.rex.RexNode;
@@ -422,10 +421,11 @@ public class RelMdPredicates
   public RelOptPredicateList getPredicates(Intersect intersect, RelMetadataQuery mq) {
     final RexBuilder rexBuilder = intersect.getCluster().getRexBuilder();
 
-    final RexExecutorImpl rexImpl =
-        (RexExecutorImpl) (intersect.getCluster().getPlanner().getExecutor());
+    final RexExecutor executor =
+        Util.first(intersect.getCluster().getPlanner().getExecutor(), RexUtil.EXECUTOR);
+
     final RexImplicationChecker rexImplicationChecker =
-        new RexImplicationChecker(rexBuilder, rexImpl, intersect.getRowType());
+        new RexImplicationChecker(rexBuilder, executor, intersect.getRowType());
 
     Set<RexNode> finalPredicates = new HashSet<>();
 
diff --git a/core/src/main/java/org/apache/calcite/rex/RexExecutorImpl.java b/core/src/main/java/org/apache/calcite/rex/RexExecutorImpl.java
index 120c444..c77033d 100644
--- a/core/src/main/java/org/apache/calcite/rex/RexExecutorImpl.java
+++ b/core/src/main/java/org/apache/calcite/rex/RexExecutorImpl.java
@@ -44,7 +44,12 @@ import java.lang.reflect.Type;
 import java.util.List;
 
 /**
-* Evaluates a {@link RexNode} expression.
+ * Evaluates a {@link RexNode} expression.
+ *
+ * <p>For this impl, all the public methods should be
+ * static except that it inherits from {@link RexExecutor}.
+ * This pretends that other code in the project assumes
+ * the executor instance is {@link RexExecutorImpl}.
 */
 public class RexExecutorImpl implements RexExecutor {
 
@@ -54,14 +59,14 @@ public class RexExecutorImpl implements RexExecutor {
     this.dataContext = dataContext;
   }
 
-  private String compile(RexBuilder rexBuilder, List<RexNode> constExps,
+  private static String compile(RexBuilder rexBuilder, List<RexNode> constExps,
       RexToLixTranslator.InputGetter getter) {
     final RelDataTypeFactory typeFactory = rexBuilder.getTypeFactory();
     final RelDataType emptyRowType = typeFactory.builder().build();
     return compile(rexBuilder, constExps, getter, emptyRowType);
   }
 
-  private String compile(RexBuilder rexBuilder, List<RexNode> constExps,
+  private static String compile(RexBuilder rexBuilder, List<RexNode> constExps,
       RexToLixTranslator.InputGetter getter, RelDataType rowType) {
     final RexProgramBuilder programBuilder =
         new RexProgramBuilder(rowType, rexBuilder);
@@ -106,7 +111,7 @@ public class RexExecutorImpl implements RexExecutor {
    * @param exps Expressions
    * @param rowType describes the structure of the input row.
    */
-  public RexExecutable getExecutable(RexBuilder rexBuilder, List<RexNode> exps,
+  public static RexExecutable getExecutable(RexBuilder rexBuilder, List<RexNode> exps,
       RelDataType rowType) {
     final JavaTypeFactoryImpl typeFactory =
         new JavaTypeFactoryImpl(rexBuilder.getTypeFactory().getTypeSystem());