You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jc...@apache.org on 2018/07/10 22:48:38 UTC
calcite git commit: [CALCITE-2384] Performance issue in
getPulledUpPredicates (Zoltan Haindrich)
Repository: calcite
Updated Branches:
refs/heads/master 6e99f2ba5 -> d68f486b7
[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/master
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>