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