You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by ya...@apache.org on 2020/11/12 01:54:44 UTC

[calcite] branch master updated: [CALCITE-4374] Support materialized view recognition when query distinct aggregate on target GROUP BY columns (xzh)

This is an automated email from the ASF dual-hosted git repository.

yanlin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git


The following commit(s) were added to refs/heads/master by this push:
     new 1e6b742  [CALCITE-4374] Support materialized view recognition when query distinct aggregate on target GROUP BY columns (xzh)
1e6b742 is described below

commit 1e6b7425ec20e2bddc6331a21016475a43f9d995
Author: xzh <95...@qq.com>
AuthorDate: Tue Nov 3 17:22:38 2020 +0800

    [CALCITE-4374] Support materialized view recognition when query distinct aggregate on target GROUP BY columns (xzh)
---
 .../apache/calcite/plan/SubstitutionVisitor.java   | 17 ++++++--
 .../MaterializedViewSubstitutionVisitorTest.java   | 51 ++++++++++++++++++++++
 2 files changed, 65 insertions(+), 3 deletions(-)

diff --git a/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java b/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java
index 2fe5b88..6d5cac7 100644
--- a/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java
+++ b/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java
@@ -1895,10 +1895,9 @@ public class SubstitutionVisitor {
       // Same level of aggregation. Generate a project.
       final List<Integer> projects = new ArrayList<>();
       final int groupCount = query.groupSet.cardinality();
-      final List<Integer> targetGroupList = target.groupSet.asList();
       for (Integer inputIndex : query.groupSet.asList()) {
         // Use the index in target group by.
-        int i = targetGroupList.indexOf(inputIndex);
+        int i = targetGroupByIndexList.indexOf(inputIndex);
         projects.add(i);
       }
       for (AggregateCall aggregateCall : query.aggCalls) {
@@ -1930,7 +1929,19 @@ public class SubstitutionVisitor {
       }
       final List<AggregateCall> aggregateCalls = new ArrayList<>();
       for (AggregateCall aggregateCall : query.aggCalls) {
-        if (aggregateCall.isDistinct()) {
+        if (aggregateCall.isDistinct() && aggregateCall.getArgList().size() == 1) {
+          final int aggIndex = aggregateCall.getArgList().get(0);
+          final int newIndex = targetGroupByIndexList.indexOf(aggIndex);
+          if (newIndex >= 0) {
+            aggregateCalls.add(
+                AggregateCall.create(aggregateCall.getAggregation(),
+                    aggregateCall.isDistinct(), aggregateCall.isApproximate(),
+                    aggregateCall.ignoreNulls(),
+                    ImmutableList.of(newIndex), -1,
+                    aggregateCall.collation, aggregateCall.type,
+                    aggregateCall.name));
+            continue;
+          }
           return null;
         }
         int i = target.aggCalls.indexOf(aggregateCall);
diff --git a/core/src/test/java/org/apache/calcite/test/MaterializedViewSubstitutionVisitorTest.java b/core/src/test/java/org/apache/calcite/test/MaterializedViewSubstitutionVisitorTest.java
index dab21cd..464ce3f 100644
--- a/core/src/test/java/org/apache/calcite/test/MaterializedViewSubstitutionVisitorTest.java
+++ b/core/src/test/java/org/apache/calcite/test/MaterializedViewSubstitutionVisitorTest.java
@@ -1515,6 +1515,57 @@ public class MaterializedViewSubstitutionVisitorTest extends AbstractMaterialize
         .ok();
   }
 
+  @Test void testQueryDistinctColumnInTargetGroupByList0() {
+    final String mv = ""
+        + "select \"name\", \"commission\", \"deptno\"\n"
+        + "from \"emps\" group by \"name\", \"commission\", \"deptno\"";
+    final String query = ""
+        + "select \"name\", \"commission\", count(distinct \"deptno\") as cnt\n"
+        + "from \"emps\" group by \"name\", \"commission\"";
+    sql(mv, query).ok();
+  }
+
+  @Test void testQueryDistinctColumnInTargetGroupByList1() {
+    final String mv = ""
+        + "select \"name\", \"deptno\" "
+        + "from \"emps\" group by \"name\", \"deptno\"";
+    final String query = ""
+        + "select \"name\", count(distinct \"deptno\")\n"
+        + "from \"emps\" group by \"name\"";
+    sql(mv, query).ok();
+  }
+
+  @Test void testQueryDistinctColumnInTargetGroupByList2() {
+    final String mv = ""
+        + "select \"name\", \"deptno\", \"empid\"\n"
+        + "from \"emps\" group by \"name\", \"deptno\", \"empid\"";
+    final String query = ""
+        + "select \"name\", count(distinct \"deptno\"), count(distinct \"empid\")\n"
+        + "from \"emps\" group by \"name\"";
+    sql(mv, query).ok();
+  }
+
+  @Test void testQueryDistinctColumnInTargetGroupByList3() {
+    final String mv = ""
+        + "select \"name\", \"deptno\", \"empid\", count(\"commission\")\n"
+        + "from \"emps\" group by \"name\", \"deptno\", \"empid\"";
+    final String query = ""
+        + "select \"name\", count(distinct \"deptno\"), count(distinct \"empid\"), count"
+        + "(\"commission\")\n"
+        + "from \"emps\" group by \"name\"";
+    sql(mv, query).ok();
+  }
+
+  @Test void testQueryDistinctColumnInTargetGroupByList4() {
+    final String mv = ""
+        + "select \"name\", \"deptno\", \"empid\"\n"
+        + "from \"emps\" group by \"name\", \"deptno\", \"empid\"";
+    final String query = ""
+        + "select \"name\", count(distinct \"deptno\")\n"
+        + "from \"emps\" group by \"name\"";
+    sql(mv, query).ok();
+  }
+
   final JavaTypeFactoryImpl typeFactory =
       new JavaTypeFactoryImpl(RelDataTypeSystem.DEFAULT);
   private final RexBuilder rexBuilder = new RexBuilder(typeFactory);