fjy closed pull request #6237: [Backport] [SQL] Fix missing postAggregations for Timeseries and TopN URL: https://github.com/apache/incubator-druid/pull/6237
This is a PR merged from a forked repository. As GitHub hides the original diff on merge, it is displayed below for the sake of provenance: As this is a foreign pull request (from a fork), the diff is supplied below (as it won't show otherwise due to GitHub magic): diff --git a/processing/src/main/java/io/druid/segment/VirtualColumns.java b/processing/src/main/java/io/druid/segment/VirtualColumns.java index 409e3d693d4..189f3cd4458 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.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 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 2f6fde56435..d10751010bd 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 TimeseriesQuery toTimeseriesQuery() } 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 TimeseriesQuery toTimeseriesQuery() filtration.getDimFilter(), queryGranularity, grouping.getAggregatorFactories(), - grouping.getPostAggregators(), + postAggregators, ImmutableSortedMap.copyOf(theContext) ); } @@ -857,6 +863,11 @@ public TopNQuery toTopNQuery() 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 TopNQuery toTopNQuery() 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 dccdc5f3ef0..837fd6e83c8 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.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; @@ -6635,6 +6636,104 @@ public void testSortProjectAfterNestedGroupBy() throws Exception ); } + @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, ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org With regards, Apache Git Services --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@druid.apache.org For additional commands, e-mail: commits-h...@druid.apache.org