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:02 UTC

[1/2] git commit: Temporary fix for [OPTIQ-390] Transitive inference (RelMdPredicates) doesn't handle semi-join

Repository: incubator-optiq
Updated Branches:
  refs/heads/master aa8a98ffd -> 582be2a29


Temporary fix for [OPTIQ-390] Transitive inference (RelMdPredicates) doesn't handle semi-join


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

Branch: refs/heads/master
Commit: c2ff8f81988ce52d7c1c737075548e7d108d9fee
Parents: aa8a98f
Author: Julian Hyde <jh...@apache.org>
Authored: Wed Aug 27 12:26:35 2014 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Wed Aug 27 12:27:28 2014 -0700

----------------------------------------------------------------------
 .../java/org/eigenbase/rel/metadata/RelMdPredicates.java    | 9 +++++++++
 1 file changed, 9 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-optiq/blob/c2ff8f81/core/src/main/java/org/eigenbase/rel/metadata/RelMdPredicates.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/eigenbase/rel/metadata/RelMdPredicates.java b/core/src/main/java/org/eigenbase/rel/metadata/RelMdPredicates.java
index bb9ef32..937f160 100644
--- a/core/src/main/java/org/eigenbase/rel/metadata/RelMdPredicates.java
+++ b/core/src/main/java/org/eigenbase/rel/metadata/RelMdPredicates.java
@@ -36,6 +36,7 @@ import org.eigenbase.rel.RelNode;
 import org.eigenbase.rel.SortRel;
 import org.eigenbase.rel.TableAccessRelBase;
 import org.eigenbase.rel.UnionRelBase;
+import org.eigenbase.rel.rules.SemiJoinRel;
 import org.eigenbase.relopt.RelOptPredicateList;
 import org.eigenbase.relopt.RelOptUtil;
 import org.eigenbase.rex.RexBuilder;
@@ -190,6 +191,14 @@ public class RelMdPredicates {
             RelOptUtil.conjunctions(filter.getCondition())));
   }
 
+  /** Infers predicates for a {@link SemiJoinRel}. */
+  public RelOptPredicateList getPredicates(SemiJoinRel semiJoin) {
+    // Workaround, pending
+    // [OPTIQ-390] Transitive Inference(RelMdPredicate) doesn't handle SemiJoin
+    return RelOptPredicateList.EMPTY;
+  }
+
+  /** Infers predicates for a {@link JoinRelBase}. */
   public RelOptPredicateList getPredicates(JoinRelBase join) {
     RexBuilder rB = join.getCluster().getRexBuilder();
     RelNode left = join.getInput(0);


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

Posted by jh...@apache.org.
[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';