You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by hy...@apache.org on 2015/09/05 04:13:28 UTC

tajo git commit: TAJO-1800: WHERE clause is ignored with UNION.

Repository: tajo
Updated Branches:
  refs/heads/master ea4443d8d -> fd4a3f80c


TAJO-1800: WHERE clause is ignored with UNION.

Closes #727


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

Branch: refs/heads/master
Commit: fd4a3f80c8adb65233ff3fbb1b99dd8585d44a7b
Parents: ea4443d
Author: Hyunsik Choi <hy...@apache.org>
Authored: Sat Sep 5 11:08:32 2015 +0900
Committer: Hyunsik Choi <hy...@apache.org>
Committed: Sat Sep 5 11:08:32 2015 +0900

----------------------------------------------------------------------
 CHANGES                                         |  2 +
 .../tajo/engine/query/TestUnionQuery.java       |  7 ++++
 .../TestUnionQuery/testUnionAndFilter.sql       | 23 +++++++++++
 .../TestUnionQuery/testUnionAndFilter.plan      | 42 ++++++++++++++++++++
 .../TestUnionQuery/testUnionAndFilter.result    |  7 ++++
 .../plan/rewrite/rules/FilterPushDownRule.java  | 12 ++----
 6 files changed, 84 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/fd4a3f80/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 507293c..892cef0 100644
--- a/CHANGES
+++ b/CHANGES
@@ -244,6 +244,8 @@ Release 0.11.0 - unreleased
 
   BUG FIXES
 
+    TAJO-1800: WHERE clause is ignored with UNION. (hyunsik)
+
     TAJO-1815: Catalog store initialization with PostgreSQL failed.
     (Contributed by Jongyoung Park, Committed by hyunsik)
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/fd4a3f80/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestUnionQuery.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestUnionQuery.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestUnionQuery.java
index 21500e9..5d1321a 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestUnionQuery.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestUnionQuery.java
@@ -690,4 +690,11 @@ public class TestUnionQuery extends QueryTestCaseBase {
   public void testComplexUnion2() throws Exception {
     runSimpleTests();
   }
+
+  @Test
+  @Option(withExplain =  true)
+  @SimpleTest
+  public void testUnionAndFilter() throws Exception {
+    runSimpleTests();
+  }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/fd4a3f80/tajo-core-tests/src/test/resources/queries/TestUnionQuery/testUnionAndFilter.sql
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/queries/TestUnionQuery/testUnionAndFilter.sql b/tajo-core-tests/src/test/resources/queries/TestUnionQuery/testUnionAndFilter.sql
new file mode 100644
index 0000000..6d729a4
--- /dev/null
+++ b/tajo-core-tests/src/test/resources/queries/TestUnionQuery/testUnionAndFilter.sql
@@ -0,0 +1,23 @@
+SELECT
+  c_custkey, ret
+FROM (
+  SELECT
+    c_custkey,
+    ROUND(sum(c_acctbal*15000000)/sum(15000000),4) as ret
+  FROM
+    customer
+  GROUP BY
+    c_custkey
+
+  UNION
+
+  SELECT
+    c_custkey,
+    ROUND(sum(c_acctbal*15000000)/sum(15000000),4) AS ret
+  FROM
+    customer
+  GROUP BY
+    c_custkey
+) a
+WHERE
+  ret > 0.02;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/fd4a3f80/tajo-core-tests/src/test/resources/results/TestUnionQuery/testUnionAndFilter.plan
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestUnionQuery/testUnionAndFilter.plan b/tajo-core-tests/src/test/resources/results/TestUnionQuery/testUnionAndFilter.plan
new file mode 100644
index 0000000..c8a0c13
--- /dev/null
+++ b/tajo-core-tests/src/test/resources/results/TestUnionQuery/testUnionAndFilter.plan
@@ -0,0 +1,42 @@
+explain
+-------------------------------
+TABLE_SUBQUERY(7) as default.a
+  => Targets: default.a.c_custkey (INT4), default.a.ret (FLOAT8)
+  => out schema: {(2) default.a.c_custkey (INT4), default.a.ret (FLOAT8)}
+  => in  schema: {(2) default.a.c_custkey (INT4), default.a.ret (FLOAT8)}
+   HAVING(14) (default.#SQ_0.ret (FLOAT8) > 0.02)
+      GROUP_BY(11)(c_custkey,ret)
+        => target list: default.#SQ_0.c_custkey (INT4), default.#SQ_0.ret (FLOAT8)
+        => out schema:{(2) default.#SQ_0.c_custkey (INT4), default.#SQ_0.ret (FLOAT8)}
+        => in schema:{(2) default.#SQ_0.c_custkey (INT4), default.#SQ_0.ret (FLOAT8)}
+         TABLE_SUBQUERY(10) as default.#SQ_0
+           => Targets: default.#SQ_0.c_custkey (INT4), default.#SQ_0.ret (FLOAT8)
+           => out schema: {(2) default.#SQ_0.c_custkey (INT4), default.#SQ_0.ret (FLOAT8)}
+           => in  schema: {(2) default.#SQ_0.c_custkey (INT4), default.#SQ_0.ret (FLOAT8)}
+            UNION(6)
+               PROJECTION(5)
+                 => Targets: default.customer.c_custkey (INT4), round(?sum_5 (FLOAT8) / CAST (?sum_6 (INT8) AS FLOAT8),4) as ret
+                 => out schema: {(2) default.customer.c_custkey (INT4), ret (FLOAT8)}
+                 => in  schema: {(3) ?sum_5 (FLOAT8), ?sum_6 (INT8), default.customer.c_custkey (INT4)}
+                  GROUP_BY(4)(c_custkey)
+                    => exprs: (sum(?multiply_4 (FLOAT8)),sum(15000000))
+                    => target list: default.customer.c_custkey (INT4), ?sum_5 (FLOAT8), ?sum_6 (INT8)
+                    => out schema:{(3) ?sum_5 (FLOAT8), ?sum_6 (INT8), default.customer.c_custkey (INT4)}
+                    => in schema:{(3) ?multiply_4 (FLOAT8), default.customer.c_acctbal (FLOAT8), default.customer.c_custkey (INT4)}
+                     SCAN(3) on default.customer
+                       => target list: default.customer.c_acctbal (FLOAT8), default.customer.c_custkey (INT4), default.customer.c_acctbal (FLOAT8) * 1.5E7 as ?multiply_4
+                       => out schema: {(3) ?multiply_4 (FLOAT8), default.customer.c_acctbal (FLOAT8), default.customer.c_custkey (INT4)}
+                       => in schema: {(8) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT)}
+               PROJECTION(2)
+                 => Targets: default.customer.c_custkey (INT4), round(?sum_2 (FLOAT8) / CAST (?sum_3 (INT8) AS FLOAT8),4) as ret
+                 => out schema: {(2) default.customer.c_custkey (INT4), ret (FLOAT8)}
+                 => in  schema: {(3) ?sum_2 (FLOAT8), ?sum_3 (INT8), default.customer.c_custkey (INT4)}
+                  GROUP_BY(1)(c_custkey)
+                    => exprs: (sum(?multiply_1 (FLOAT8)),sum(15000000))
+                    => target list: default.customer.c_custkey (INT4), ?sum_2 (FLOAT8), ?sum_3 (INT8)
+                    => out schema:{(3) ?sum_2 (FLOAT8), ?sum_3 (INT8), default.customer.c_custkey (INT4)}
+                    => in schema:{(3) ?multiply_1 (FLOAT8), default.customer.c_acctbal (FLOAT8), default.customer.c_custkey (INT4)}
+                     SCAN(0) on default.customer
+                       => target list: default.customer.c_acctbal (FLOAT8), default.customer.c_custkey (INT4), default.customer.c_acctbal (FLOAT8) * 1.5E7 as ?multiply_1
+                       => out schema: {(3) ?multiply_1 (FLOAT8), default.customer.c_acctbal (FLOAT8), default.customer.c_custkey (INT4)}
+                       => in schema: {(8) default.customer.c_acctbal (FLOAT8), default.customer.c_address (TEXT), default.customer.c_comment (TEXT), default.customer.c_custkey (INT4), default.customer.c_mktsegment (TEXT), default.customer.c_name (TEXT), default.customer.c_nationkey (INT4), default.customer.c_phone (TEXT)}

http://git-wip-us.apache.org/repos/asf/tajo/blob/fd4a3f80/tajo-core-tests/src/test/resources/results/TestUnionQuery/testUnionAndFilter.result
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestUnionQuery/testUnionAndFilter.result b/tajo-core-tests/src/test/resources/results/TestUnionQuery/testUnionAndFilter.result
new file mode 100644
index 0000000..8eb747b
--- /dev/null
+++ b/tajo-core-tests/src/test/resources/results/TestUnionQuery/testUnionAndFilter.result
@@ -0,0 +1,7 @@
+c_custkey,ret
+-------------------------------
+4,2866.83
+1,711.56
+5,794.47
+3,7498.12
+2,121.65

http://git-wip-us.apache.org/repos/asf/tajo/blob/fd4a3f80/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/FilterPushDownRule.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/FilterPushDownRule.java b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/FilterPushDownRule.java
index 83bb700..7d21622 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/FilterPushDownRule.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/FilterPushDownRule.java
@@ -801,6 +801,9 @@ public class FilterPushDownRule extends BasicLogicalPlanVisitor<FilterPushDownCo
           break;
         }
       }
+      if (groupByNode.getInSchema().containsAll(EvalTreeUtil.findUniqueColumns(copy))) {
+        isEvalAggrFunction = true;
+      }
       if (isEvalAggrFunction) {
         aggrEvals.add(copy);
         aggrEvalOrigins.add(eval);
@@ -812,7 +815,6 @@ public class FilterPushDownRule extends BasicLogicalPlanVisitor<FilterPushDownCo
     }
 
     // transform
-
     HavingNode workingHavingNode;
     if (havingNode != null) {
       workingHavingNode = havingNode;
@@ -1029,14 +1031,6 @@ public class FilterPushDownRule extends BasicLogicalPlanVisitor<FilterPushDownCo
     return simplePredicates;
   }
 
-  private static Datum[] extractPredicateValues(List<Predicate> predicates) {
-    Datum[] values = new Datum[predicates.size()];
-    for (int i = 0; i < values.length; i++) {
-      values[i] = predicates.get(i).value;
-    }
-    return values;
-  }
-
   private static Column[] extractColumns(Set<Predicate> predicates) {
     Column[] columns = new Column[predicates.size()];
     int i = 0;