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 2014/08/27 23:53:03 UTC

[2/2] git commit: [OPTIQ-389] MergeFilterRule should flatten AND condition

[OPTIQ-389] MergeFilterRule should flatten AND condition


Project: http://git-wip-us.apache.org/repos/asf/incubator-optiq/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-optiq/commit/582be2a2
Tree: http://git-wip-us.apache.org/repos/asf/incubator-optiq/tree/582be2a2
Diff: http://git-wip-us.apache.org/repos/asf/incubator-optiq/diff/582be2a2

Branch: refs/heads/master
Commit: 582be2a291fd618730c8071b6931d7a8a1da4b30
Parents: c2ff8f8
Author: John Pullokkaran <jp...@hortonworks.com>
Authored: Wed Aug 27 14:15:52 2014 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Wed Aug 27 14:15:52 2014 -0700

----------------------------------------------------------------------
 .../eigenbase/rel/rules/MergeFilterRule.java    |  2 +-
 .../main/java/org/eigenbase/rex/RexUtil.java    | 17 ++++++++++-
 core/src/test/resources/sql/misc.oq             | 30 ++++++++++++++++++++
 3 files changed, 47 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-optiq/blob/582be2a2/core/src/main/java/org/eigenbase/rel/rules/MergeFilterRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/eigenbase/rel/rules/MergeFilterRule.java b/core/src/main/java/org/eigenbase/rel/rules/MergeFilterRule.java
index f7c6a54..b059bc0 100644
--- a/core/src/main/java/org/eigenbase/rel/rules/MergeFilterRule.java
+++ b/core/src/main/java/org/eigenbase/rel/rules/MergeFilterRule.java
@@ -68,7 +68,7 @@ public class MergeFilterRule extends RelOptRule {
     FilterRelBase newFilterRel =
         (FilterRelBase) filterFactory.createFilter(
             bottomFilter.getChild(),
-            newCondition);
+            RexUtil.flatten(rexBuilder, newCondition));
 
     call.transformTo(newFilterRel);
   }

http://git-wip-us.apache.org/repos/asf/incubator-optiq/blob/582be2a2/core/src/main/java/org/eigenbase/rex/RexUtil.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/eigenbase/rex/RexUtil.java b/core/src/main/java/org/eigenbase/rex/RexUtil.java
index 248adf7..2550da0 100644
--- a/core/src/main/java/org/eigenbase/rex/RexUtil.java
+++ b/core/src/main/java/org/eigenbase/rex/RexUtil.java
@@ -322,7 +322,7 @@ public class RexUtil {
         }
       }
     }
-    return recurse && requiresDecimalExpansion(call.operands, recurse);
+    return recurse && requiresDecimalExpansion(call.operands, true);
   }
 
   /**
@@ -803,6 +803,21 @@ public class RexUtil {
     }
   }
 
+  /** Flattens an expression.
+   *
+   * <p>Returns the same expression if it is already flat. */
+  public static RexNode flatten(RexBuilder rexBuilder, RexNode node) {
+    if (node instanceof RexCall) {
+      RexCall call = (RexCall) node;
+      final SqlOperator op = call.getOperator();
+      final List<RexNode> flattenedOperands = flatten(call.getOperands(), op);
+      if (!isFlat(call.getOperands(), op)) {
+        return rexBuilder.makeCall(call.getType(), op, flattenedOperands);
+      }
+    }
+    return node;
+  }
+
   /**
    * Converts a list of operands into a list that is flat with respect to
    * the given operator. The operands are assumed to be flat already.

http://git-wip-us.apache.org/repos/asf/incubator-optiq/blob/582be2a2/core/src/test/resources/sql/misc.oq
----------------------------------------------------------------------
diff --git a/core/src/test/resources/sql/misc.oq b/core/src/test/resources/sql/misc.oq
index cc37141..91d63fc 100644
--- a/core/src/test/resources/sql/misc.oq
+++ b/core/src/test/resources/sql/misc.oq
@@ -294,6 +294,36 @@ EnumerableCalcRel(expr#0..7=[{inputs}], expr#8=[IS NOT NULL($t5)], expr#9=[NOT($
           EnumerableTableAccessRel(table=[[hr, depts]])
 !plan
 
+# Filter combined with an OR filter.
+select * from (
+  select * from "hr"."emps" as e
+  where e."deptno" < 30) as e
+where e."deptno" > 10 or e."name" = 'Sebastian';
++-------+--------+-----------+--------+------------+
+| empid | deptno | name      | salary | commission |
++-------+--------+-----------+--------+------------+
+|   150 |     10 | Sebastian | 7000.0 |            |
+|   200 |     20 | Eric      | 8000.0 |        500 |
++-------+--------+-----------+--------+------------+
+(2 rows)
+
+!ok
+
+# Filter combined with an AND filter. Test case for
+# [OPTIQ-389] MergeFilterRule should flatten AND condition
+select * from (
+  select * from "hr"."emps" as e
+  where e."deptno" < 30) as e
+where e."deptno" >= 10 and e."name" = 'Sebastian';
++-------+--------+-----------+--------+------------+
+| empid | deptno | name      | salary | commission |
++-------+--------+-----------+--------+------------+
+|   150 |     10 | Sebastian | 7000.0 |            |
++-------+--------+-----------+--------+------------+
+(1 row)
+
+!ok
+
 # [OPTIQ-345] AssertionError in RexToLixTranslator comparing to date literal
 !use catchall
 select count(*) as c from "everyTypes" where "sqlDate" = DATE '1970-01-01';