You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by mm...@apache.org on 2018/07/20 17:41:51 UTC

[38/53] [abbrv] calcite git commit: [CALCITE-2384] Performance issue in getPulledUpPredicates (Zoltan Haindrich)

[CALCITE-2384] Performance issue in getPulledUpPredicates (Zoltan Haindrich)

Close apache/calcite#747


Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/d68f486b
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/d68f486b
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/d68f486b

Branch: refs/heads/site
Commit: d68f486b7889bc2d3b08606681f7e5a4c63547f1
Parents: 6e99f2b
Author: Zoltan Haindrich <ki...@rxd.hu>
Authored: Tue Jul 3 13:30:28 2018 +0200
Committer: Jesus Camacho Rodriguez <jc...@apache.org>
Committed: Tue Jul 10 15:31:44 2018 -0700

----------------------------------------------------------------------
 .../org/apache/calcite/rex/RexSimplify.java     | 44 ++++++++++++++------
 .../main/java/org/apache/calcite/util/Bug.java  |  6 +++
 .../org/apache/calcite/test/RelOptRulesTest.xml | 17 ++++----
 3 files changed, 45 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/d68f486b/core/src/main/java/org/apache/calcite/rex/RexSimplify.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rex/RexSimplify.java b/core/src/main/java/org/apache/calcite/rex/RexSimplify.java
index 8ebf045..7aaf141 100644
--- a/core/src/main/java/org/apache/calcite/rex/RexSimplify.java
+++ b/core/src/main/java/org/apache/calcite/rex/RexSimplify.java
@@ -28,6 +28,7 @@ import org.apache.calcite.sql.SqlKind;
 import org.apache.calcite.sql.SqlOperator;
 import org.apache.calcite.sql.fun.SqlStdOperatorTable;
 import org.apache.calcite.sql.type.SqlTypeName;
+import org.apache.calcite.util.Bug;
 import org.apache.calcite.util.Pair;
 import org.apache.calcite.util.Util;
 
@@ -58,6 +59,7 @@ public class RexSimplify {
   public final RexBuilder rexBuilder;
   private final RelOptPredicateList predicates;
   final boolean unknownAsFalse;
+  final boolean predicateElimination;
   private final RexExecutor executor;
 
   /**
@@ -70,15 +72,17 @@ public class RexSimplify {
    */
   public RexSimplify(RexBuilder rexBuilder, RelOptPredicateList predicates,
       boolean unknownAsFalse, RexExecutor executor) {
-    this(rexBuilder, predicates, unknownAsFalse, false, executor);
+    this(rexBuilder, predicates, unknownAsFalse, true, false, executor);
   }
 
   /** Internal constructor. */
   private RexSimplify(RexBuilder rexBuilder, RelOptPredicateList predicates,
-      boolean unknownAsFalse, boolean paranoid, RexExecutor executor) {
+      boolean unknownAsFalse, boolean predicateElimination, boolean paranoid,
+      RexExecutor executor) {
     this.rexBuilder = Objects.requireNonNull(rexBuilder);
     this.predicates = Objects.requireNonNull(predicates);
     this.unknownAsFalse = unknownAsFalse;
+    this.predicateElimination = predicateElimination;
     this.paranoid = paranoid;
     this.executor = Objects.requireNonNull(executor);
   }
@@ -95,18 +99,18 @@ public class RexSimplify {
    * {@link #unknownAsFalse} value. */
   public RexSimplify withUnknownAsFalse(boolean unknownAsFalse) {
     return unknownAsFalse == this.unknownAsFalse
-        ? this
-        : new RexSimplify(rexBuilder, predicates, unknownAsFalse, paranoid,
-            executor);
+      ? this
+      : new RexSimplify(rexBuilder, predicates, unknownAsFalse, predicateElimination, paranoid,
+              executor);
   }
 
   /** Returns a RexSimplify the same as this but with a specified
    * {@link #predicates} value. */
   public RexSimplify withPredicates(RelOptPredicateList predicates) {
     return predicates == this.predicates
-        ? this
-        : new RexSimplify(rexBuilder, predicates, unknownAsFalse, paranoid,
-            executor);
+      ? this
+      : new RexSimplify(rexBuilder, predicates, unknownAsFalse, predicateElimination, paranoid,
+              executor);
   }
 
   /** Returns a RexSimplify the same as this but which verifies that
@@ -116,8 +120,19 @@ public class RexSimplify {
    */
   public RexSimplify withParanoid(boolean paranoid) {
     return paranoid == this.paranoid
-        ? this
-        : new RexSimplify(rexBuilder, predicates, unknownAsFalse, paranoid,
+      ? this
+      : new RexSimplify(rexBuilder, predicates, unknownAsFalse, predicateElimination, paranoid,
+              executor);
+  }
+
+  /** Returns a RexSimplify the same as this but with a specified {@link #predicateElimination}
+   * value.
+   * This is introduced temporarily; until CALCITE-2401 is fixed
+   */
+  private RexSimplify withPredicateElimination(boolean predicateElimination) {
+    return predicateElimination == this.predicateElimination
+      ? this
+      : new RexSimplify(rexBuilder, predicates, unknownAsFalse, predicateElimination, paranoid,
             executor);
   }
 
@@ -672,7 +687,7 @@ public class RexSimplify {
     final List<RexNode> notTerms = new ArrayList<>();
     RelOptUtil.decomposeConjunction(e, terms, notTerms);
 
-    if (unknownAsFalse) {
+    if (unknownAsFalse && predicateElimination) {
       simplifyAndTerms(terms);
     } else {
       simplifyList(terms);
@@ -1039,7 +1054,9 @@ public class RexSimplify {
   public RexNode simplifyOr(RexCall call) {
     assert call.getKind() == SqlKind.OR;
     final List<RexNode> terms = RelOptUtil.disjunctions(call);
-    simplifyOrTerms(terms);
+    if (predicateElimination) {
+      simplifyOrTerms(terms);
+    }
     return simplifyOrs(terms);
   }
 
@@ -1608,7 +1625,8 @@ public class RexSimplify {
    * @return simplified conjunction of predicates for the filter, null if always false
    */
   public RexNode simplifyFilterPredicates(Iterable<? extends RexNode> predicates) {
-    final RexNode simplifiedAnds = simplifyAnds(predicates);
+    final RexNode simplifiedAnds = withPredicateElimination(Bug.CALCITE_2401_FIXED)
+        .simplifyAnds(predicates);
     if (simplifiedAnds.isAlwaysFalse()) {
       return null;
     }

http://git-wip-us.apache.org/repos/asf/calcite/blob/d68f486b/core/src/main/java/org/apache/calcite/util/Bug.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/util/Bug.java b/core/src/main/java/org/apache/calcite/util/Bug.java
index ed2d0d1..26f1bbc 100644
--- a/core/src/main/java/org/apache/calcite/util/Bug.java
+++ b/core/src/main/java/org/apache/calcite/util/Bug.java
@@ -174,6 +174,12 @@ public abstract class Bug {
    * when dynamic tables are used</a> is fixed. */
   public static final boolean CALCITE_2400_FIXED = false;
 
+  /** Whether
+   * <a href="https://issues.apache.org/jira/browse/CALCITE-2401">[CALCITE-2401]
+   * Improve RelMdPredicates performance</a>
+   */
+  public static final boolean CALCITE_2401_FIXED = false;
+
   /**
    * Use this to flag temporary code.
    */

http://git-wip-us.apache.org/repos/asf/calcite/blob/d68f486b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
----------------------------------------------------------------------
diff --git a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
index a5d1e56..ee683c1 100644
--- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
@@ -4541,15 +4541,14 @@ LogicalProject(EXPR$0=[1])
             <![CDATA[
 LogicalProject(EXPR$0=[1])
   LogicalJoin(condition=[=($0, $8)], joinType=[inner])
-    LogicalFilter(condition=[>($0, 7)])
-      LogicalUnion(all=[true])
-        LogicalProject(DEPTNO=[$7])
-          LogicalFilter(condition=[>($7, 7)])
-            LogicalTableScan(table=[[CATALOG, SALES, EMP]])
-        LogicalProject(DEPTNO=[$7])
-          LogicalFilter(condition=[>($7, 10)])
-            LogicalTableScan(table=[[CATALOG, SALES, EMP]])
-    LogicalFilter(condition=[>($7, 7)])
+    LogicalUnion(all=[true])
+      LogicalProject(DEPTNO=[$7])
+        LogicalFilter(condition=[>($7, 7)])
+          LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+      LogicalProject(DEPTNO=[$7])
+        LogicalFilter(condition=[>($7, 10)])
+          LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+    LogicalFilter(condition=[OR(>($7, 7), >($7, 10))])
       LogicalTableScan(table=[[CATALOG, SALES, EMP]])
 ]]>
         </Resource>