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/12/18 08:28:11 UTC

[2/3] incubator-calcite git commit: [CALCITE-533] Support for grouping sets in FilterAggregateTransposeRule (Jesus Camacho Rodriguez)

[CALCITE-533] Support for grouping sets in FilterAggregateTransposeRule (Jesus Camacho Rodriguez)

Close apache/incubator-calcite#34


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

Branch: refs/heads/master
Commit: 86c7c081107524aa67a3edbf26b554f4d1c99456
Parents: e8ee2b3
Author: Jesus Camacho Rodriguez <jc...@hortonworks.com>
Authored: Tue Dec 16 16:53:54 2014 +0100
Committer: Julian Hyde <jh...@apache.org>
Committed: Wed Dec 17 13:37:42 2014 -0800

----------------------------------------------------------------------
 .../rel/rules/FilterAggregateTransposeRule.java | 14 ++++-
 .../apache/calcite/test/RelOptRulesTest.java    | 21 ++++++++
 .../org/apache/calcite/test/RelOptRulesTest.xml | 56 ++++++++++++++++++++
 3 files changed, 90 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/86c7c081/core/src/main/java/org/apache/calcite/rel/rules/FilterAggregateTransposeRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/FilterAggregateTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/FilterAggregateTransposeRule.java
index 8af01e3..0d10081 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/FilterAggregateTransposeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/FilterAggregateTransposeRule.java
@@ -89,7 +89,19 @@ public class FilterAggregateTransposeRule extends RelOptRule {
 
     for (RexNode condition : conditions) {
       ImmutableBitSet rCols = RelOptUtil.InputFinder.bits(condition);
-      if (groupKeys.contains(rCols)) {
+      boolean push = groupKeys.contains(rCols);
+      if (push && aggRel.indicator) {
+        // If grouping sets are used, the filter can be pushed if
+        // the columns referenced in the predicate are present in
+        // all the grouping sets.
+        for (ImmutableBitSet groupingSet: aggRel.getGroupSets()) {
+          if (!groupingSet.contains(rCols)) {
+            push = false;
+            break;
+          }
+        }
+      }
+      if (push) {
         pushedConditions.add(
             condition.accept(
                 new RelOptUtil.RexInputConverter(rexBuilder, origFields,

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/86c7c081/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
index bfa65c9..cf78de9 100644
--- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
@@ -207,6 +207,27 @@ public class RelOptRulesTest extends RelOptTestBase {
             + " where dname = 'Charlie'");
   }
 
+  private void basePushFilterPastAggWithGroupingSets() throws Exception {
+    final HepProgram preProgram =
+            HepProgram.builder()
+                .addRuleInstance(ProjectMergeRule.INSTANCE)
+                .addRuleInstance(FilterProjectTransposeRule.INSTANCE)
+                .build();
+    final HepProgram program =
+            HepProgram.builder()
+                .addRuleInstance(FilterAggregateTransposeRule.INSTANCE)
+                .build();
+    checkPlanning(tester, preProgram, new HepPlanner(program), "${sql}");
+  }
+
+  @Test public void testPushFilterPastAggWithGroupingSets1() throws Exception {
+    basePushFilterPastAggWithGroupingSets();
+  }
+
+  @Test public void testPushFilterPastAggWithGroupingSets2() throws Exception {
+    basePushFilterPastAggWithGroupingSets();
+  }
+
   /** Test case for
    * <a href="https://issues.apache.org/jira/browse/CALCITE-434">[CALCITE-434],
    * FilterAggregateTransposeRule loses conditions that cannot be pushed</a>. */

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/86c7c081/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
----------------------------------------------------------------------
diff --git a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
index 9ffdaf4..4ddefe1 100644
--- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
@@ -283,6 +283,62 @@ LogicalProject(DNAME=[$0], C=[$1])
 ]]>
         </Resource>
     </TestCase>
+    <TestCase name="testPushFilterPastAggWithGroupingSets1">
+        <Resource name="sql">
+            <![CDATA[select ddeptno, dname, c from
+             (select deptno ddeptno, name dname, count(*) as c
+             from dept group by rollup(deptno,name)) t
+              where dname = 'Charlie']]>
+        </Resource>
+        <Resource name="planBefore">
+            <![CDATA[
+LogicalProject(DDEPTNO=[$0], DNAME=[$1], C=[$2])
+  LogicalProject(DDEPTNO=[CASE($2, null, $0)], DNAME=[CASE($3, null, $1)], C=[$4])
+    LogicalFilter(condition=[=(CASE($3, null, $1), 'Charlie')])
+      LogicalAggregate(group=[{0, 1}], groups=[[{0, 1}, {0}, {}]], indicator=[true], C=[COUNT()])
+        LogicalProject(DDEPTNO=[$0], DNAME=[$1])
+          LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
+]]>
+        </Resource>
+        <Resource name="planAfter">
+            <![CDATA[
+LogicalProject(DDEPTNO=[$0], DNAME=[$1], C=[$2])
+  LogicalProject(DDEPTNO=[CASE($2, null, $0)], DNAME=[CASE($3, null, $1)], C=[$4])
+    LogicalFilter(condition=[=(CASE($3, null, $1), 'Charlie')])
+      LogicalAggregate(group=[{0, 1}], groups=[[{0, 1}, {0}, {}]], indicator=[true], C=[COUNT()])
+        LogicalProject(DDEPTNO=[$0], DNAME=[$1])
+          LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
+]]>
+        </Resource>
+    </TestCase>
+    <TestCase name="testPushFilterPastAggWithGroupingSets2">
+        <Resource name="sql">
+            <![CDATA[select dname, ddeptno, c from
+             (select name dname, deptno ddeptno, count(*) as c
+             from dept group by grouping sets ((name,deptno),(name))) t
+              where dname = 'Charlie']]>
+        </Resource>
+        <Resource name="planBefore">
+            <![CDATA[
+LogicalProject(DNAME=[$0], DDEPTNO=[$1], C=[$2])
+  LogicalProject(DNAME=[$0], DDEPTNO=[CASE($3, null, $1)], C=[$4])
+    LogicalFilter(condition=[=($0, 'Charlie')])
+      LogicalAggregate(group=[{0, 1}], groups=[[{0, 1}, {0}]], indicator=[true], C=[COUNT()])
+        LogicalProject(DNAME=[$1], DDEPTNO=[$0])
+          LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
+]]>
+        </Resource>
+        <Resource name="planAfter">
+            <![CDATA[
+LogicalProject(DNAME=[$0], DDEPTNO=[$1], C=[$2])
+  LogicalProject(DNAME=[$0], DDEPTNO=[CASE($3, null, $1)], C=[$4])
+    LogicalAggregate(group=[{0, 1}], groups=[[{0, 1}, {0}]], indicator=[true], C=[COUNT()])
+      LogicalFilter(condition=[=($0, 'Charlie')])
+        LogicalProject(DNAME=[$1], DDEPTNO=[$0])
+          LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
+]]>
+        </Resource>
+    </TestCase>
     <TestCase name="testReduceAverage">
         <Resource name="sql">
             <![CDATA[select name, max(name), avg(deptno), min(name) from sales.dept group by name]]>