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';