You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2016/01/23 01:30:47 UTC

[29/50] [abbrv] calcite git commit: [CALCITE-996] Simplify predicate when we create a Filter operator

[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/remotes/julianhyde/master
Commit: a67b4a976bef6c104212732c6a8f8ce364c372ba
Parents: ebcba3b
Author: Jesus Camacho Rodriguez <jc...@apache.org>
Authored: Mon Jan 11 21:12:30 2016 +0100
Committer: Julian Hyde <jh...@apache.org>
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)])