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]]>