Repository: calcite Updated Branches: refs/heads/master 942693e67 -> 361096ba1 (forced update)
[CALCITE-996] Simplify predicate when we create a Filter operator Close apache/calcite#171 Project: http://git-wip-us.apache.org/repos/asf/calcite/repo Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/a67b4a97 Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/a67b4a97 Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/a67b4a97 Branch: refs/heads/master Commit: a67b4a976bef6c104212732c6a8f8ce364c372ba Parents: ebcba3b Author: Jesus Camacho Rodriguez <[email protected]> Authored: Mon Jan 11 21:12:30 2016 +0100 Committer: Julian Hyde <[email protected]> Committed: Tue Jan 12 10:21:49 2016 -0800 ---------------------------------------------------------------------- .../org/apache/calcite/tools/RelBuilder.java | 6 +++--- .../org/apache/calcite/test/RelBuilderTest.java | 22 ++++++++++++++++++++ .../calcite/test/SqlToRelConverterTest.xml | 11 ++++------ 3 files changed, 29 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite/blob/a67b4a97/core/src/main/java/org/apache/calcite/tools/RelBuilder.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/tools/RelBuilder.java b/core/src/main/java/org/apache/calcite/tools/RelBuilder.java index 916f0dd..00ce6d1 100644 --- a/core/src/main/java/org/apache/calcite/tools/RelBuilder.java +++ b/core/src/main/java/org/apache/calcite/tools/RelBuilder.java @@ -692,9 +692,9 @@ public class RelBuilder { * and optimized in a similar way to the {@link #and} method. * If the result is TRUE no filter is created. */ public RelBuilder filter(Iterable<? extends RexNode> predicates) { - final RexNode x = RexUtil.composeConjunction(cluster.getRexBuilder(), - predicates, true); - if (x != null) { + final RexNode x = RexUtil.simplify(cluster.getRexBuilder(), + RexUtil.composeConjunction(cluster.getRexBuilder(), predicates, false)); + if (!x.isAlwaysTrue()) { final Frame frame = Stacks.pop(stack); final RelNode filter = filterFactory.createFilter(frame.rel, x); Stacks.push(stack, new Frame(filter, frame.right)); http://git-wip-us.apache.org/repos/asf/calcite/blob/a67b4a97/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java b/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java index bb53728..0b232f4 100644 --- a/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java +++ b/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java @@ -202,6 +202,28 @@ public class RelBuilderTest { + " LogicalTableScan(table=[[scott, EMP]])\n")); } + @Test public void testScanFilterOr2() { + // Equivalent SQL: + // SELECT * + // FROM emp + // WHERE deptno = 20 OR deptno = 20 + final RelBuilder builder = RelBuilder.create(config().build()); + RelNode root = + builder.scan("EMP") + .filter( + builder.call(SqlStdOperatorTable.OR, + builder.call(SqlStdOperatorTable.GREATER_THAN, + builder.field("DEPTNO"), + builder.literal(20)), + builder.call(SqlStdOperatorTable.GREATER_THAN, + builder.field("DEPTNO"), + builder.literal(20)))) + .build(); + assertThat(str(root), + is("LogicalFilter(condition=[>($7, 20)])\n" + + " LogicalTableScan(table=[[scott, EMP]])\n")); + } + @Test public void testBadFieldName() { final RelBuilder builder = RelBuilder.create(config().build()); try { http://git-wip-us.apache.org/repos/asf/calcite/blob/a67b4a97/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml ---------------------------------------------------------------------- diff --git a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml index 764dde2..a02eb60 100644 --- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml +++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml @@ -511,8 +511,7 @@ LogicalProject(EXPR$0=[1]) <TestCase name="testIntervalLiteralYearToMonth"> <Resource name="sql"> <![CDATA[select cast(empno as Integer) * (INTERVAL '1-1' YEAR TO MONTH) -from emp -]]> +from emp]]> </Resource> <Resource name="plan"> <![CDATA[ @@ -524,8 +523,7 @@ LogicalProject(EXPR$0=[*(CAST($0):INTEGER NOT NULL, 13)]) <TestCase name="testIntervalLiteralHourToMinute"> <Resource name="sql"> <![CDATA[select cast(empno as Integer) * (INTERVAL '1:1' HOUR TO MINUTE) -from emp -]]> +from emp]]> </Resource> <Resource name="plan"> <![CDATA[ @@ -2394,8 +2392,7 @@ LogicalProject(EXPR$0=[$2], EXPR$1=[RANK() OVER (ORDER BY $1 RANGE BETWEEN UNBOU <Resource name="sql"> <![CDATA[select avg(deptno) over () from emp -group by deptno -]]> +group by deptno]]> </Resource> <Resource name="plan"> <![CDATA[ @@ -2562,7 +2559,7 @@ and not exists (select * from emp e2 where e1.empno = e2.empno)]]> <![CDATA[ LogicalProject(EMPNO=[$0]) LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4], SAL=[$5], COMM=[$6], DEPTNO=[$7], SLACKER=[$8], DEPTNO0=[$9], NAME=[$10], $f0=[$12]) - LogicalFilter(condition=[NOT(IS NOT NULL($12))]) + LogicalFilter(condition=[IS NULL($12)]) LogicalJoin(condition=[=($0, $11)], joinType=[left]) LogicalJoin(condition=[=($7, $9)], joinType=[inner]) LogicalFilter(condition=[<($7, 10)])
