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 2016/03/01 00:52:42 UTC

calcite git commit: [CALCITE-1109] Fix up condition when pushing Filter through Aggregate (Amogh Margoor)

Repository: calcite
Updated Branches:
  refs/heads/master 25d1e42a7 -> 8c90d8621


[CALCITE-1109] Fix up condition when pushing Filter through Aggregate (Amogh Margoor)

Close apache/calcite#201


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

Branch: refs/heads/master
Commit: 8c90d862179f43ab8855f4ff50cbc1d5968b21a2
Parents: 25d1e42
Author: Amogh Margoor <am...@qubole.com>
Authored: Sun Feb 28 06:01:45 2016 -0500
Committer: Julian Hyde <jh...@apache.org>
Committed: Mon Feb 29 15:52:19 2016 -0800

----------------------------------------------------------------------
 .../rel/rules/FilterAggregateTransposeRule.java |  5 +++++
 .../apache/calcite/test/RelOptRulesTest.java    | 18 ++++++++++++++++
 .../org/apache/calcite/test/RelOptRulesTest.xml | 22 ++++++++++++++++++++
 3 files changed, 45 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/8c90d862/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 efdb06e..6347cbf 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
@@ -91,6 +91,11 @@ public class FilterAggregateTransposeRule extends RelOptRule {
     final List<RelDataTypeField> origFields =
         aggRel.getRowType().getFieldList();
     final int[] adjustments = new int[origFields.size()];
+    int j = 0;
+    for (int i : aggRel.getGroupSet()) {
+      adjustments[j] = i - j;
+      j++;
+    }
     final List<RexNode> pushedConditions = Lists.newArrayList();
     final List<RexNode> remainingConditions = Lists.newArrayList();
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/8c90d862/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 0e0e5a0..7bd85cb 100644
--- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
@@ -328,6 +328,24 @@ public class RelOptRulesTest extends RelOptTestBase {
   }
 
   /** Test case for
+   * <a href="https://issues.apache.org/jira/browse/CALCITE-1109">[CALCITE-1109]
+   * FilterAggregateTransposeRule pushes down incorrect condition</a>. */
+  @Test public void testPushFilterPastAggFour() {
+    final HepProgram preProgram =
+        HepProgram.builder()
+            .addRuleInstance(AggregateProjectMergeRule.INSTANCE)
+            .addRuleInstance(AggregateFilterTransposeRule.INSTANCE)
+            .build();
+    final HepProgram program =
+        HepProgram.builder()
+            .addRuleInstance(FilterAggregateTransposeRule.INSTANCE)
+            .build();
+    checkPlanning(tester, preProgram, new HepPlanner(program),
+        "select emp.deptno, count(*) from emp where emp.sal > '12' "
+            + "group by emp.deptno\n", false);
+  }
+
+  /** Test case for
    * <a href="https://issues.apache.org/jira/browse/CALCITE-448">[CALCITE-448]
    * FilterIntoJoinRule creates filters containing invalid RexInputRef</a>. */
   @Test public void testPushFilterPastProject() {

http://git-wip-us.apache.org/repos/asf/calcite/blob/8c90d862/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 49ef891..c138c3f 100644
--- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
@@ -2333,6 +2333,28 @@ UnionRel(all=[true])
 ]]>
         </Resource>
     </TestCase>
+    <TestCase name="testPushFilterPastAggFour">
+        <Resource name="sql">
+            <![CDATA[select emp.deptno, count(*) from emp where emp.sal > '12' group by emp.deptno
+]]>
+        </Resource>
+        <Resource name="planBefore">
+            <![CDATA[
+LogicalAggregate(group=[{1}], EXPR$1=[$SUM0($2)])
+  LogicalFilter(condition=[>(CAST($0):BIGINT NOT NULL, CAST('12'):BIGINT NOT NULL)])
+    LogicalAggregate(group=[{5, 7}], EXPR$1=[COUNT()])
+      LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+        </Resource>
+        <Resource name="planAfter">
+            <![CDATA[
+LogicalAggregate(group=[{1}], EXPR$1=[$SUM0($2)])
+  LogicalAggregate(group=[{5, 7}], EXPR$1=[COUNT()])
+    LogicalFilter(condition=[>(CAST($5):BIGINT NOT NULL, CAST('12'):BIGINT NOT NULL)])
+      LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+        </Resource>
+    </TestCase>
     <TestCase name="testTransitiveInferenceJoin">
         <Resource name="sql">
             <![CDATA[select 1 from sales.emp d inner join sales.emp e on d.deptno = e.deptno where e.deptno > 7]]>