You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@druid.apache.org by fj...@apache.org on 2018/08/27 01:45:29 UTC

[incubator-druid] branch 0.12.3 updated: [SQL] Fix missing postAggregations for Timeseries and TopN (#5912) (#6237)

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

fjy pushed a commit to branch 0.12.3
in repository https://gitbox.apache.org/repos/asf/incubator-druid.git


The following commit(s) were added to refs/heads/0.12.3 by this push:
     new 52886fa  [SQL] Fix missing postAggregations for Timeseries and TopN (#5912) (#6237)
52886fa is described below

commit 52886fafb02859f55149ee5c5d158bd3e739baf7
Author: Gian Merlino <gi...@gmail.com>
AuthorDate: Sun Aug 26 18:45:26 2018 -0700

    [SQL] Fix missing postAggregations for Timeseries and TopN (#5912) (#6237)
    
    * [SQL] Fix missing postAggregations for Timeseries and TopN
    
    * fix build
    
    * fix test
---
 .../main/java/io/druid/segment/VirtualColumns.java |  6 ++
 .../java/io/druid/sql/calcite/rel/DruidQuery.java  | 15 +++-
 .../io/druid/sql/calcite/CalciteQueryTest.java     | 99 ++++++++++++++++++++++
 3 files changed, 118 insertions(+), 2 deletions(-)

diff --git a/processing/src/main/java/io/druid/segment/VirtualColumns.java b/processing/src/main/java/io/druid/segment/VirtualColumns.java
index 409e3d6..189f3cd 100644
--- a/processing/src/main/java/io/druid/segment/VirtualColumns.java
+++ b/processing/src/main/java/io/druid/segment/VirtualColumns.java
@@ -25,6 +25,7 @@ import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import io.druid.java.util.common.Cacheable;
@@ -70,6 +71,11 @@ public class VirtualColumns implements Cacheable
     }
   }
 
+  public static VirtualColumns create(VirtualColumn...virtualColumns)
+  {
+    return create(Lists.newArrayList(virtualColumns));
+  }
+
   @JsonCreator
   public static VirtualColumns create(List<VirtualColumn> virtualColumns)
   {
diff --git a/sql/src/main/java/io/druid/sql/calcite/rel/DruidQuery.java b/sql/src/main/java/io/druid/sql/calcite/rel/DruidQuery.java
index 2f6fde5..d107510 100644
--- a/sql/src/main/java/io/druid/sql/calcite/rel/DruidQuery.java
+++ b/sql/src/main/java/io/druid/sql/calcite/rel/DruidQuery.java
@@ -786,6 +786,12 @@ public class DruidQuery
     }
 
     final Filtration filtration = Filtration.create(filter).optimize(sourceRowSignature);
+
+    final List<PostAggregator> postAggregators = new ArrayList<>(grouping.getPostAggregators());
+    if (sortProject != null) {
+      postAggregators.addAll(sortProject.getPostAggregators());
+    }
+
     final Map<String, Object> theContext = Maps.newHashMap();
     theContext.put("skipEmptyBuckets", true);
     theContext.putAll(plannerContext.getQueryContext());
@@ -798,7 +804,7 @@ public class DruidQuery
         filtration.getDimFilter(),
         queryGranularity,
         grouping.getAggregatorFactories(),
-        grouping.getPostAggregators(),
+        postAggregators,
         ImmutableSortedMap.copyOf(theContext)
     );
   }
@@ -857,6 +863,11 @@ public class DruidQuery
 
     final Filtration filtration = Filtration.create(filter).optimize(sourceRowSignature);
 
+    final List<PostAggregator> postAggregators = new ArrayList<>(grouping.getPostAggregators());
+    if (sortProject != null) {
+      postAggregators.addAll(sortProject.getPostAggregators());
+    }
+
     return new TopNQuery(
         dataSource,
         getVirtualColumns(plannerContext.getExprMacroTable(), true),
@@ -867,7 +878,7 @@ public class DruidQuery
         filtration.getDimFilter(),
         Granularities.ALL,
         grouping.getAggregatorFactories(),
-        grouping.getPostAggregators(),
+        postAggregators,
         ImmutableSortedMap.copyOf(plannerContext.getQueryContext())
     );
   }
diff --git a/sql/src/test/java/io/druid/sql/calcite/CalciteQueryTest.java b/sql/src/test/java/io/druid/sql/calcite/CalciteQueryTest.java
index eea56ca..9778596 100644
--- a/sql/src/test/java/io/druid/sql/calcite/CalciteQueryTest.java
+++ b/sql/src/test/java/io/druid/sql/calcite/CalciteQueryTest.java
@@ -85,6 +85,7 @@ import io.druid.query.topn.DimensionTopNMetricSpec;
 import io.druid.query.topn.InvertedTopNMetricSpec;
 import io.druid.query.topn.NumericTopNMetricSpec;
 import io.druid.query.topn.TopNQueryBuilder;
+import io.druid.segment.VirtualColumns;
 import io.druid.segment.column.Column;
 import io.druid.segment.column.ValueType;
 import io.druid.segment.virtual.ExpressionVirtualColumn;
@@ -6696,6 +6697,104 @@ public class CalciteQueryTest extends CalciteTestBase
     );
   }
 
+  @Test
+  public void testPostAggWithTimeseries() throws Exception
+  {
+    testQuery(
+        "SELECT "
+        + "  FLOOR(__time TO YEAR), "
+        + "  SUM(m1), "
+        + "  SUM(m1) + SUM(m2) "
+        + "FROM "
+        + "  druid.foo "
+        + "WHERE "
+        + "  dim2 = 'a' "
+        + "GROUP BY FLOOR(__time TO YEAR) "
+        + "ORDER BY FLOOR(__time TO YEAR) desc",
+        Collections.singletonList(
+            Druids.newTimeseriesQueryBuilder()
+                  .dataSource(CalciteTests.DATASOURCE1)
+                  .intervals(QSS(Filtration.eternity()))
+                  .filters(SELECTOR("dim2", "a", null))
+                  .granularity(Granularities.YEAR)
+                  .aggregators(
+                      AGGS(
+                          new DoubleSumAggregatorFactory("a0", "m1"),
+                          new DoubleSumAggregatorFactory("a1", "m2")
+                      )
+                  )
+                  .postAggregators(
+                      EXPRESSION_POST_AGG("p0", "(\"a0\" + \"a1\")")
+                  )
+                  .descending(true)
+                  .context(TIMESERIES_CONTEXT_DEFAULT)
+                  .build()
+        ),
+        ImmutableList.of(
+            new Object[]{978307200000L, 4.0, 8.0},
+            new Object[]{946684800000L, 1.0, 2.0}
+        )
+    );
+  }
+
+  @Test
+  public void testPostAggWithTopN() throws Exception
+  {
+    testQuery(
+        "SELECT "
+        + "  FLOOR(__time TO SECOND), "
+        + "  AVG(m2), "
+        + "  SUM(m1) + SUM(m2) "
+        + "FROM "
+        + "  druid.foo "
+        + "WHERE "
+        + "  dim2 = 'a' "
+        + "GROUP BY FLOOR(__time TO SECOND) "
+        + "ORDER BY FLOOR(__time TO SECOND) "
+        + "LIMIT 5",
+        Collections.singletonList(
+            new TopNQueryBuilder()
+                .dataSource(CalciteTests.DATASOURCE1)
+                .intervals(QSS(Filtration.eternity()))
+                .granularity(Granularities.ALL)
+                .dimension(new DefaultDimensionSpec("d0:v", "d0", ValueType.LONG))
+                .virtualColumns(
+                    VirtualColumns.create(
+                        EXPRESSION_VIRTUAL_COLUMN("d0:v", "timestamp_floor(\"__time\",'PT1S','','UTC')", ValueType.LONG)
+                    )
+                )
+                .filters("dim2", "a")
+                .aggregators(AGGS(
+                    new DoubleSumAggregatorFactory("a0:sum", "m2"),
+                    new CountAggregatorFactory("a0:count"),
+                    new DoubleSumAggregatorFactory("a1", "m1"),
+                    new DoubleSumAggregatorFactory("a2", "m2")
+                ))
+                .postAggregators(
+                    ImmutableList.of(
+                        new ArithmeticPostAggregator(
+                            "a0",
+                            "quotient",
+                            ImmutableList.of(
+                                new FieldAccessPostAggregator(null, "a0:sum"),
+                                new FieldAccessPostAggregator(null, "a0:count")
+                            )
+                        ),
+                        EXPRESSION_POST_AGG("p0", "(\"a1\" + \"a2\")")
+                    )
+                )
+                .metric(new DimensionTopNMetricSpec(null, StringComparators.NUMERIC))
+                .threshold(5)
+                .context(QUERY_CONTEXT_DEFAULT)
+                .build()
+        ),
+        ImmutableList.of(
+            new Object[]{946684800000L, 1.0, 2.0},
+            new Object[]{978307200000L, 4.0, 8.0}
+        )
+    );
+  }
+
   private void testQuery(
       final String sql,
       final List<Query> expectedQueries,


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@druid.apache.org
For additional commands, e-mail: commits-help@druid.apache.org