[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 <[email protected]> Authored: Tue Jul 3 13:30:28 2018 +0200 Committer: Jesus Camacho Rodriguez <[email protected]> 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>
