blob: 0f1c95c4b75ce6a47289b239c39ddfc3011b5a8e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.druid.query.topn;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.google.common.primitives.Doubles;
import com.google.common.primitives.Longs;
import org.apache.druid.collections.CloseableStupidPool;
import org.apache.druid.common.config.NullHandling;
import org.apache.druid.java.util.common.DateTimes;
import org.apache.druid.java.util.common.IAE;
import org.apache.druid.java.util.common.ISE;
import org.apache.druid.java.util.common.Intervals;
import org.apache.druid.java.util.common.Pair;
import org.apache.druid.java.util.common.granularity.Granularities;
import org.apache.druid.java.util.common.guava.Sequence;
import org.apache.druid.java.util.common.io.Closer;
import org.apache.druid.js.JavaScriptConfig;
import org.apache.druid.math.expr.ExprMacroTable;
import org.apache.druid.query.BySegmentResultValue;
import org.apache.druid.query.BySegmentResultValueClass;
import org.apache.druid.query.FinalizeResultsQueryRunner;
import org.apache.druid.query.QueryContexts;
import org.apache.druid.query.QueryPlus;
import org.apache.druid.query.QueryRunner;
import org.apache.druid.query.QueryRunnerTestHelper;
import org.apache.druid.query.Result;
import org.apache.druid.query.TestQueryRunners;
import org.apache.druid.query.aggregation.AggregatorFactory;
import org.apache.druid.query.aggregation.CountAggregatorFactory;
import org.apache.druid.query.aggregation.DoubleMaxAggregatorFactory;
import org.apache.druid.query.aggregation.DoubleMinAggregatorFactory;
import org.apache.druid.query.aggregation.DoubleSumAggregatorFactory;
import org.apache.druid.query.aggregation.ExpressionLambdaAggregatorFactory;
import org.apache.druid.query.aggregation.FilteredAggregatorFactory;
import org.apache.druid.query.aggregation.FloatMaxAggregatorFactory;
import org.apache.druid.query.aggregation.FloatMinAggregatorFactory;
import org.apache.druid.query.aggregation.LongSumAggregatorFactory;
import org.apache.druid.query.aggregation.cardinality.CardinalityAggregatorFactory;
import org.apache.druid.query.aggregation.first.DoubleFirstAggregatorFactory;
import org.apache.druid.query.aggregation.first.FloatFirstAggregatorFactory;
import org.apache.druid.query.aggregation.first.LongFirstAggregatorFactory;
import org.apache.druid.query.aggregation.hyperloglog.HyperUniqueFinalizingPostAggregator;
import org.apache.druid.query.aggregation.hyperloglog.HyperUniquesAggregatorFactory;
import org.apache.druid.query.aggregation.last.FloatLastAggregatorFactory;
import org.apache.druid.query.aggregation.last.LongLastAggregatorFactory;
import org.apache.druid.query.aggregation.post.ExpressionPostAggregator;
import org.apache.druid.query.context.ResponseContext;
import org.apache.druid.query.dimension.DefaultDimensionSpec;
import org.apache.druid.query.dimension.DimensionSpec;
import org.apache.druid.query.dimension.ExtractionDimensionSpec;
import org.apache.druid.query.dimension.ListFilteredDimensionSpec;
import org.apache.druid.query.expression.TestExprMacroTable;
import org.apache.druid.query.extraction.DimExtractionFn;
import org.apache.druid.query.extraction.ExtractionFn;
import org.apache.druid.query.extraction.JavaScriptExtractionFn;
import org.apache.druid.query.extraction.MapLookupExtractor;
import org.apache.druid.query.extraction.RegexDimExtractionFn;
import org.apache.druid.query.extraction.StringFormatExtractionFn;
import org.apache.druid.query.extraction.StrlenExtractionFn;
import org.apache.druid.query.extraction.TimeFormatExtractionFn;
import org.apache.druid.query.filter.AndDimFilter;
import org.apache.druid.query.filter.BoundDimFilter;
import org.apache.druid.query.filter.DimFilter;
import org.apache.druid.query.filter.ExtractionDimFilter;
import org.apache.druid.query.filter.SelectorDimFilter;
import org.apache.druid.query.lookup.LookupExtractionFn;
import org.apache.druid.query.ordering.StringComparators;
import org.apache.druid.query.spec.MultipleIntervalSegmentSpec;
import org.apache.druid.segment.TestHelper;
import org.apache.druid.segment.column.ColumnHolder;
import org.apache.druid.segment.column.ValueType;
import org.apache.druid.segment.virtual.ExpressionVirtualColumn;
import org.apache.druid.testing.InitializedNullHandlingTest;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import javax.annotation.Nullable;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
*/
@RunWith(Parameterized.class)
public class TopNQueryRunnerTest extends InitializedNullHandlingTest
{
private static final Closer RESOURCE_CLOSER = Closer.create();
@AfterClass
public static void teardown() throws IOException
{
RESOURCE_CLOSER.close();
}
@Parameterized.Parameters(name = "{0}")
public static Iterable<Object[]> constructorFeeder()
{
List<QueryRunner<Result<TopNResultValue>>> retVal = queryRunners();
List<Object[]> parameters = new ArrayList<>();
for (int i = 0; i < 32; i++) {
for (QueryRunner<Result<TopNResultValue>> firstParameter : retVal) {
Object[] params = new Object[7];
params[0] = firstParameter;
params[1] = (i & 1) != 0;
params[2] = (i & 2) != 0;
params[3] = (i & 4) != 0;
params[4] = (i & 8) != 0;
params[5] = (i & 16) != 0;
params[6] = QueryRunnerTestHelper.COMMON_DOUBLE_AGGREGATORS;
Object[] params2 = Arrays.copyOf(params, 7);
params2[6] = QueryRunnerTestHelper.COMMON_FLOAT_AGGREGATORS;
parameters.add(params);
parameters.add(params2);
}
}
return parameters;
}
public static List<QueryRunner<Result<TopNResultValue>>> queryRunners()
{
final CloseableStupidPool<ByteBuffer> defaultPool = TestQueryRunners.createDefaultNonBlockingPool();
final CloseableStupidPool<ByteBuffer> customPool = new CloseableStupidPool<>(
"TopNQueryRunnerFactory-bufferPool",
() -> ByteBuffer.allocate(20000)
);
List<QueryRunner<Result<TopNResultValue>>> retVal = new ArrayList<>();
retVal.addAll(
QueryRunnerTestHelper.makeQueryRunners(
new TopNQueryRunnerFactory(
defaultPool,
new TopNQueryQueryToolChest(new TopNQueryConfig()),
QueryRunnerTestHelper.NOOP_QUERYWATCHER
)
)
);
retVal.addAll(
QueryRunnerTestHelper.makeQueryRunners(
new TopNQueryRunnerFactory(
customPool,
new TopNQueryQueryToolChest(new TopNQueryConfig()),
QueryRunnerTestHelper.NOOP_QUERYWATCHER
)
)
);
RESOURCE_CLOSER.register(() -> {
// Verify that all objects have been returned to the pool.
Assert.assertEquals("defaultPool objects created", defaultPool.poolSize(), defaultPool.objectsCreatedCount());
Assert.assertEquals("customPool objects created", customPool.poolSize(), customPool.objectsCreatedCount());
defaultPool.close();
customPool.close();
});
return retVal;
}
private final QueryRunner<Result<TopNResultValue>> runner;
private final boolean duplicateSingleAggregatorQueries;
private final List<AggregatorFactory> commonAggregators;
@Rule
public ExpectedException expectedException = ExpectedException.none();
public TopNQueryRunnerTest(
QueryRunner<Result<TopNResultValue>> runner,
boolean specializeGeneric1AggPooledTopN,
boolean specializeGeneric2AggPooledTopN,
boolean specializeHistorical1SimpleDoubleAggPooledTopN,
boolean specializeHistoricalSingleValueDimSelector1SimpleDoubleAggPooledTopN,
boolean duplicateSingleAggregatorQueries,
List<AggregatorFactory> commonAggregators
)
{
this.runner = runner;
PooledTopNAlgorithm.setSpecializeGeneric1AggPooledTopN(specializeGeneric1AggPooledTopN);
PooledTopNAlgorithm.setSpecializeGeneric2AggPooledTopN(specializeGeneric2AggPooledTopN);
PooledTopNAlgorithm.setSpecializeHistorical1SimpleDoubleAggPooledTopN(
specializeHistorical1SimpleDoubleAggPooledTopN
);
PooledTopNAlgorithm.setSpecializeHistoricalSingleValueDimSelector1SimpleDoubleAggPooledTopN(
specializeHistoricalSingleValueDimSelector1SimpleDoubleAggPooledTopN
);
this.duplicateSingleAggregatorQueries = duplicateSingleAggregatorQueries;
this.commonAggregators = commonAggregators;
}
private List<AggregatorFactory> duplicateAggregators(AggregatorFactory aggregatorFactory, AggregatorFactory duplicate)
{
if (duplicateSingleAggregatorQueries) {
return ImmutableList.of(aggregatorFactory, duplicate);
} else {
return Collections.singletonList(aggregatorFactory);
}
}
private List<Map<String, Object>> withDuplicateResults(
List<? extends Map<String, Object>> results,
String key,
String duplicateKey
)
{
if (!duplicateSingleAggregatorQueries) {
return (List<Map<String, Object>>) results;
}
List<Map<String, Object>> resultsWithDuplicates = new ArrayList<>();
for (Map<String, Object> result : results) {
resultsWithDuplicates.add(
ImmutableMap.<String, Object>builder().putAll(result).put(duplicateKey, result.get(key)).build()
);
}
return resultsWithDuplicates;
}
private Sequence<Result<TopNResultValue>> assertExpectedResults(
Iterable<Result<TopNResultValue>> expectedResults,
TopNQuery query
)
{
final Sequence<Result<TopNResultValue>> retval = runWithMerge(query);
TestHelper.assertExpectedResults(expectedResults, retval);
return retval;
}
private Sequence<Result<TopNResultValue>> runWithMerge(TopNQuery query)
{
return runWithMerge(query, ResponseContext.createEmpty());
}
private Sequence<Result<TopNResultValue>> runWithMerge(TopNQuery query, ResponseContext context)
{
final TopNQueryQueryToolChest chest = new TopNQueryQueryToolChest(new TopNQueryConfig());
final QueryRunner<Result<TopNResultValue>> mergeRunner = new FinalizeResultsQueryRunner(
chest.mergeResults(runner),
chest
);
return mergeRunner.run(QueryPlus.wrap(query), context);
}
@Test
public void testEmptyTopN()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric(QueryRunnerTestHelper.INDEX_METRIC)
.threshold(4)
.intervals(QueryRunnerTestHelper.EMPTY_INTERVAL)
.aggregators(
Lists.newArrayList(
Iterables.concat(
commonAggregators,
Lists.newArrayList(
new DoubleMaxAggregatorFactory("maxIndex", "index"),
new DoubleMinAggregatorFactory("minIndex", "index"),
new DoubleFirstAggregatorFactory("first", "index")
)
)
)
)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = ImmutableList.of(
new Result<>(
DateTimes.of("2020-04-02T00:00:00.000Z"),
new TopNResultValue(ImmutableList.of())
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testFullOnTopN()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric(QueryRunnerTestHelper.INDEX_METRIC)
.threshold(4)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(
Lists.newArrayList(
Iterables.concat(
commonAggregators,
Lists.newArrayList(
new DoubleMaxAggregatorFactory("maxIndex", "index"),
new DoubleMinAggregatorFactory("minIndex", "index")
)
)
)
)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put(QueryRunnerTestHelper.MARKET_DIMENSION, "total_market")
.put("rows", 186L)
.put("index", 215679.82879638672D)
.put("addRowsIndexConstant", 215866.82879638672D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_2)
.put("maxIndex", 1743.92175D)
.put("minIndex", 792.3260498046875D)
.build(),
ImmutableMap.<String, Object>builder()
.put(QueryRunnerTestHelper.MARKET_DIMENSION, "upfront")
.put("rows", 186L)
.put("index", 192046.1060180664D)
.put("addRowsIndexConstant", 192233.1060180664D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_2)
.put("maxIndex", 1870.061029D)
.put("minIndex", 545.9906005859375D)
.build(),
ImmutableMap.<String, Object>builder()
.put(QueryRunnerTestHelper.MARKET_DIMENSION, "spot")
.put("rows", 837L)
.put("index", 95606.57232284546D)
.put("addRowsIndexConstant", 96444.57232284546D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_9)
.put("maxIndex", 277.273533D)
.put("minIndex", 59.02102279663086D)
.build()
)
)
)
);
assertExpectedResults(expectedResults, query);
assertExpectedResults(expectedResults,
query.withAggregatorSpecs(Lists.newArrayList(Iterables.concat(
QueryRunnerTestHelper.COMMON_FLOAT_AGGREGATORS,
Lists.newArrayList(
new FloatMaxAggregatorFactory("maxIndex", "indexFloat"),
new FloatMinAggregatorFactory("minIndex", "indexFloat")
)
)))
);
}
@Test
public void testTopNOnMissingColumn()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(new DefaultDimensionSpec("nonexistentColumn", "alias"))
.metric("rows")
.threshold(4)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(new CountAggregatorFactory("rows"))
.build();
final HashMap<String, Object> resultMap = new HashMap<>();
resultMap.put("alias", null);
resultMap.put("rows", 1209L);
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(Collections.<Map<String, Object>>singletonList(resultMap))
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNOnMissingColumnWithExtractionFn()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(new ExtractionDimensionSpec("nonexistentColumn", "alias", new StringFormatExtractionFn("theValue")))
.metric("rows")
.threshold(4)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(new CountAggregatorFactory("rows"))
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Collections.<Map<String, Object>>singletonList(
ImmutableMap.<String, Object>builder()
.put("alias", "theValue")
.put("rows", 1209L)
.build()
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testFullOnTopNOverPostAggs()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT_METRIC)
.threshold(4)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(
Lists.newArrayList(
Iterables.concat(
commonAggregators,
Lists.newArrayList(
new DoubleMaxAggregatorFactory("maxIndex", "index"),
new DoubleMinAggregatorFactory("minIndex", "index")
)
)
)
)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put(QueryRunnerTestHelper.MARKET_DIMENSION, "total_market")
.put("rows", 186L)
.put("index", 215679.82879638672D)
.put("addRowsIndexConstant", 215866.82879638672D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_2)
.put("maxIndex", 1743.92175D)
.put("minIndex", 792.3260498046875D)
.build(),
ImmutableMap.<String, Object>builder()
.put(QueryRunnerTestHelper.MARKET_DIMENSION, "upfront")
.put("rows", 186L)
.put("index", 192046.1060180664D)
.put("addRowsIndexConstant", 192233.1060180664D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_2)
.put("maxIndex", 1870.061029D)
.put("minIndex", 545.9906005859375D)
.build(),
ImmutableMap.<String, Object>builder()
.put(QueryRunnerTestHelper.MARKET_DIMENSION, "spot")
.put("rows", 837L)
.put("index", 95606.57232284546D)
.put("addRowsIndexConstant", 96444.57232284546D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_9)
.put("maxIndex", 277.273533D)
.put("minIndex", 59.02102279663086D)
.build()
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testFullOnTopNOverPostAggsOnDimension()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric("dimPostAgg")
.threshold(4)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(
Lists.newArrayList(
Iterables.concat(
commonAggregators,
Lists.newArrayList(
new DoubleMaxAggregatorFactory("maxIndex", "index"),
new DoubleMinAggregatorFactory("minIndex", "index")
)
)
)
)
.postAggregators(
new ExpressionPostAggregator(
"dimPostAgg",
"market + 'x'",
null,
TestExprMacroTable.INSTANCE
)
)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put(QueryRunnerTestHelper.MARKET_DIMENSION, "upfront")
.put("dimPostAgg", "upfrontx")
.put("rows", 186L)
.put("index", 192046.1060180664D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_2)
.put("maxIndex", 1870.061029D)
.put("minIndex", 545.9906005859375D)
.build(),
ImmutableMap.<String, Object>builder()
.put(QueryRunnerTestHelper.MARKET_DIMENSION, "total_market")
.put("dimPostAgg", "total_marketx")
.put("rows", 186L)
.put("index", 215679.82879638672D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_2)
.put("maxIndex", 1743.92175D)
.put("minIndex", 792.3260498046875D)
.build(),
ImmutableMap.<String, Object>builder()
.put(QueryRunnerTestHelper.MARKET_DIMENSION, "spot")
.put("dimPostAgg", "spotx")
.put("rows", 837L)
.put("index", 95606.57232284546D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_9)
.put("maxIndex", 277.273533D)
.put("minIndex", 59.02102279663086D)
.build()
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testFullOnTopNOverUniques()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric(QueryRunnerTestHelper.UNIQUE_METRIC)
.threshold(3)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(
Lists.newArrayList(
Iterables.concat(
commonAggregators,
Lists.newArrayList(
new DoubleMaxAggregatorFactory("maxIndex", "index"),
new DoubleMinAggregatorFactory("minIndex", "index")
)
)
)
)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("market", "spot")
.put("rows", 837L)
.put("index", 95606.57232284546D)
.put("addRowsIndexConstant", 96444.57232284546D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_9)
.put("maxIndex", 277.273533D)
.put("minIndex", 59.02102279663086D)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "total_market")
.put("rows", 186L)
.put("index", 215679.82879638672D)
.put("addRowsIndexConstant", 215866.82879638672D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_2)
.put("maxIndex", 1743.92175D)
.put("minIndex", 792.3260498046875D)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "upfront")
.put("rows", 186L)
.put("index", 192046.1060180664D)
.put("addRowsIndexConstant", 192233.1060180664D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_2)
.put("maxIndex", 1870.061029D)
.put("minIndex", 545.9906005859375D)
.build()
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNOverMissingUniques()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric(QueryRunnerTestHelper.UNIQUE_METRIC)
.threshold(3)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(new HyperUniquesAggregatorFactory("uniques", "missingUniques"))
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("market", "spot")
.put("uniques", 0d)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "total_market")
.put("uniques", 0d)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "upfront")
.put("uniques", 0d)
.build()
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNOverHyperUniqueFinalizingPostAggregator()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric(QueryRunnerTestHelper.HYPER_UNIQUE_FINALIZING_POST_AGG_METRIC)
.threshold(3)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(QueryRunnerTestHelper.QUALITY_UNIQUES)
.postAggregators(
new HyperUniqueFinalizingPostAggregator(
QueryRunnerTestHelper.HYPER_UNIQUE_FINALIZING_POST_AGG_METRIC,
QueryRunnerTestHelper.UNIQUE_METRIC
)
)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("market", "spot")
.put(QueryRunnerTestHelper.UNIQUE_METRIC, QueryRunnerTestHelper.UNIQUES_9)
.put(QueryRunnerTestHelper.HYPER_UNIQUE_FINALIZING_POST_AGG_METRIC, QueryRunnerTestHelper.UNIQUES_9)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "total_market")
.put(QueryRunnerTestHelper.UNIQUE_METRIC, QueryRunnerTestHelper.UNIQUES_2)
.put(QueryRunnerTestHelper.HYPER_UNIQUE_FINALIZING_POST_AGG_METRIC, QueryRunnerTestHelper.UNIQUES_2)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "upfront")
.put(QueryRunnerTestHelper.UNIQUE_METRIC, QueryRunnerTestHelper.UNIQUES_2)
.put(QueryRunnerTestHelper.HYPER_UNIQUE_FINALIZING_POST_AGG_METRIC, QueryRunnerTestHelper.UNIQUES_2)
.build()
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNOverHyperUniqueExpression()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric(QueryRunnerTestHelper.HYPER_UNIQUE_FINALIZING_POST_AGG_METRIC)
.threshold(3)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(QueryRunnerTestHelper.QUALITY_UNIQUES)
.postAggregators(
new ExpressionPostAggregator(
QueryRunnerTestHelper.HYPER_UNIQUE_FINALIZING_POST_AGG_METRIC,
"uniques + 1",
null,
TestExprMacroTable.INSTANCE
)
)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("market", "spot")
.put(QueryRunnerTestHelper.UNIQUE_METRIC, QueryRunnerTestHelper.UNIQUES_9)
.put(QueryRunnerTestHelper.HYPER_UNIQUE_FINALIZING_POST_AGG_METRIC,
QueryRunnerTestHelper.UNIQUES_9 + 1
)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "total_market")
.put(QueryRunnerTestHelper.UNIQUE_METRIC, QueryRunnerTestHelper.UNIQUES_2)
.put(QueryRunnerTestHelper.HYPER_UNIQUE_FINALIZING_POST_AGG_METRIC,
QueryRunnerTestHelper.UNIQUES_2 + 1
)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "upfront")
.put(QueryRunnerTestHelper.UNIQUE_METRIC, QueryRunnerTestHelper.UNIQUES_2)
.put(QueryRunnerTestHelper.HYPER_UNIQUE_FINALIZING_POST_AGG_METRIC,
QueryRunnerTestHelper.UNIQUES_2 + 1
)
.build()
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNOverHyperUniqueExpressionRounded()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric(QueryRunnerTestHelper.HYPER_UNIQUE_FINALIZING_POST_AGG_METRIC)
.threshold(3)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(QueryRunnerTestHelper.QUALITY_UNIQUES_ROUNDED)
.postAggregators(
new ExpressionPostAggregator(
QueryRunnerTestHelper.HYPER_UNIQUE_FINALIZING_POST_AGG_METRIC,
"uniques + 1",
null,
TestExprMacroTable.INSTANCE
)
)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("market", "spot")
.put(QueryRunnerTestHelper.UNIQUE_METRIC, 9L)
.put(QueryRunnerTestHelper.HYPER_UNIQUE_FINALIZING_POST_AGG_METRIC, 10L)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "total_market")
.put(QueryRunnerTestHelper.UNIQUE_METRIC, 2L)
.put(QueryRunnerTestHelper.HYPER_UNIQUE_FINALIZING_POST_AGG_METRIC, 3L)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "upfront")
.put(QueryRunnerTestHelper.UNIQUE_METRIC, 2L)
.put(QueryRunnerTestHelper.HYPER_UNIQUE_FINALIZING_POST_AGG_METRIC, 3L)
.build()
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNOverFirstLastAggregator()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.MONTH_GRAN)
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric("last")
.threshold(3)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(
new LongFirstAggregatorFactory("first", "index"),
new LongLastAggregatorFactory("last", "index")
)
.build();
List<Result<TopNResultValue>> expectedResults = Arrays.asList(
new Result<>(
DateTimes.of("2011-01-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("market", "total_market")
.put("first", 1000L)
.put("last", 1127L)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "upfront")
.put("first", 800L)
.put("last", 943L)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "spot")
.put("first", 100L)
.put("last", 155L)
.build()
)
)
),
new Result<>(
DateTimes.of("2011-02-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("market", "total_market")
.put("first", 1203L)
.put("last", 1292L)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "upfront")
.put("first", 1667L)
.put("last", 1101L)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "spot")
.put("first", 132L)
.put("last", 114L)
.build()
)
)
),
new Result<>(
DateTimes.of("2011-03-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("market", "total_market")
.put("first", 1124L)
.put("last", 1366L)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "upfront")
.put("first", 1166L)
.put("last", 1063L)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "spot")
.put("first", 153L)
.put("last", 125L)
.build()
)
)
),
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("market", "total_market")
.put("first", 1314L)
.put("last", 1029L)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "upfront")
.put("first", 1447L)
.put("last", 780L)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "spot")
.put("first", 135L)
.put("last", 120L)
.build()
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNOverFirstLastFloatAggregatorUsingDoubleColumn()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.MONTH_GRAN)
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric("last")
.threshold(3)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(
new FloatFirstAggregatorFactory("first", "index"),
new FloatLastAggregatorFactory("last", "index")
)
.build();
List<Result<TopNResultValue>> expectedResults = Arrays.asList(
new Result<>(
DateTimes.of("2011-01-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("market", "total_market")
.put("first", 1000f)
.put("last", 1127.23095703125f)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "upfront")
.put("first", 800f)
.put("last", 943.4971923828125f)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "spot")
.put("first", 100f)
.put("last", 155.7449493408203f)
.build()
)
)
),
new Result<>(
DateTimes.of("2011-02-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("market", "total_market")
.put("first", 1203.4656f)
.put("last", 1292.5428466796875f)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "upfront")
.put("first", 1667.497802734375f)
.put("last", 1101.918212890625f)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "spot")
.put("first", 132.123779296875f)
.put("last", 114.2845687866211f)
.build()
)
)
),
new Result<>(
DateTimes.of("2011-03-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("market", "total_market")
.put("first", 1124.2014f)
.put("last", 1366.4476f)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "upfront")
.put("first", 1166.1411f)
.put("last", 1063.2012f)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "spot")
.put("first", 153.05994f)
.put("last", 125.83968f)
.build()
)
)
),
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("market", "total_market")
.put("first", 1314.8397f)
.put("last", 1029.057f)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "upfront")
.put("first", 1447.3412)
.put("last", 780.272)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "spot")
.put("first", 135.8851f)
.put("last", 120.290344f)
.build()
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNOverFirstLastFloatAggregatorUsingFloatColumn()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.MONTH_GRAN)
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric("last")
.threshold(3)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(
new FloatFirstAggregatorFactory("first", "indexFloat"),
new FloatLastAggregatorFactory("last", "indexFloat")
)
.build();
List<Result<TopNResultValue>> expectedResults = Arrays.asList(
new Result<>(
DateTimes.of("2011-01-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("market", "total_market")
.put("first", 1000f)
.put("last", 1127.23095703125f)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "upfront")
.put("first", 800f)
.put("last", 943.4971923828125f)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "spot")
.put("first", 100f)
.put("last", 155.7449493408203f)
.build()
)
)
),
new Result<>(
DateTimes.of("2011-02-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("market", "total_market")
.put("first", 1203.4656f)
.put("last", 1292.5428466796875f)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "upfront")
.put("first", 1667.497802734375f)
.put("last", 1101.918212890625f)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "spot")
.put("first", 132.123779296875f)
.put("last", 114.2845687866211f)
.build()
)
)
),
new Result<>(
DateTimes.of("2011-03-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("market", "total_market")
.put("first", 1124.2014f)
.put("last", 1366.4476f)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "upfront")
.put("first", 1166.1411f)
.put("last", 1063.2012f)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "spot")
.put("first", 153.05994f)
.put("last", 125.83968f)
.build()
)
)
),
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("market", "total_market")
.put("first", 1314.8397f)
.put("last", 1029.057f)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "upfront")
.put("first", 1447.3412)
.put("last", 780.272)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "spot")
.put("first", 135.8851f)
.put("last", 120.290344f)
.build()
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNBySegment()
{
final HashMap<String, Object> specialContext = new HashMap<String, Object>();
specialContext.put(QueryContexts.BY_SEGMENT_KEY, "true");
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric(QueryRunnerTestHelper.INDEX_METRIC)
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.context(specialContext)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
"addRowsIndexConstant", 5356.814783D,
"index", 5351.814783D,
QueryRunnerTestHelper.MARKET_DIMENSION, "total_market",
"uniques", QueryRunnerTestHelper.UNIQUES_2,
"rows", 4L
),
ImmutableMap.of(
"addRowsIndexConstant", 4880.669692D,
"index", 4875.669692D,
QueryRunnerTestHelper.MARKET_DIMENSION, "upfront",
"uniques", QueryRunnerTestHelper.UNIQUES_2,
"rows", 4L
),
ImmutableMap.of(
"addRowsIndexConstant", 2250.876812D,
"index", 2231.876812D,
QueryRunnerTestHelper.MARKET_DIMENSION, "spot",
"uniques", QueryRunnerTestHelper.UNIQUES_9,
"rows", 18L
)
)
)
)
);
Sequence<Result<TopNResultValue>> results = runWithMerge(query);
List<Result<BySegmentTopNResultValue>> resultList = results
.map((Result<TopNResultValue> input) -> {
// Stupid type erasure
Object val = input.getValue();
if (val instanceof BySegmentResultValue) {
BySegmentResultValue bySegVal = (BySegmentResultValue) val;
return new Result<>(
input.getTimestamp(),
new BySegmentTopNResultValue(
Lists.transform(
bySegVal.getResults(),
res -> {
if (Preconditions.checkNotNull(res) instanceof Result) {
Result theResult = (Result) res;
Object resVal = theResult.getValue();
if (resVal instanceof TopNResultValue) {
return new Result<>(theResult.getTimestamp(), (TopNResultValue) resVal);
}
}
throw new IAE("Bad input: [%s]", res);
}
),
bySegVal.getSegmentId(),
bySegVal.getInterval()
)
);
}
throw new ISE("Bad type");
})
.toList();
Result<BySegmentTopNResultValue> result = resultList.get(0);
TestHelper.assertExpectedResults(expectedResults, result.getValue().getResults());
}
@Test
public void testTopN()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric(QueryRunnerTestHelper.INDEX_METRIC)
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "total_market",
"rows", 4L,
"index", 5351.814783D,
"addRowsIndexConstant", 5356.814783D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "upfront",
"rows", 4L,
"index", 4875.669692D,
"addRowsIndexConstant", 4880.669692D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "spot",
"rows", 18L,
"index", 2231.876812D,
"addRowsIndexConstant", 2250.876812D,
"uniques", QueryRunnerTestHelper.UNIQUES_9
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNByUniques()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric(new NumericTopNMetricSpec("uniques"))
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
"market", "spot",
"rows", 18L,
"index", 2231.876812D,
"addRowsIndexConstant", 2250.876812D,
"uniques", QueryRunnerTestHelper.UNIQUES_9
),
ImmutableMap.of(
"market", "total_market",
"rows", 4L,
"index", 5351.814783D,
"addRowsIndexConstant", 5356.814783D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
),
ImmutableMap.of(
"market", "upfront",
"rows", 4L,
"index", 4875.669692D,
"addRowsIndexConstant", 4880.669692D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNWithOrFilter1()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.filters(QueryRunnerTestHelper.MARKET_DIMENSION, "total_market", "upfront", "spot")
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric(QueryRunnerTestHelper.INDEX_METRIC)
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "total_market",
"rows", 4L,
"index", 5351.814783D,
"addRowsIndexConstant", 5356.814783D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "upfront",
"rows", 4L,
"index", 4875.669692D,
"addRowsIndexConstant", 4880.669692D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "spot",
"rows", 18L,
"index", 2231.876812D,
"addRowsIndexConstant", 2250.876812D,
"uniques", QueryRunnerTestHelper.UNIQUES_9
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNWithOrFilter2()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.filters(QueryRunnerTestHelper.MARKET_DIMENSION, "total_market", "upfront")
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric(QueryRunnerTestHelper.INDEX_METRIC)
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "total_market",
"rows", 4L,
"index", 5351.814783D,
"addRowsIndexConstant", 5356.814783D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "upfront",
"rows", 4L,
"index", 4875.669692D,
"addRowsIndexConstant", 4880.669692D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNWithFilter1()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.filters(QueryRunnerTestHelper.MARKET_DIMENSION, "upfront")
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric(QueryRunnerTestHelper.INDEX_METRIC)
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Collections.<Map<String, Object>>singletonList(
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "upfront",
"rows", 4L,
"index", 4875.669692D,
"addRowsIndexConstant", 4880.669692D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNWithFilter2()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.filters(QueryRunnerTestHelper.QUALITY_DIMENSION, "mezzanine")
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric(QueryRunnerTestHelper.INDEX_METRIC)
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "upfront",
"rows", 2L,
"index", 2591.68359375D,
"addRowsIndexConstant", 2594.68359375D,
"uniques", QueryRunnerTestHelper.UNIQUES_1
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "total_market",
"rows", 2L,
"index", 2508.39599609375D,
"addRowsIndexConstant", 2511.39599609375D,
"uniques", QueryRunnerTestHelper.UNIQUES_1
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "spot",
"rows", 2L,
"index", 220.63774871826172D,
"addRowsIndexConstant", 223.63774871826172D,
"uniques", QueryRunnerTestHelper.UNIQUES_1
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNWithFilter2OneDay()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.filters(QueryRunnerTestHelper.QUALITY_DIMENSION, "mezzanine")
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric(QueryRunnerTestHelper.INDEX_METRIC)
.threshold(4)
.intervals(
new MultipleIntervalSegmentSpec(
Collections.singletonList(Intervals.of("2011-04-01T00:00:00.000Z/2011-04-02T00:00:00.000Z"))
)
)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "upfront",
"rows", 1L,
"index", new Float(1447.341160).doubleValue(),
"addRowsIndexConstant", new Float(1449.341160).doubleValue(),
"uniques", QueryRunnerTestHelper.UNIQUES_1
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "total_market",
"rows", 1L,
"index", new Float(1314.839715).doubleValue(),
"addRowsIndexConstant", new Float(1316.839715).doubleValue(),
"uniques", QueryRunnerTestHelper.UNIQUES_1
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "spot",
"rows", 1L,
"index", new Float(109.705815).doubleValue(),
"addRowsIndexConstant", new Float(111.705815).doubleValue(),
"uniques", QueryRunnerTestHelper.UNIQUES_1
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNWithNonExistentFilterInOr()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.filters(QueryRunnerTestHelper.MARKET_DIMENSION, "total_market", "upfront", "billyblank")
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric(QueryRunnerTestHelper.INDEX_METRIC)
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "total_market",
"rows", 4L,
"index", 5351.814783D,
"addRowsIndexConstant", 5356.814783D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "upfront",
"rows", 4L,
"index", 4875.669692D,
"addRowsIndexConstant", 4880.669692D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNWithNonExistentFilter()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.filters(QueryRunnerTestHelper.MARKET_DIMENSION, "billyblank")
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric(QueryRunnerTestHelper.INDEX_METRIC)
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
assertExpectedResults(
Collections.singletonList(
new Result<>(DateTimes.of("2011-04-01T00:00:00.000Z"), new TopNResultValue(Collections.emptyList()))
),
query
);
}
@Test
public void testTopNWithNonExistentFilterMultiDim()
{
AndDimFilter andDimFilter = new AndDimFilter(
new SelectorDimFilter(QueryRunnerTestHelper.MARKET_DIMENSION, "billyblank", null),
new SelectorDimFilter(QueryRunnerTestHelper.QUALITY_DIMENSION, "mezzanine", null)
);
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.filters(andDimFilter)
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric(QueryRunnerTestHelper.INDEX_METRIC)
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
assertExpectedResults(
Collections.singletonList(
new Result<>(DateTimes.of("2011-04-01T00:00:00.000Z"), new TopNResultValue(Collections.emptyList()))
),
query
);
}
@Test
public void testTopNWithMultiValueDimFilter1()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.filters(QueryRunnerTestHelper.PLACEMENTISH_DIMENSION, "m")
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric(QueryRunnerTestHelper.INDEX_METRIC)
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
assertExpectedResults(
runWithMerge(
new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.filters(QueryRunnerTestHelper.QUALITY_DIMENSION, "mezzanine")
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric(QueryRunnerTestHelper.INDEX_METRIC)
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build()
).toList(),
query
);
}
@Test
public void testTopNWithMultiValueDimFilter2()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.filters(QueryRunnerTestHelper.PLACEMENTISH_DIMENSION, "m", "a", "b")
.dimension(QueryRunnerTestHelper.QUALITY_DIMENSION)
.metric(QueryRunnerTestHelper.INDEX_METRIC)
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
assertExpectedResults(
runWithMerge(
new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.filters(
QueryRunnerTestHelper.QUALITY_DIMENSION,
"mezzanine",
"automotive",
"business"
)
.dimension(QueryRunnerTestHelper.QUALITY_DIMENSION)
.metric(QueryRunnerTestHelper.INDEX_METRIC)
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build()
).toList(),
query
);
}
@Test
public void testTopNWithMultiValueDimFilter3()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.filters(QueryRunnerTestHelper.PLACEMENTISH_DIMENSION, "a")
.dimension(QueryRunnerTestHelper.PLACEMENTISH_DIMENSION)
.metric(QueryRunnerTestHelper.INDEX_METRIC)
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
final List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
"placementish", "a",
"rows", 2L,
"index", 283.31103515625D,
"addRowsIndexConstant", 286.31103515625D,
"uniques", QueryRunnerTestHelper.UNIQUES_1
),
ImmutableMap.of(
"placementish", "preferred",
"rows", 2L,
"index", 283.31103515625D,
"addRowsIndexConstant", 286.31103515625D,
"uniques", QueryRunnerTestHelper.UNIQUES_1
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNWithMultiValueDimFilter4()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.filters(QueryRunnerTestHelper.PLACEMENTISH_DIMENSION, "a", "b")
.dimension(QueryRunnerTestHelper.PLACEMENTISH_DIMENSION)
.metric(QueryRunnerTestHelper.INDEX_METRIC)
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
final List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
"placementish", "preferred",
"rows", 4L,
"index", 514.868408203125D,
"addRowsIndexConstant", 519.868408203125D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
),
ImmutableMap.of(
"placementish",
"a", "rows", 2L,
"index", 283.31103515625D,
"addRowsIndexConstant", 286.31103515625D,
"uniques", QueryRunnerTestHelper.UNIQUES_1
),
ImmutableMap.of(
"placementish", "b",
"rows", 2L,
"index", 231.557373046875D,
"addRowsIndexConstant", 234.557373046875D,
"uniques", QueryRunnerTestHelper.UNIQUES_1
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNWithMultiValueDimFilter5()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.filters(QueryRunnerTestHelper.PLACEMENTISH_DIMENSION, "preferred")
.dimension(QueryRunnerTestHelper.PLACEMENTISH_DIMENSION)
.metric(QueryRunnerTestHelper.INDEX_METRIC)
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
final List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
"placementish", "preferred",
"rows", 26L,
"index", 12459.361190795898D,
"addRowsIndexConstant", 12486.361190795898D,
"uniques", QueryRunnerTestHelper.UNIQUES_9
),
ImmutableMap.of(
"placementish", "p",
"rows", 6L,
"index", 5407.213653564453D,
"addRowsIndexConstant", 5414.213653564453D,
"uniques", QueryRunnerTestHelper.UNIQUES_1
),
ImmutableMap.of(
"placementish", "m",
"rows", 6L,
"index", 5320.717338562012D,
"addRowsIndexConstant", 5327.717338562012D,
"uniques", QueryRunnerTestHelper.UNIQUES_1
),
ImmutableMap.of(
"placementish", "t",
"rows", 4L,
"index", 422.3440856933594D,
"addRowsIndexConstant", 427.3440856933594D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNWithNonExistentDimension()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension("doesn't exist")
.metric(QueryRunnerTestHelper.INDEX_METRIC)
.threshold(1)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Collections.singletonList(
QueryRunnerTestHelper.orderedMap(
"doesn't exist", null,
"rows", 26L,
"index", 12459.361190795898D,
"addRowsIndexConstant", 12486.361190795898D,
"uniques", QueryRunnerTestHelper.UNIQUES_9
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNWithNonExistentDimensionAndActualFilter()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.filters(QueryRunnerTestHelper.MARKET_DIMENSION, "upfront")
.dimension("doesn't exist")
.metric(QueryRunnerTestHelper.INDEX_METRIC)
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Collections.singletonList(
QueryRunnerTestHelper.orderedMap(
"doesn't exist", null,
"rows", 4L,
"index", 4875.669692D,
"addRowsIndexConstant", 4880.669692D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNWithNonExistentDimensionAndNonExistentFilter()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.filters("doesn't exist", null)
.dimension("doesn't exist")
.metric(QueryRunnerTestHelper.INDEX_METRIC)
.threshold(1)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Collections.singletonList(
QueryRunnerTestHelper.orderedMap(
"doesn't exist", null,
"rows", 26L,
"index", 12459.361190795898D,
"addRowsIndexConstant", 12486.361190795898D,
"uniques", QueryRunnerTestHelper.UNIQUES_9
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNLexicographic()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric(new DimensionTopNMetricSpec("", StringComparators.LEXICOGRAPHIC))
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "spot",
"rows", 18L,
"index", 2231.876812D,
"addRowsIndexConstant", 2250.876812D,
"uniques", QueryRunnerTestHelper.UNIQUES_9
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "total_market",
"rows", 4L,
"index", 5351.814783D,
"addRowsIndexConstant", 5356.814783D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "upfront",
"rows", 4L,
"index", 4875.669692D,
"addRowsIndexConstant", 4880.669692D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNLexicographicNoAggregators()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric(new DimensionTopNMetricSpec("", StringComparators.LEXICOGRAPHIC))
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "spot"
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "total_market"
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "upfront"
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNLexicographicWithPreviousStop()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric(new DimensionTopNMetricSpec("spot", StringComparators.LEXICOGRAPHIC))
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "total_market",
"rows", 4L,
"index", 5351.814783D,
"addRowsIndexConstant", 5356.814783D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "upfront",
"rows", 4L,
"index", 4875.669692D,
"addRowsIndexConstant", 4880.669692D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNLexicographicWithNonExistingPreviousStop()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric(new DimensionTopNMetricSpec("t", StringComparators.LEXICOGRAPHIC))
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "total_market",
"rows", 4L,
"index", 5351.814783D,
"addRowsIndexConstant", 5356.814783D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "upfront",
"rows", 4L,
"index", 4875.669692D,
"addRowsIndexConstant", 4880.669692D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNInvertedLexicographicWithPreviousStop()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric(new InvertedTopNMetricSpec(new DimensionTopNMetricSpec("upfront", StringComparators.LEXICOGRAPHIC)))
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "total_market",
"rows", 4L,
"index", 5351.814783D,
"addRowsIndexConstant", 5356.814783D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "spot",
"rows", 18L,
"index", 2231.876812D,
"addRowsIndexConstant", 2250.876812D,
"uniques", QueryRunnerTestHelper.UNIQUES_9
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNInvertedLexicographicWithNonExistingPreviousStop()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric(new InvertedTopNMetricSpec(new DimensionTopNMetricSpec("u", StringComparators.LEXICOGRAPHIC)))
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "total_market",
"rows", 4L,
"index", 5351.814783D,
"addRowsIndexConstant", 5356.814783D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "spot",
"rows", 18L,
"index", 2231.876812D,
"addRowsIndexConstant", 2250.876812D,
"uniques", QueryRunnerTestHelper.UNIQUES_9
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNDimExtractionToOne()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(
new ExtractionDimensionSpec(
QueryRunnerTestHelper.MARKET_DIMENSION,
QueryRunnerTestHelper.MARKET_DIMENSION,
new JavaScriptExtractionFn("function(f) { return \"POTATO\"; }", false, JavaScriptConfig.getEnabledInstance())
)
)
.metric("rows")
.threshold(10)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Collections.<Map<String, Object>>singletonList(
ImmutableMap.of(
"addRowsIndexConstant", 504542.5071372986D,
"index", 503332.5071372986D,
QueryRunnerTestHelper.MARKET_DIMENSION, "POTATO",
"uniques", QueryRunnerTestHelper.UNIQUES_9,
"rows", 1209L
)
)
)
)
);
List<Result<TopNResultValue>> list = runWithMerge(query).toList();
Assert.assertEquals(list.size(), 1);
Assert.assertEquals("Didn't merge results", list.get(0).getValue().getValue().size(), 1);
TestHelper.assertExpectedResults(expectedResults, list, "Failed to match");
}
@Test
public void testTopNDimExtractionTimeToOneLong()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(
new ExtractionDimensionSpec(
ColumnHolder.TIME_COLUMN_NAME,
"t",
ValueType.LONG,
new JavaScriptExtractionFn(
"function(f) { return \"42\"; }",
false,
JavaScriptConfig.getEnabledInstance()
)
)
)
.metric("rows")
.threshold(10)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Collections.<Map<String, Object>>singletonList(
ImmutableMap.of(
"addRowsIndexConstant", 504542.5071372986D,
"index", 503332.5071372986D,
"t", 42L,
"uniques", QueryRunnerTestHelper.UNIQUES_9,
"rows", 1209L
)
)
)
)
);
List<Result<TopNResultValue>> list = runWithMerge(query).toList();
Assert.assertEquals(list.size(), 1);
Assert.assertEquals("Didn't merge results", list.get(0).getValue().getValue().size(), 1);
TestHelper.assertExpectedResults(expectedResults, list, "Failed to match");
}
@Test
public void testTopNCollapsingDimExtraction()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(
new ExtractionDimensionSpec(
QueryRunnerTestHelper.QUALITY_DIMENSION,
QueryRunnerTestHelper.QUALITY_DIMENSION,
new RegexDimExtractionFn(".(.)", false, null)
)
)
.metric("index")
.threshold(2)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(
QueryRunnerTestHelper.ROWS_COUNT,
QueryRunnerTestHelper.INDEX_DOUBLE_SUM
)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
QueryRunnerTestHelper.QUALITY_DIMENSION, "e",
"rows", 558L,
"index", 246645.1204032898,
"addRowsIndexConstant", 247204.1204032898
),
ImmutableMap.of(
QueryRunnerTestHelper.QUALITY_DIMENSION, "r",
"rows", 372L,
"index", 222051.08961486816,
"addRowsIndexConstant", 222424.08961486816
)
)
)
)
);
assertExpectedResults(expectedResults, query);
query = query.withAggregatorSpecs(
Arrays.asList(
QueryRunnerTestHelper.ROWS_COUNT,
new DoubleSumAggregatorFactory("index", null, "-index + 100", ExprMacroTable.nil())
)
);
expectedResults = Collections.singletonList(
TopNQueryRunnerTestHelper.createExpectedRows(
"2011-01-12T00:00:00.000Z",
new String[] {QueryRunnerTestHelper.QUALITY_DIMENSION, "rows", "index", "addRowsIndexConstant"},
Arrays.asList(
new Object[] {"n", 93L, -2786.4727909999997, -2692.4727909999997},
new Object[] {"u", 186L, -3949.824348000002, -3762.824348000002}
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNDimExtraction()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(
new ExtractionDimensionSpec(
QueryRunnerTestHelper.MARKET_DIMENSION,
QueryRunnerTestHelper.MARKET_DIMENSION,
new RegexDimExtractionFn("(.)", false, null)
)
)
.metric("rows")
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "s",
"rows", 18L,
"index", 2231.876812D,
"addRowsIndexConstant", 2250.876812D,
"uniques", QueryRunnerTestHelper.UNIQUES_9
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "t",
"rows", 4L,
"index", 5351.814783D,
"addRowsIndexConstant", 5356.814783D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "u",
"rows", 4L,
"index", 4875.669692D,
"addRowsIndexConstant", 4880.669692D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNDimExtractionNoAggregators()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(
new ExtractionDimensionSpec(
QueryRunnerTestHelper.MARKET_DIMENSION,
QueryRunnerTestHelper.MARKET_DIMENSION,
new RegexDimExtractionFn("(.)", false, null)
)
)
.metric(new LexicographicTopNMetricSpec(QueryRunnerTestHelper.MARKET_DIMENSION))
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "s"
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "t"
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "u"
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNDimExtractionFastTopNOptimalWithReplaceMissing()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(
new ExtractionDimensionSpec(
QueryRunnerTestHelper.MARKET_DIMENSION,
QueryRunnerTestHelper.MARKET_DIMENSION,
new LookupExtractionFn(
new MapLookupExtractor(
ImmutableMap.of(
"spot", "2spot0",
"total_market", "1total_market0",
"upfront", "3upfront0"
),
false
), false, "MISSING", true,
false
)
)
)
.metric("rows")
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "2spot0",
"rows", 18L,
"index", 2231.876812D,
"addRowsIndexConstant", 2250.876812D,
"uniques", QueryRunnerTestHelper.UNIQUES_9
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "1total_market0",
"rows", 4L,
"index", 5351.814783D,
"addRowsIndexConstant", 5356.814783D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "3upfront0",
"rows", 4L,
"index", 4875.669692D,
"addRowsIndexConstant", 4880.669692D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNDimExtractionFastTopNUnOptimalWithReplaceMissing()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(
new ExtractionDimensionSpec(
QueryRunnerTestHelper.MARKET_DIMENSION,
QueryRunnerTestHelper.MARKET_DIMENSION,
new LookupExtractionFn(
new MapLookupExtractor(
ImmutableMap.of(
"spot", "2spot0",
"total_market", "1total_market0",
"upfront", "3upfront0"
),
false
), false, "MISSING", false,
false
)
)
)
.metric("rows")
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "2spot0",
"rows", 18L,
"index", 2231.876812D,
"addRowsIndexConstant", 2250.876812D,
"uniques", QueryRunnerTestHelper.UNIQUES_9
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "1total_market0",
"rows", 4L,
"index", 5351.814783D,
"addRowsIndexConstant", 5356.814783D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "3upfront0",
"rows", 4L,
"index", 4875.669692D,
"addRowsIndexConstant", 4880.669692D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
// Test a "direct" query
public void testTopNDimExtractionFastTopNOptimal()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(
new ExtractionDimensionSpec(
QueryRunnerTestHelper.MARKET_DIMENSION,
QueryRunnerTestHelper.MARKET_DIMENSION,
new LookupExtractionFn(
new MapLookupExtractor(
ImmutableMap.of(
"spot", "2spot0",
"total_market", "1total_market0",
"upfront", "3upfront0"
),
false
), true, null, true,
false
)
)
)
.metric("rows")
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "2spot0",
"rows", 18L,
"index", 2231.876812D,
"addRowsIndexConstant", 2250.876812D,
"uniques", QueryRunnerTestHelper.UNIQUES_9
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "1total_market0",
"rows", 4L,
"index", 5351.814783D,
"addRowsIndexConstant", 5356.814783D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "3upfront0",
"rows", 4L,
"index", 4875.669692D,
"addRowsIndexConstant", 4880.669692D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
// Test query path that must rebucket the data
public void testTopNDimExtractionFastTopNUnOptimal()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(
new ExtractionDimensionSpec(
QueryRunnerTestHelper.MARKET_DIMENSION,
QueryRunnerTestHelper.MARKET_DIMENSION,
new LookupExtractionFn(
new MapLookupExtractor(
ImmutableMap.of(
"spot",
"spot0",
"total_market",
"total_market0",
"upfront",
"upfront0"
),
false
), true, null, false,
false
)
)
)
.metric("rows")
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "spot0",
"rows", 18L,
"index", 2231.876812D,
"addRowsIndexConstant", 2250.876812D,
"uniques", QueryRunnerTestHelper.UNIQUES_9
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "total_market0",
"rows", 4L,
"index", 5351.814783D,
"addRowsIndexConstant", 5356.814783D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "upfront0",
"rows", 4L,
"index", 4875.669692D,
"addRowsIndexConstant", 4880.669692D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNLexicographicDimExtractionOptimalNamespace()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(
new ExtractionDimensionSpec(
QueryRunnerTestHelper.MARKET_DIMENSION,
QueryRunnerTestHelper.MARKET_DIMENSION,
new LookupExtractionFn(
new MapLookupExtractor(
ImmutableMap.of(
"spot",
"2spot",
"total_market",
"3total_market",
"upfront",
"1upfront"
),
false
), true, null, true,
false
)
)
)
.metric(new DimensionTopNMetricSpec(null, StringComparators.LEXICOGRAPHIC))
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "1upfront",
"rows", 4L,
"index", 4875.669692D,
"addRowsIndexConstant", 4880.669692D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "2spot",
"rows", 18L,
"index", 2231.876812D,
"addRowsIndexConstant", 2250.876812D,
"uniques", QueryRunnerTestHelper.UNIQUES_9
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "3total_market",
"rows", 4L,
"index", 5351.814783D,
"addRowsIndexConstant", 5356.814783D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNLexicographicDimExtractionUnOptimalNamespace()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(
new ExtractionDimensionSpec(
QueryRunnerTestHelper.MARKET_DIMENSION,
QueryRunnerTestHelper.MARKET_DIMENSION,
new LookupExtractionFn(
new MapLookupExtractor(
ImmutableMap.of(
"spot",
"2spot",
"total_market",
"3total_market",
"upfront",
"1upfront"
),
false
), true, null, false,
false
)
)
)
.metric(new DimensionTopNMetricSpec(null, StringComparators.LEXICOGRAPHIC))
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "1upfront",
"rows", 4L,
"index", 4875.669692D,
"addRowsIndexConstant", 4880.669692D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "2spot",
"rows", 18L,
"index", 2231.876812D,
"addRowsIndexConstant", 2250.876812D,
"uniques", QueryRunnerTestHelper.UNIQUES_9
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "3total_market",
"rows", 4L,
"index", 5351.814783D,
"addRowsIndexConstant", 5356.814783D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNLexicographicDimExtractionOptimalNamespaceWithRunner()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(
new ExtractionDimensionSpec(
QueryRunnerTestHelper.MARKET_DIMENSION,
QueryRunnerTestHelper.MARKET_DIMENSION,
new LookupExtractionFn(
new MapLookupExtractor(
ImmutableMap.of(
"spot",
"2spot",
"total_market",
"3total_market",
"upfront",
"1upfront"
),
false
), true, null, true,
false
)
)
)
.metric(new DimensionTopNMetricSpec(null, StringComparators.LEXICOGRAPHIC))
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "1upfront",
"rows", 4L,
"index", 4875.669692D,
"addRowsIndexConstant", 4880.669692D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "2spot",
"rows", 18L,
"index", 2231.876812D,
"addRowsIndexConstant", 2250.876812D,
"uniques", QueryRunnerTestHelper.UNIQUES_9
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "3total_market",
"rows", 4L,
"index", 5351.814783D,
"addRowsIndexConstant", 5356.814783D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNLexicographicDimExtraction()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(
new ExtractionDimensionSpec(
QueryRunnerTestHelper.MARKET_DIMENSION,
QueryRunnerTestHelper.MARKET_DIMENSION,
new RegexDimExtractionFn("(.)", false, null)
)
)
.metric(new DimensionTopNMetricSpec(null, StringComparators.LEXICOGRAPHIC))
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "s",
"rows", 18L,
"index", 2231.876812D,
"addRowsIndexConstant", 2250.876812D,
"uniques", QueryRunnerTestHelper.UNIQUES_9
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "t",
"rows", 4L,
"index", 5351.814783D,
"addRowsIndexConstant", 5356.814783D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "u",
"rows", 4L,
"index", 4875.669692D,
"addRowsIndexConstant", 4880.669692D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testInvertedTopNLexicographicDimExtraction2()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(
new ExtractionDimensionSpec(
QueryRunnerTestHelper.MARKET_DIMENSION,
QueryRunnerTestHelper.MARKET_DIMENSION,
new RegexDimExtractionFn("..(.)", false, null)
)
)
.metric(new InvertedTopNMetricSpec(new DimensionTopNMetricSpec(null, StringComparators.LEXICOGRAPHIC)))
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "t",
"rows", 4L,
"index", 5351.814783D,
"addRowsIndexConstant", 5356.814783D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "o",
"rows", 18L,
"index", 2231.876812D,
"addRowsIndexConstant", 2250.876812D,
"uniques", QueryRunnerTestHelper.UNIQUES_9
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "f",
"rows", 4L,
"index", 4875.669692D,
"addRowsIndexConstant", 4880.669692D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNLexicographicDimExtractionWithPreviousStop()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(
new ExtractionDimensionSpec(
QueryRunnerTestHelper.MARKET_DIMENSION,
QueryRunnerTestHelper.MARKET_DIMENSION,
new RegexDimExtractionFn("(.)", false, null)
)
)
.metric(new DimensionTopNMetricSpec("s", StringComparators.LEXICOGRAPHIC))
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "t",
"rows", 4L,
"index", 5351.814783D,
"addRowsIndexConstant", 5356.814783D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "u",
"rows", 4L,
"index", 4875.669692D,
"addRowsIndexConstant", 4880.669692D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNLexicographicDimExtractionWithSortingPreservedAndPreviousStop()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(
new ExtractionDimensionSpec(
QueryRunnerTestHelper.MARKET_DIMENSION,
QueryRunnerTestHelper.MARKET_DIMENSION,
new DimExtractionFn()
{
@Override
public byte[] getCacheKey()
{
return new byte[0];
}
@Override
public String apply(String value)
{
return value.substring(0, 1);
}
@Override
public boolean preservesOrdering()
{
return true;
}
@Override
public ExtractionType getExtractionType()
{
return ExtractionType.MANY_TO_ONE;
}
}
)
)
.metric(new DimensionTopNMetricSpec("s", StringComparators.LEXICOGRAPHIC))
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "t",
"rows", 4L,
"index", 5351.814783D,
"addRowsIndexConstant", 5356.814783D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "u",
"rows", 4L,
"index", 4875.669692D,
"addRowsIndexConstant", 4880.669692D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testInvertedTopNLexicographicDimExtractionWithPreviousStop()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(
new ExtractionDimensionSpec(
QueryRunnerTestHelper.MARKET_DIMENSION,
QueryRunnerTestHelper.MARKET_DIMENSION,
new RegexDimExtractionFn("(.)", false, null)
)
)
.metric(new InvertedTopNMetricSpec(new DimensionTopNMetricSpec("u", StringComparators.LEXICOGRAPHIC)))
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "t",
"rows", 4L,
"index", 5351.814783D,
"addRowsIndexConstant", 5356.814783D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "s",
"rows", 18L,
"index", 2231.876812D,
"addRowsIndexConstant", 2250.876812D,
"uniques", QueryRunnerTestHelper.UNIQUES_9
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testInvertedTopNLexicographicDimExtractionWithPreviousStop2()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(
new ExtractionDimensionSpec(
QueryRunnerTestHelper.MARKET_DIMENSION,
QueryRunnerTestHelper.MARKET_DIMENSION,
new RegexDimExtractionFn("..(.)", false, null)
)
)
.metric(new InvertedTopNMetricSpec(new DimensionTopNMetricSpec("p", StringComparators.LEXICOGRAPHIC)))
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "o",
"rows", 18L,
"index", 2231.876812D,
"addRowsIndexConstant", 2250.876812D,
"uniques", QueryRunnerTestHelper.UNIQUES_9
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "f",
"rows", 4L,
"index", 4875.669692D,
"addRowsIndexConstant", 4880.669692D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNWithNullProducingDimExtractionFn()
{
final ExtractionFn nullStringDimExtraction = new DimExtractionFn()
{
@Override
public byte[] getCacheKey()
{
return new byte[]{(byte) 0xFF};
}
@Override
public String apply(String dimValue)
{
return "total_market".equals(dimValue) ? null : dimValue;
}
@Override
public boolean preservesOrdering()
{
return false;
}
@Override
public ExtractionType getExtractionType()
{
return ExtractionType.MANY_TO_ONE;
}
};
final TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.metric("rows")
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.dimension(
new ExtractionDimensionSpec(
QueryRunnerTestHelper.MARKET_DIMENSION,
QueryRunnerTestHelper.MARKET_DIMENSION,
nullStringDimExtraction
)
)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.asList(
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "spot",
"rows", 18L,
"index", 2231.876812D,
"addRowsIndexConstant", 2250.876812D,
"uniques", QueryRunnerTestHelper.UNIQUES_9
),
QueryRunnerTestHelper.orderedMap(
QueryRunnerTestHelper.MARKET_DIMENSION, null,
"rows", 4L,
"index", 5351.814783D,
"addRowsIndexConstant", 5356.814783D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "upfront",
"rows", 4L,
"index", 4875.669692D,
"addRowsIndexConstant", 4880.669692D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
/**
* This test exists only to show what the current behavior is and not necessarily to define that this is
* correct behavior. In fact, the behavior when returning the empty string from a DimExtractionFn is, by
* contract, undefined, so this can do anything.
*/
public void testTopNWithEmptyStringProducingDimExtractionFn()
{
final ExtractionFn emptyStringDimExtraction = new DimExtractionFn()
{
@Override
public byte[] getCacheKey()
{
return new byte[]{(byte) 0xFF};
}
@Override
public String apply(String dimValue)
{
return "total_market".equals(dimValue) ? "" : dimValue;
}
@Override
public boolean preservesOrdering()
{
return false;
}
@Override
public ExtractionType getExtractionType()
{
return ExtractionType.MANY_TO_ONE;
}
};
final TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.metric("rows")
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.dimension(
new ExtractionDimensionSpec(
QueryRunnerTestHelper.MARKET_DIMENSION,
QueryRunnerTestHelper.MARKET_DIMENSION,
emptyStringDimExtraction
)
)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.asList(
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "spot",
"rows", 18L,
"index", 2231.876812D,
"addRowsIndexConstant", 2250.876812D,
"uniques", QueryRunnerTestHelper.UNIQUES_9
),
QueryRunnerTestHelper.orderedMap(
QueryRunnerTestHelper.MARKET_DIMENSION, "",
"rows", 4L,
"index", 5351.814783D,
"addRowsIndexConstant", 5356.814783D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "upfront",
"rows", 4L,
"index", 4875.669692D,
"addRowsIndexConstant", 4880.669692D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testInvertedTopNQuery()
{
TopNQuery query =
new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric(new InvertedTopNMetricSpec(new NumericTopNMetricSpec(QueryRunnerTestHelper.INDEX_METRIC)))
.threshold(3)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "spot",
"rows", 18L,
"index", 2231.876812D,
"addRowsIndexConstant", 2250.876812D,
"uniques", QueryRunnerTestHelper.UNIQUES_9
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "upfront",
"rows", 4L,
"index", 4875.669692D,
"addRowsIndexConstant", 4880.669692D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
),
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "total_market",
"rows", 4L,
"index", 5351.814783D,
"addRowsIndexConstant", 5356.814783D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNQueryByComplexMetric()
{
ImmutableList<DimensionSpec> aggregatorDimensionSpecs = ImmutableList.of(new DefaultDimensionSpec(
QueryRunnerTestHelper.QUALITY_DIMENSION,
QueryRunnerTestHelper.QUALITY_DIMENSION
));
TopNQuery query =
new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric(new NumericTopNMetricSpec("numVals"))
.threshold(10)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(duplicateAggregators(
new CardinalityAggregatorFactory("numVals", aggregatorDimensionSpecs, false),
new CardinalityAggregatorFactory("numVals1", aggregatorDimensionSpecs, false)
))
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
withDuplicateResults(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
"market", "spot",
"numVals", 9.019833517963864d
),
ImmutableMap.of(
"market", "total_market",
"numVals", 2.000977198748901d
),
ImmutableMap.of(
"market", "upfront",
"numVals", 2.000977198748901d
)
),
"numVals",
"numVals1"
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNQueryCardinalityAggregatorWithExtractionFn()
{
String helloJsFn = "function(str) { return 'hello' }";
ExtractionFn helloFn = new JavaScriptExtractionFn(helloJsFn, false, JavaScriptConfig.getEnabledInstance());
DimensionSpec dimSpec = new ExtractionDimensionSpec(QueryRunnerTestHelper.MARKET_DIMENSION,
QueryRunnerTestHelper.MARKET_DIMENSION,
helloFn);
ImmutableList<DimensionSpec> aggregatorDimensionSpecs = ImmutableList.of(new ExtractionDimensionSpec(
QueryRunnerTestHelper.QUALITY_DIMENSION,
QueryRunnerTestHelper.QUALITY_DIMENSION,
helloFn
));
TopNQuery query =
new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(dimSpec)
.metric(new NumericTopNMetricSpec("numVals"))
.threshold(10)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(duplicateAggregators(
new CardinalityAggregatorFactory("numVals", aggregatorDimensionSpecs, false),
new CardinalityAggregatorFactory("numVals1", aggregatorDimensionSpecs, false)
))
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
withDuplicateResults(
Collections.singletonList(
ImmutableMap.of(
"market", "hello",
"numVals", 1.0002442201269182d
)
),
"numVals",
"numVals1"
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNDependentPostAgg()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric(QueryRunnerTestHelper.dependentPostAggMetric)
.threshold(4)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(
Lists.newArrayList(
Iterables.concat(
commonAggregators,
Lists.newArrayList(
new DoubleMaxAggregatorFactory("maxIndex", "index"),
new DoubleMinAggregatorFactory("minIndex", "index")
)
)
)
)
.postAggregators(
QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT,
QueryRunnerTestHelper.DEPENDENT_POST_AGG,
QueryRunnerTestHelper.hyperUniqueFinalizingPostAgg
)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put(QueryRunnerTestHelper.MARKET_DIMENSION, "total_market")
.put("rows", 186L)
.put("index", 215679.82879638672D)
.put("addRowsIndexConstant", 215866.82879638672D)
.put(QueryRunnerTestHelper.dependentPostAggMetric, 216053.82879638672D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_2)
.put("maxIndex", 1743.92175D)
.put("minIndex", 792.3260498046875D)
.put(
QueryRunnerTestHelper.HYPER_UNIQUE_FINALIZING_POST_AGG_METRIC,
QueryRunnerTestHelper.UNIQUES_2 + 1.0
)
.build(),
ImmutableMap.<String, Object>builder()
.put(QueryRunnerTestHelper.MARKET_DIMENSION, "upfront")
.put("rows", 186L)
.put("index", 192046.1060180664D)
.put("addRowsIndexConstant", 192233.1060180664D)
.put(QueryRunnerTestHelper.dependentPostAggMetric, 192420.1060180664D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_2)
.put("maxIndex", 1870.061029D)
.put("minIndex", 545.9906005859375D)
.put(
QueryRunnerTestHelper.HYPER_UNIQUE_FINALIZING_POST_AGG_METRIC,
QueryRunnerTestHelper.UNIQUES_2 + 1.0
)
.build(),
ImmutableMap.<String, Object>builder()
.put(QueryRunnerTestHelper.MARKET_DIMENSION, "spot")
.put("rows", 837L)
.put("index", 95606.57232284546D)
.put("addRowsIndexConstant", 96444.57232284546D)
.put(QueryRunnerTestHelper.dependentPostAggMetric, 97282.57232284546D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_9)
.put(
QueryRunnerTestHelper.HYPER_UNIQUE_FINALIZING_POST_AGG_METRIC,
QueryRunnerTestHelper.UNIQUES_9 + 1.0
)
.put("maxIndex", 277.273533D)
.put("minIndex", 59.02102279663086D)
.build()
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNBySegmentResults()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric(QueryRunnerTestHelper.dependentPostAggMetric)
.threshold(4)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(
Lists.newArrayList(
Iterables.concat(
commonAggregators,
Lists.newArrayList(
new DoubleMaxAggregatorFactory("maxIndex", "index"),
new DoubleMinAggregatorFactory("minIndex", "index")
)
)
)
)
.postAggregators(
QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT,
QueryRunnerTestHelper.DEPENDENT_POST_AGG
)
.context(ImmutableMap.of(QueryContexts.FINALIZE_KEY, true, QueryContexts.BY_SEGMENT_KEY, true))
.build();
TopNResultValue topNResult = new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put(QueryRunnerTestHelper.MARKET_DIMENSION, "total_market")
.put("rows", 186L)
.put("index", 215679.82879638672D)
.put("addRowsIndexConstant", 215866.82879638672D)
.put(QueryRunnerTestHelper.dependentPostAggMetric, 216053.82879638672D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_2)
.put("maxIndex", 1743.92175D)
.put("minIndex", 792.3260498046875D)
.build(),
ImmutableMap.<String, Object>builder()
.put(QueryRunnerTestHelper.MARKET_DIMENSION, "upfront")
.put("rows", 186L)
.put("index", 192046.1060180664D)
.put("addRowsIndexConstant", 192233.1060180664D)
.put(QueryRunnerTestHelper.dependentPostAggMetric, 192420.1060180664D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_2)
.put("maxIndex", 1870.061029D)
.put("minIndex", 545.9906005859375D)
.build(),
ImmutableMap.<String, Object>builder()
.put(QueryRunnerTestHelper.MARKET_DIMENSION, "spot")
.put("rows", 837L)
.put("index", 95606.57232284546D)
.put("addRowsIndexConstant", 96444.57232284546D)
.put(QueryRunnerTestHelper.dependentPostAggMetric, 97282.57232284546D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_9)
.put("maxIndex", 277.273533D)
.put("minIndex", 59.02102279663086D)
.build()
)
);
@SuppressWarnings("unused") // TODO: fix this test
List<Result<BySegmentResultValueClass<Result<TopNResultValue>>>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new BySegmentResultValueClass<>(
Collections.singletonList(new Result<>(DateTimes.of("2011-01-12T00:00:00.000Z"), topNResult)),
QueryRunnerTestHelper.SEGMENT_ID.toString(),
Intervals.of("1970-01-01T00:00:00.000Z/2020-01-01T00:00:00.000Z")
)
)
);
Sequence<Result<TopNResultValue>> results = runWithMerge(query);
for (Result<TopNResultValue> result : results.toList()) {
Assert.assertEquals(result.getValue(), result.getValue()); // TODO: fix this test
}
}
@Test
public void testTopNWithTimeColumn()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(
QueryRunnerTestHelper.ROWS_COUNT,
QueryRunnerTestHelper.JS_COUNT_IF_TIME_GREATER_THAN,
QueryRunnerTestHelper.TIME_LONG_SUM
)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric("ntimestamps")
.threshold(3)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
"market", "spot",
"rows",
18L,
"ntimestamps",
9.0,
"sumtime",
23429865600000L
),
ImmutableMap.of(
"market", "total_market",
"rows",
4L,
"ntimestamps",
2.0,
"sumtime",
5206636800000L
),
ImmutableMap.of(
"market", "upfront",
"rows",
4L,
"ntimestamps",
2.0,
"sumtime",
5206636800000L
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNTimeExtraction()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(
new ExtractionDimensionSpec(
ColumnHolder.TIME_COLUMN_NAME,
"dayOfWeek",
new TimeFormatExtractionFn("EEEE", null, null, null, false)
)
)
.metric("index")
.threshold(2)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(
QueryRunnerTestHelper.ROWS_COUNT,
QueryRunnerTestHelper.INDEX_DOUBLE_SUM
)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
"dayOfWeek", "Wednesday",
"rows", 182L,
"index", 76010.28100585938,
"addRowsIndexConstant", 76193.28100585938
),
ImmutableMap.of(
"dayOfWeek", "Thursday",
"rows", 182L,
"index", 75203.26300811768,
"addRowsIndexConstant", 75386.26300811768
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNOverNullDimension()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension("null_column")
.metric(QueryRunnerTestHelper.INDEX_METRIC)
.threshold(4)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(
Lists.newArrayList(
Iterables.concat(
commonAggregators,
Lists.newArrayList(
new DoubleMaxAggregatorFactory("maxIndex", "index"),
new DoubleMinAggregatorFactory("minIndex", "index")
)
)
)
)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
Map<String, Object> map = new HashMap<>();
map.put("null_column", null);
map.put("rows", 1209L);
map.put("index", 503332.5071372986D);
map.put("addRowsIndexConstant", 504542.5071372986D);
map.put("uniques", QueryRunnerTestHelper.UNIQUES_9);
map.put("maxIndex", 1870.061029D);
map.put("minIndex", 59.02102279663086D);
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Collections.singletonList(
map
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNOverNullDimensionWithFilter()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension("null_column")
.filters(
new SelectorDimFilter("null_column", null, null)
)
.metric(QueryRunnerTestHelper.INDEX_METRIC)
.threshold(4)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(
Lists.newArrayList(
Iterables.concat(
commonAggregators,
Lists.newArrayList(
new DoubleMaxAggregatorFactory("maxIndex", "index"),
new DoubleMinAggregatorFactory("minIndex", "index")
)
)
)
)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
Map<String, Object> map = new HashMap<>();
map.put("null_column", null);
map.put("rows", 1209L);
map.put("index", 503332.5071372986D);
map.put("addRowsIndexConstant", 504542.5071372986D);
map.put("uniques", QueryRunnerTestHelper.UNIQUES_9);
map.put("maxIndex", 1870.061029D);
map.put("minIndex", 59.02102279663086D);
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Collections.singletonList(
map
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNOverPartialNullDimension()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(Granularities.ALL)
.dimension("partial_null_column")
.metric(QueryRunnerTestHelper.UNIQUE_METRIC)
.threshold(1000)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.build();
Map<String, Object> map = new HashMap<>();
map.put("partial_null_column", null);
map.put("rows", 22L);
map.put("index", 7583.691513061523D);
map.put("uniques", QueryRunnerTestHelper.UNIQUES_9);
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.asList(
map,
ImmutableMap.<String, Object>of(
"partial_null_column", "value",
"rows", 4L,
"index", 4875.669692D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNOverPartialNullDimensionWithFilterOnNullValue()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(Granularities.ALL)
.dimension("partial_null_column")
.metric(QueryRunnerTestHelper.UNIQUE_METRIC)
.filters(new SelectorDimFilter("partial_null_column", null, null))
.threshold(1000)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.build();
Map<String, Object> map = new HashMap<>();
map.put("partial_null_column", null);
map.put("rows", 22L);
map.put("index", 7583.691513061523D);
map.put("uniques", QueryRunnerTestHelper.UNIQUES_9);
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Collections.singletonList(
map
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNOverPartialNullDimensionWithFilterOnNOTNullValue()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(Granularities.ALL)
.dimension("partial_null_column")
.metric(QueryRunnerTestHelper.UNIQUE_METRIC)
.filters(new SelectorDimFilter("partial_null_column", "value", null))
.threshold(1000)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Collections.singletonList(
ImmutableMap.<String, Object>of(
"partial_null_column", "value",
"rows", 4L,
"index", 4875.669692D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testAlphaNumericTopNWithNullPreviousStop()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(Granularities.ALL)
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric(new DimensionTopNMetricSpec(null, StringComparators.ALPHANUMERIC))
.threshold(2)
.intervals(QueryRunnerTestHelper.SECOND_ONLY)
.aggregators(duplicateAggregators(
QueryRunnerTestHelper.ROWS_COUNT,
new CountAggregatorFactory("rows1")
))
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-02T00:00:00.000Z"),
new TopNResultValue(
withDuplicateResults(
Arrays.asList(
ImmutableMap.of(
"market", "spot",
"rows", 9L
),
ImmutableMap.of(
"market", "total_market",
"rows", 2L
)
),
"rows",
"rows1"
)
)
)
);
TestHelper.assertExpectedResults(expectedResults, runner.run(QueryPlus.wrap(query)));
}
@Test
public void testNumericDimensionTopNWithNullPreviousStop()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(Granularities.ALL)
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric(new DimensionTopNMetricSpec(null, StringComparators.NUMERIC))
.threshold(2)
.intervals(QueryRunnerTestHelper.SECOND_ONLY)
.aggregators(duplicateAggregators(
QueryRunnerTestHelper.ROWS_COUNT,
new CountAggregatorFactory("rows1")
))
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-02T00:00:00.000Z"),
new TopNResultValue(
withDuplicateResults(
Arrays.asList(
ImmutableMap.of(
"market", "spot",
"rows", 9L
),
ImmutableMap.of(
"market", "total_market",
"rows", 2L
)
),
"rows",
"rows1"
)
)
)
);
TestHelper.assertExpectedResults(expectedResults, runner.run(QueryPlus.wrap(query)));
}
@Test
public void testTopNWithExtractionFilter()
{
Map<String, String> extractionMap = new HashMap<>();
extractionMap.put("spot", "spot0");
MapLookupExtractor mapLookupExtractor = new MapLookupExtractor(extractionMap, false);
LookupExtractionFn lookupExtractionFn = new LookupExtractionFn(mapLookupExtractor, false, null, true, false);
TopNQuery query = new TopNQueryBuilder().dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric("rows")
.threshold(3)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.filters(
new ExtractionDimFilter(
QueryRunnerTestHelper.MARKET_DIMENSION,
"spot0",
lookupExtractionFn,
null
)
)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Collections.<Map<String, Object>>singletonList(
ImmutableMap.of(
QueryRunnerTestHelper.MARKET_DIMENSION, "spot",
"rows", 18L,
"index", 2231.876812D,
"addRowsIndexConstant", 2250.876812D,
"uniques", QueryRunnerTestHelper.UNIQUES_9
)
)
)
)
);
assertExpectedResults(expectedResults, query);
// Assert the optimization path as well
final Sequence<Result<TopNResultValue>> retval = runWithPreMergeAndMerge(query);
TestHelper.assertExpectedResults(expectedResults, retval);
}
@Test
public void testTopNWithExtractionFilterAndFilteredAggregatorCaseNoExistingValue()
{
Map<String, String> extractionMap = new HashMap<>();
MapLookupExtractor mapLookupExtractor = new MapLookupExtractor(extractionMap, false);
LookupExtractionFn lookupExtractionFn;
if (NullHandling.replaceWithDefault()) {
lookupExtractionFn = new LookupExtractionFn(mapLookupExtractor, false, null, true, false);
extractionMap.put("", "NULL");
} else {
lookupExtractionFn = new LookupExtractionFn(mapLookupExtractor, false, "NULL", true, false);
}
DimFilter extractionFilter = new ExtractionDimFilter("null_column", "NULL", lookupExtractionFn, null);
TopNQueryBuilder topNQueryBuilder = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension("null_column")
.metric(QueryRunnerTestHelper.INDEX_METRIC)
.threshold(4)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(
Lists.newArrayList(
Iterables.concat(
commonAggregators,
Lists.newArrayList(
new FilteredAggregatorFactory(
new DoubleMaxAggregatorFactory("maxIndex", "index"),
extractionFilter
),
new DoubleMinAggregatorFactory("minIndex", "index")
)
)
)
)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT);
TopNQuery topNQueryWithNULLValueExtraction = topNQueryBuilder
.filters(extractionFilter)
.build();
Map<String, Object> map = new HashMap<>();
map.put("null_column", null);
map.put("rows", 1209L);
map.put("index", 503332.5071372986D);
map.put("addRowsIndexConstant", 504542.5071372986D);
map.put("uniques", QueryRunnerTestHelper.UNIQUES_9);
map.put("maxIndex", 1870.061029D);
map.put("minIndex", 59.02102279663086D);
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Collections.singletonList(
map
)
)
)
);
assertExpectedResults(expectedResults, topNQueryWithNULLValueExtraction);
}
private Sequence<Result<TopNResultValue>> runWithPreMergeAndMerge(TopNQuery query)
{
return runWithMerge(query, ResponseContext.createEmpty());
}
@Test
public void testTopNWithExtractionFilterNoExistingValue()
{
Map<String, String> extractionMap = new HashMap<>();
MapLookupExtractor mapLookupExtractor = new MapLookupExtractor(extractionMap, false);
LookupExtractionFn lookupExtractionFn;
if (NullHandling.replaceWithDefault()) {
lookupExtractionFn = new LookupExtractionFn(mapLookupExtractor, false, null, true, true);
extractionMap.put("", "NULL");
} else {
extractionMap.put("", "NOT_USED");
lookupExtractionFn = new LookupExtractionFn(mapLookupExtractor, false, "NULL", true, true);
}
DimFilter extractionFilter = new ExtractionDimFilter("null_column", "NULL", lookupExtractionFn, null);
TopNQueryBuilder topNQueryBuilder = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension("null_column")
.metric(QueryRunnerTestHelper.INDEX_METRIC)
.threshold(4)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(
Lists.newArrayList(
Iterables.concat(
commonAggregators,
Lists.newArrayList(
new FilteredAggregatorFactory(
new DoubleMaxAggregatorFactory("maxIndex", "index"),
extractionFilter
),
new DoubleMinAggregatorFactory("minIndex", "index")
)
)
)
)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT);
TopNQuery topNQueryWithNULLValueExtraction = topNQueryBuilder
.filters(extractionFilter)
.build();
Map<String, Object> map = new HashMap<>();
map.put("null_column", null);
map.put("rows", 1209L);
map.put("index", 503332.5071372986D);
map.put("addRowsIndexConstant", 504542.5071372986D);
map.put("uniques", QueryRunnerTestHelper.UNIQUES_9);
map.put("maxIndex", 1870.061029D);
map.put("minIndex", 59.02102279663086D);
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Collections.singletonList(
map
)
)
)
);
assertExpectedResults(expectedResults, topNQueryWithNULLValueExtraction);
// Assert the optimization path as well
final Sequence<Result<TopNResultValue>> retval = runWithPreMergeAndMerge(topNQueryWithNULLValueExtraction);
TestHelper.assertExpectedResults(expectedResults, retval);
}
@Test
public void testFullOnTopNFloatColumn()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(new DefaultDimensionSpec(QueryRunnerTestHelper.INDEX_METRIC, "index_alias", ValueType.FLOAT))
.metric(QueryRunnerTestHelper.INDEX_METRIC)
.threshold(4)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(
Lists.newArrayList(
Iterables.concat(
commonAggregators,
Lists.newArrayList(
new DoubleMaxAggregatorFactory("maxIndex", "index"),
new DoubleMinAggregatorFactory("minIndex", "index")
)
)
)
)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("index_alias", 1000.0f)
.put(QueryRunnerTestHelper.INDEX_METRIC, 2000.0D)
.put("rows", 2L)
.put("addRowsIndexConstant", 2003.0D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_2)
.put("maxIndex", 1000.0D)
.put("minIndex", 1000.0D)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 1870.061029f)
.put(QueryRunnerTestHelper.INDEX_METRIC, 1870.061029D)
.put("rows", 1L)
.put("addRowsIndexConstant", 1872.06103515625D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 1870.061029D)
.put("minIndex", 1870.061029D)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 1862.737933f)
.put(QueryRunnerTestHelper.INDEX_METRIC, 1862.737933D)
.put("rows", 1L)
.put("addRowsIndexConstant", 1864.7379150390625D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 1862.737933D)
.put("minIndex", 1862.737933D)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 1743.92175f)
.put(QueryRunnerTestHelper.INDEX_METRIC, 1743.92175D)
.put("rows", 1L)
.put("addRowsIndexConstant", 1745.9217529296875D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 1743.92175D)
.put("minIndex", 1743.92175D)
.build()
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testFullOnTopNFloatColumnWithExFn()
{
String jsFn = "function(str) { return 'super-' + str; }";
ExtractionFn jsExtractionFn = new JavaScriptExtractionFn(jsFn, false, JavaScriptConfig.getEnabledInstance());
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(new ExtractionDimensionSpec(QueryRunnerTestHelper.INDEX_METRIC, "index_alias", jsExtractionFn))
.metric(QueryRunnerTestHelper.INDEX_METRIC)
.threshold(4)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(
Lists.newArrayList(
Iterables.concat(
commonAggregators,
Lists.newArrayList(
new DoubleMaxAggregatorFactory("maxIndex", "index"),
new DoubleMinAggregatorFactory("minIndex", "index")
)
)
)
)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("index_alias", "super-1000")
.put(QueryRunnerTestHelper.INDEX_METRIC, 2000.0D)
.put("rows", 2L)
.put("addRowsIndexConstant", 2003.0D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_2)
.put("maxIndex", 1000.0D)
.put("minIndex", 1000.0D)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", "super-1870.061029")
.put(QueryRunnerTestHelper.INDEX_METRIC, 1870.061029D)
.put("rows", 1L)
.put("addRowsIndexConstant", 1872.06103515625D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 1870.061029D)
.put("minIndex", 1870.061029D)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", "super-1862.737933")
.put(QueryRunnerTestHelper.INDEX_METRIC, 1862.737933D)
.put("rows", 1L)
.put("addRowsIndexConstant", 1864.7379150390625D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 1862.737933D)
.put("minIndex", 1862.737933D)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", "super-1743.92175")
.put(QueryRunnerTestHelper.INDEX_METRIC, 1743.92175D)
.put("rows", 1L)
.put("addRowsIndexConstant", 1745.9217529296875D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 1743.92175D)
.put("minIndex", 1743.92175D)
.build()
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testFullOnTopNFloatColumnAsString()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(new DefaultDimensionSpec("qualityFloat", "qf_alias"))
.metric("maxIndex")
.threshold(4)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(
Lists.newArrayList(
Iterables.concat(
commonAggregators,
Lists.newArrayList(
new DoubleMaxAggregatorFactory("maxIndex", "index"),
new DoubleMinAggregatorFactory("minIndex", "index")
)
)
)
)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("qf_alias", "14000.0")
.put(QueryRunnerTestHelper.INDEX_METRIC, 217725.41940800005D)
.put("rows", 279L)
.put("addRowsIndexConstant", 218005.41940800005D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 1870.061029D)
.put("minIndex", 91.270553D)
.build(),
ImmutableMap.<String, Object>builder()
.put("qf_alias", "16000.0")
.put(QueryRunnerTestHelper.INDEX_METRIC, 210865.67977600006D)
.put("rows", 279L)
.put("addRowsIndexConstant", 211145.67977600006D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 1862.737933D)
.put("minIndex", 99.284525D)
.build(),
ImmutableMap.<String, Object>builder()
.put("qf_alias", "10000.0")
.put(QueryRunnerTestHelper.INDEX_METRIC, 12270.807093D)
.put("rows", 93L)
.put("addRowsIndexConstant", 12364.807093D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 277.273533D)
.put("minIndex", 71.315931D)
.build(),
ImmutableMap.<String, Object>builder()
.put("qf_alias", "12000.0")
.put(QueryRunnerTestHelper.INDEX_METRIC, 12086.472791D)
.put("rows", 93L)
.put("addRowsIndexConstant", 12180.472791D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 193.787574D)
.put("minIndex", 84.710523D)
.build()
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testFullOnTopNLongColumn()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(new DefaultDimensionSpec("qualityLong", "ql_alias", ValueType.LONG))
.metric("maxIndex")
.threshold(4)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(
Lists.newArrayList(
Iterables.concat(
commonAggregators,
Lists.newArrayList(
new DoubleMaxAggregatorFactory("maxIndex", "index"),
new DoubleMinAggregatorFactory("minIndex", "index")
)
)
)
)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("ql_alias", 1400L)
.put(QueryRunnerTestHelper.INDEX_METRIC, 217725.41940800005D)
.put("rows", 279L)
.put("addRowsIndexConstant", 218005.41940800005D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 1870.061029D)
.put("minIndex", 91.270553D)
.build(),
ImmutableMap.<String, Object>builder()
.put("ql_alias", 1600L)
.put(QueryRunnerTestHelper.INDEX_METRIC, 210865.67977600006D)
.put("rows", 279L)
.put("addRowsIndexConstant", 211145.67977600006D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 1862.737933D)
.put("minIndex", 99.284525D)
.build(),
ImmutableMap.<String, Object>builder()
.put("ql_alias", 1000L)
.put(QueryRunnerTestHelper.INDEX_METRIC, 12270.807093D)
.put("rows", 93L)
.put("addRowsIndexConstant", 12364.807093D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 277.273533D)
.put("minIndex", 71.315931D)
.build(),
ImmutableMap.<String, Object>builder()
.put("ql_alias", 1200L)
.put(QueryRunnerTestHelper.INDEX_METRIC, 12086.472791D)
.put("rows", 93L)
.put("addRowsIndexConstant", 12180.472791D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 193.787574D)
.put("minIndex", 84.710523D)
.build()
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testFullOnTopNLongVirtualColumn()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(new DefaultDimensionSpec("ql_expr", "ql_alias", ValueType.LONG))
.metric("maxIndex")
.threshold(4)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(
Lists.newArrayList(
Iterables.concat(
commonAggregators,
Lists.newArrayList(
new DoubleMaxAggregatorFactory("maxIndex", "index"),
new DoubleMinAggregatorFactory("minIndex", "index")
)
)
)
)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.virtualColumns(new ExpressionVirtualColumn("ql_expr", "qualityLong", ValueType.LONG, ExprMacroTable.nil()))
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("ql_alias", 1400L)
.put(QueryRunnerTestHelper.INDEX_METRIC, 217725.41940800005D)
.put("rows", 279L)
.put("addRowsIndexConstant", 218005.41940800005D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 1870.061029D)
.put("minIndex", 91.270553D)
.build(),
ImmutableMap.<String, Object>builder()
.put("ql_alias", 1600L)
.put(QueryRunnerTestHelper.INDEX_METRIC, 210865.67977600006D)
.put("rows", 279L)
.put("addRowsIndexConstant", 211145.67977600006D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 1862.737933D)
.put("minIndex", 99.284525D)
.build(),
ImmutableMap.<String, Object>builder()
.put("ql_alias", 1000L)
.put(QueryRunnerTestHelper.INDEX_METRIC, 12270.807093D)
.put("rows", 93L)
.put("addRowsIndexConstant", 12364.807093D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 277.273533D)
.put("minIndex", 71.315931D)
.build(),
ImmutableMap.<String, Object>builder()
.put("ql_alias", 1200L)
.put(QueryRunnerTestHelper.INDEX_METRIC, 12086.472791D)
.put("rows", 93L)
.put("addRowsIndexConstant", 12180.472791D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 193.787574D)
.put("minIndex", 84.710523D)
.build()
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testTopNStringVirtualColumn()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.virtualColumns(
new ExpressionVirtualColumn(
"vc",
"market + ' ' + market",
ValueType.STRING,
TestExprMacroTable.INSTANCE
)
)
.dimension("vc")
.metric("rows")
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(commonAggregators)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-01T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.of(
"vc", "spot spot",
"rows", 18L,
"index", 2231.876812D,
"addRowsIndexConstant", 2250.876812D,
"uniques", QueryRunnerTestHelper.UNIQUES_9
),
ImmutableMap.of(
"vc", "total_market total_market",
"rows", 4L,
"index", 5351.814783D,
"addRowsIndexConstant", 5356.814783D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
),
ImmutableMap.of(
"vc", "upfront upfront",
"rows", 4L,
"index", 4875.669692D,
"addRowsIndexConstant", 4880.669692D,
"uniques", QueryRunnerTestHelper.UNIQUES_2
)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testFullOnTopNLongColumnWithExFn()
{
String jsFn = "function(str) { return 'super-' + str; }";
ExtractionFn jsExtractionFn = new JavaScriptExtractionFn(jsFn, false, JavaScriptConfig.getEnabledInstance());
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(new ExtractionDimensionSpec("qualityLong", "ql_alias", jsExtractionFn))
.metric("maxIndex")
.threshold(4)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(
Lists.newArrayList(
Iterables.concat(
commonAggregators,
Lists.newArrayList(
new DoubleMaxAggregatorFactory("maxIndex", "index"),
new DoubleMinAggregatorFactory("minIndex", "index")
)
)
)
)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("ql_alias", "super-1400")
.put(QueryRunnerTestHelper.INDEX_METRIC, 217725.41940800005D)
.put("rows", 279L)
.put("addRowsIndexConstant", 218005.41940800005D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 1870.061029D)
.put("minIndex", 91.270553D)
.build(),
ImmutableMap.<String, Object>builder()
.put("ql_alias", "super-1600")
.put(QueryRunnerTestHelper.INDEX_METRIC, 210865.67977600006D)
.put("rows", 279L)
.put("addRowsIndexConstant", 211145.67977600006D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 1862.737933D)
.put("minIndex", 99.284525D)
.build(),
ImmutableMap.<String, Object>builder()
.put("ql_alias", "super-1000")
.put(QueryRunnerTestHelper.INDEX_METRIC, 12270.807093D)
.put("rows", 93L)
.put("addRowsIndexConstant", 12364.807093D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 277.273533D)
.put("minIndex", 71.315931D)
.build(),
ImmutableMap.<String, Object>builder()
.put("ql_alias", "super-1200")
.put(QueryRunnerTestHelper.INDEX_METRIC, 12086.472791D)
.put("rows", 93L)
.put("addRowsIndexConstant", 12180.472791D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 193.787574D)
.put("minIndex", 84.710523D)
.build()
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testFullOnTopNLongColumnAsString()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(new DefaultDimensionSpec("qualityLong", "ql_alias"))
.metric("maxIndex")
.threshold(4)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(
Lists.newArrayList(
Iterables.concat(
commonAggregators,
Lists.newArrayList(
new DoubleMaxAggregatorFactory("maxIndex", "index"),
new DoubleMinAggregatorFactory("minIndex", "index")
)
)
)
)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("ql_alias", "1400")
.put(QueryRunnerTestHelper.INDEX_METRIC, 217725.41940800005D)
.put("rows", 279L)
.put("addRowsIndexConstant", 218005.41940800005D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 1870.061029D)
.put("minIndex", 91.270553D)
.build(),
ImmutableMap.<String, Object>builder()
.put("ql_alias", "1600")
.put(QueryRunnerTestHelper.INDEX_METRIC, 210865.67977600006D)
.put("rows", 279L)
.put("addRowsIndexConstant", 211145.67977600006D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 1862.737933D)
.put("minIndex", 99.284525D)
.build(),
ImmutableMap.<String, Object>builder()
.put("ql_alias", "1000")
.put(QueryRunnerTestHelper.INDEX_METRIC, 12270.807093D)
.put("rows", 93L)
.put("addRowsIndexConstant", 12364.807093D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 277.273533D)
.put("minIndex", 71.315931D)
.build(),
ImmutableMap.<String, Object>builder()
.put("ql_alias", "1200")
.put(QueryRunnerTestHelper.INDEX_METRIC, 12086.472791D)
.put("rows", 93L)
.put("addRowsIndexConstant", 12180.472791D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 193.787574D)
.put("minIndex", 84.710523D)
.build()
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testFullOnTopNNumericStringColumnAsLong()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(new DefaultDimensionSpec("qualityNumericString", "qns_alias", ValueType.LONG))
.metric("maxIndex")
.threshold(4)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(
Lists.newArrayList(
Iterables.concat(
commonAggregators,
Lists.newArrayList(
new DoubleMaxAggregatorFactory("maxIndex", "index"),
new DoubleMinAggregatorFactory("minIndex", "index")
)
)
)
)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("qns_alias", 140000L)
.put(QueryRunnerTestHelper.INDEX_METRIC, 217725.41940800005D)
.put("rows", 279L)
.put("addRowsIndexConstant", 218005.41940800005D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 1870.061029D)
.put("minIndex", 91.270553D)
.build(),
ImmutableMap.<String, Object>builder()
.put("qns_alias", 160000L)
.put(QueryRunnerTestHelper.INDEX_METRIC, 210865.67977600006D)
.put("rows", 279L)
.put("addRowsIndexConstant", 211145.67977600006D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 1862.737933D)
.put("minIndex", 99.284525D)
.build(),
ImmutableMap.<String, Object>builder()
.put("qns_alias", 100000L)
.put(QueryRunnerTestHelper.INDEX_METRIC, 12270.807093D)
.put("rows", 93L)
.put("addRowsIndexConstant", 12364.807093D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 277.273533D)
.put("minIndex", 71.315931D)
.build(),
ImmutableMap.<String, Object>builder()
.put("qns_alias", 120000L)
.put(QueryRunnerTestHelper.INDEX_METRIC, 12086.472791D)
.put("rows", 93L)
.put("addRowsIndexConstant", 12180.472791D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 193.787574D)
.put("minIndex", 84.710523D)
.build()
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testFullOnTopNNumericStringColumnAsFloat()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(new DefaultDimensionSpec("qualityNumericString", "qns_alias", ValueType.FLOAT))
.metric("maxIndex")
.threshold(4)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(
Lists.newArrayList(
Iterables.concat(
commonAggregators,
Lists.newArrayList(
new DoubleMaxAggregatorFactory("maxIndex", "index"),
new DoubleMinAggregatorFactory("minIndex", "index")
)
)
)
)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("qns_alias", 140000.0f)
.put(QueryRunnerTestHelper.INDEX_METRIC, 217725.41940800005D)
.put("rows", 279L)
.put("addRowsIndexConstant", 218005.41940800005D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 1870.061029D)
.put("minIndex", 91.270553D)
.build(),
ImmutableMap.<String, Object>builder()
.put("qns_alias", 160000.0f)
.put(QueryRunnerTestHelper.INDEX_METRIC, 210865.67977600006D)
.put("rows", 279L)
.put("addRowsIndexConstant", 211145.67977600006D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 1862.737933D)
.put("minIndex", 99.284525D)
.build(),
ImmutableMap.<String, Object>builder()
.put("qns_alias", 100000.0f)
.put(QueryRunnerTestHelper.INDEX_METRIC, 12270.807093D)
.put("rows", 93L)
.put("addRowsIndexConstant", 12364.807093D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 277.273533D)
.put("minIndex", 71.315931D)
.build(),
ImmutableMap.<String, Object>builder()
.put("qns_alias", 120000.0f)
.put(QueryRunnerTestHelper.INDEX_METRIC, 12086.472791D)
.put("rows", 93L)
.put("addRowsIndexConstant", 12180.472791D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 193.787574D)
.put("minIndex", 84.710523D)
.build()
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testFullOnTopNLongTimeColumn()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(new DefaultDimensionSpec(ColumnHolder.TIME_COLUMN_NAME, "time_alias", ValueType.LONG))
.metric("maxIndex")
.threshold(4)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(
Lists.newArrayList(
Iterables.concat(
commonAggregators,
Lists.newArrayList(
new DoubleMaxAggregatorFactory("maxIndex", "index"),
new DoubleMinAggregatorFactory("minIndex", "index")
)
)
)
)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("time_alias", 1296345600000L)
.put(QueryRunnerTestHelper.INDEX_METRIC, 5497.331253051758D)
.put("rows", 13L)
.put("addRowsIndexConstant", 5511.331253051758D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_9)
.put("maxIndex", 1870.061029D)
.put("minIndex", 97.02391052246094D)
.build(),
ImmutableMap.<String, Object>builder()
.put("time_alias", 1298678400000L)
.put(QueryRunnerTestHelper.INDEX_METRIC, 6541.463027954102D)
.put("rows", 13L)
.put("addRowsIndexConstant", 6555.463027954102D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_9)
.put("maxIndex", 1862.737933D)
.put("minIndex", 83.099365234375D)
.build(),
ImmutableMap.<String, Object>builder()
.put("time_alias", 1301529600000L)
.put(QueryRunnerTestHelper.INDEX_METRIC, 6814.467971801758D)
.put("rows", 13L)
.put("addRowsIndexConstant", 6828.467971801758D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_9)
.put("maxIndex", 1734.27490234375D)
.put("minIndex", 93.39083862304688D)
.build(),
ImmutableMap.<String, Object>builder()
.put("time_alias", 1294876800000L)
.put(QueryRunnerTestHelper.INDEX_METRIC, 6077.949111938477D)
.put("rows", 13L)
.put("addRowsIndexConstant", 6091.949111938477D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_9)
.put("maxIndex", 1689.0128173828125D)
.put("minIndex", 94.87471008300781D)
.build()
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testSortOnDoubleAsLong()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(new DefaultDimensionSpec("index", "index_alias", ValueType.LONG))
.metric(new DimensionTopNMetricSpec(null, StringComparators.NUMERIC))
.threshold(4)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("index_alias", 59L)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 67L)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 68L)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 69L)
.build()
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testSortOnTimeAsLong()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(new DefaultDimensionSpec("__time", "__time_alias", ValueType.LONG))
.metric(new DimensionTopNMetricSpec(null, StringComparators.NUMERIC))
.threshold(4)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("__time_alias", DateTimes.of("2011-01-12T00:00:00.000Z").getMillis())
.build(),
ImmutableMap.<String, Object>builder()
.put("__time_alias", DateTimes.of("2011-01-13T00:00:00.000Z").getMillis())
.build(),
ImmutableMap.<String, Object>builder()
.put("__time_alias", DateTimes.of("2011-01-14T00:00:00.000Z").getMillis())
.build(),
ImmutableMap.<String, Object>builder()
.put("__time_alias", DateTimes.of("2011-01-15T00:00:00.000Z").getMillis())
.build()
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testSortOnStringAsDouble()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(new DefaultDimensionSpec("market", "alias", ValueType.DOUBLE))
.metric(new DimensionTopNMetricSpec(null, StringComparators.NUMERIC))
.threshold(4)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.build();
final Map<String, Object> nullAliasMap = new HashMap<>();
nullAliasMap.put("alias", null);
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(Collections.singletonList(nullAliasMap))
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testSortOnDoubleAsDouble()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(new DefaultDimensionSpec("index", "index_alias", ValueType.DOUBLE))
.metric(new DimensionTopNMetricSpec(null, StringComparators.NUMERIC))
.threshold(4)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("index_alias", 59.021022d)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 59.266595d)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 67.73117d)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 68.573162d)
.build()
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testFullOnTopNLongTimeColumnWithExFn()
{
String jsFn = "function(str) { return 'super-' + str; }";
ExtractionFn jsExtractionFn = new JavaScriptExtractionFn(jsFn, false, JavaScriptConfig.getEnabledInstance());
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(new ExtractionDimensionSpec(ColumnHolder.TIME_COLUMN_NAME, "time_alias", jsExtractionFn))
.metric("maxIndex")
.threshold(4)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(
Lists.newArrayList(
Iterables.concat(
commonAggregators,
Lists.newArrayList(
new DoubleMaxAggregatorFactory("maxIndex", "index"),
new DoubleMinAggregatorFactory("minIndex", "index")
)
)
)
)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("time_alias", "super-1296345600000")
.put(QueryRunnerTestHelper.INDEX_METRIC, 5497.331253051758D)
.put("rows", 13L)
.put("addRowsIndexConstant", 5511.331253051758D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_9)
.put("maxIndex", 1870.061029D)
.put("minIndex", 97.02391052246094D)
.build(),
ImmutableMap.<String, Object>builder()
.put("time_alias", "super-1298678400000")
.put(QueryRunnerTestHelper.INDEX_METRIC, 6541.463027954102D)
.put("rows", 13L)
.put("addRowsIndexConstant", 6555.463027954102D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_9)
.put("maxIndex", 1862.737933D)
.put("minIndex", 83.099365234375D)
.build(),
ImmutableMap.<String, Object>builder()
.put("time_alias", "super-1301529600000")
.put(QueryRunnerTestHelper.INDEX_METRIC, 6814.467971801758D)
.put("rows", 13L)
.put("addRowsIndexConstant", 6828.467971801758D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_9)
.put("maxIndex", 1734.27490234375D)
.put("minIndex", 93.39083862304688D)
.build(),
ImmutableMap.<String, Object>builder()
.put("time_alias", "super-1294876800000")
.put(QueryRunnerTestHelper.INDEX_METRIC, 6077.949111938477D)
.put("rows", 13L)
.put("addRowsIndexConstant", 6091.949111938477D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_9)
.put("maxIndex", 1689.0128173828125D)
.put("minIndex", 94.87471008300781D)
.build()
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testFullOnTopNDimExtractionAllNulls()
{
String jsFn = "function(str) { return null; }";
ExtractionFn jsExtractionFn = new JavaScriptExtractionFn(jsFn, false, JavaScriptConfig.getEnabledInstance());
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(new ExtractionDimensionSpec(
QueryRunnerTestHelper.MARKET_DIMENSION,
QueryRunnerTestHelper.MARKET_DIMENSION,
jsExtractionFn
))
.metric(QueryRunnerTestHelper.INDEX_METRIC)
.threshold(4)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(
Lists.newArrayList(
Iterables.concat(
commonAggregators,
Lists.newArrayList(
new DoubleMaxAggregatorFactory("maxIndex", "index"),
new DoubleMinAggregatorFactory("minIndex", "index")
)
)
)
)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
Map<String, Object> expectedMap = new HashMap<>();
expectedMap.put(QueryRunnerTestHelper.MARKET_DIMENSION, null);
expectedMap.put("rows", 1209L);
expectedMap.put("index", 503332.5071372986D);
expectedMap.put("addRowsIndexConstant", 504542.5071372986D);
expectedMap.put("uniques", 9.019833517963864);
expectedMap.put("maxIndex", 1870.061029D);
expectedMap.put("minIndex", 59.02102279663086D);
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Collections.singletonList(
expectedMap
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testFullOnTopNStringOutputAsLong()
{
ExtractionFn strlenFn = StrlenExtractionFn.instance();
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(new ExtractionDimensionSpec(QueryRunnerTestHelper.QUALITY_DIMENSION, "alias", ValueType.LONG, strlenFn))
.metric("maxIndex")
.threshold(4)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(
Lists.newArrayList(
Iterables.concat(
commonAggregators,
Lists.newArrayList(
new DoubleMaxAggregatorFactory("maxIndex", "index"),
new DoubleMinAggregatorFactory("minIndex", "index")
)
)
)
)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("alias", 9L)
.put(QueryRunnerTestHelper.INDEX_METRIC, 217725.41940800005D)
.put("rows", 279L)
.put("addRowsIndexConstant", 218005.41940800005D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 1870.061029D)
.put("minIndex", 91.270553D)
.build(),
ImmutableMap.<String, Object>builder()
.put("alias", 7L)
.put(QueryRunnerTestHelper.INDEX_METRIC, 210865.67977600006D)
.put("rows", 279L)
.put("addRowsIndexConstant", 211145.67977600006D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 1862.737933D)
.put("minIndex", 99.284525D)
.build(),
ImmutableMap.<String, Object>builder()
.put("alias", 10L)
.put(QueryRunnerTestHelper.INDEX_METRIC, 20479.497562408447D)
.put("rows", 186L)
.put("addRowsIndexConstant", 20666.497562408447D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_2)
.put("maxIndex", 277.273533D)
.put("minIndex", 59.02102279663086D)
.build(),
ImmutableMap.<String, Object>builder()
.put("alias", 13L)
.put(QueryRunnerTestHelper.INDEX_METRIC, 12086.472791D)
.put("rows", 93L)
.put("addRowsIndexConstant", 12180.472791D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 193.787574D)
.put("minIndex", 84.710523D)
.build()
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testFullOnTopNNumericStringColumnWithDecoration()
{
ListFilteredDimensionSpec filteredSpec = new ListFilteredDimensionSpec(
new DefaultDimensionSpec("qualityNumericString", "qns_alias", ValueType.LONG),
Sets.newHashSet("120000", "140000", "160000"),
true
);
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(filteredSpec)
.metric("maxIndex")
.threshold(4)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(
Lists.newArrayList(
Iterables.concat(
commonAggregators,
Lists.newArrayList(
new DoubleMaxAggregatorFactory("maxIndex", "index"),
new DoubleMinAggregatorFactory("minIndex", "index")
)
)
)
)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("qns_alias", 140000L)
.put(QueryRunnerTestHelper.INDEX_METRIC, 217725.41940800005D)
.put("rows", 279L)
.put("addRowsIndexConstant", 218005.41940800005D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 1870.061029D)
.put("minIndex", 91.270553D)
.build(),
ImmutableMap.<String, Object>builder()
.put("qns_alias", 160000L)
.put(QueryRunnerTestHelper.INDEX_METRIC, 210865.67977600006D)
.put("rows", 279L)
.put("addRowsIndexConstant", 211145.67977600006D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 1862.737933D)
.put("minIndex", 99.284525D)
.build(),
ImmutableMap.<String, Object>builder()
.put("qns_alias", 120000L)
.put(QueryRunnerTestHelper.INDEX_METRIC, 12086.472791D)
.put("rows", 93L)
.put("addRowsIndexConstant", 12180.472791D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 193.787574D)
.put("minIndex", 84.710523D)
.build()
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testFullOnTopNDecorationOnNumeric()
{
ListFilteredDimensionSpec filteredSpec = new ListFilteredDimensionSpec(
new DefaultDimensionSpec("qualityLong", "ql_alias", ValueType.LONG),
Sets.newHashSet("1200", "1400", "1600"),
true
);
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(filteredSpec)
.metric("maxIndex")
.threshold(4)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(
Lists.newArrayList(
Iterables.concat(
commonAggregators,
Lists.newArrayList(
new DoubleMaxAggregatorFactory("maxIndex", "index"),
new DoubleMinAggregatorFactory("minIndex", "index")
)
)
)
)
.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("ql_alias", 1400L)
.put(QueryRunnerTestHelper.INDEX_METRIC, 217725.41940800005D)
.put("rows", 279L)
.put("addRowsIndexConstant", 218005.41940800005D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 1870.061029D)
.put("minIndex", 91.270553D)
.build(),
ImmutableMap.<String, Object>builder()
.put("ql_alias", 1600L)
.put(QueryRunnerTestHelper.INDEX_METRIC, 210865.67977600006D)
.put("rows", 279L)
.put("addRowsIndexConstant", 211145.67977600006D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 1862.737933D)
.put("minIndex", 99.284525D)
.build(),
ImmutableMap.<String, Object>builder()
.put("ql_alias", 1200L)
.put(QueryRunnerTestHelper.INDEX_METRIC, 12086.472791D)
.put("rows", 93L)
.put("addRowsIndexConstant", 12180.472791D)
.put("uniques", QueryRunnerTestHelper.UNIQUES_1)
.put("maxIndex", 193.787574D)
.put("minIndex", 84.710523D)
.build()
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testFullOnTopNWithAggsOnNumericDims()
{
List<Pair<AggregatorFactory, List<?>>> aggregations = new ArrayList<>();
aggregations.add(new Pair<>(
QueryRunnerTestHelper.ROWS_COUNT,
Longs.asList(186L, 186L, 837L)
));
Pair<AggregatorFactory, List<?>> indexAggregation = new Pair<>(
QueryRunnerTestHelper.INDEX_DOUBLE_SUM,
Doubles.asList(215679.82879638672D, 192046.1060180664D, 95606.57232284546D)
);
aggregations.add(indexAggregation);
aggregations.add(new Pair<>(
QueryRunnerTestHelper.QUALITY_UNIQUES,
Doubles.asList(QueryRunnerTestHelper.UNIQUES_2, QueryRunnerTestHelper.UNIQUES_2, QueryRunnerTestHelper.UNIQUES_9)
));
aggregations.add(new Pair<>(
new DoubleMaxAggregatorFactory("maxIndex", "index"),
Doubles.asList(1743.92175D, 1870.061029D, 277.273533D)
));
aggregations.add(new Pair<>(
new DoubleMinAggregatorFactory("minIndex", "index"),
Doubles.asList(792.3260498046875D, 545.9906005859375D, 59.02102279663086D)
));
aggregations.add(new Pair<>(
new LongSumAggregatorFactory("qlLong", "qualityLong"),
Longs.asList(279000L, 279000L, 1171800L)
));
aggregations.add(new Pair<>(
new DoubleSumAggregatorFactory("qlFloat", "qualityLong"),
Doubles.asList(279000.0, 279000.0, 1171800.0)
));
aggregations.add(new Pair<>(
new DoubleSumAggregatorFactory("qfFloat", "qualityFloat"),
Doubles.asList(2790000.0, 2790000.0, 11718000.0)
));
aggregations.add(new Pair<>(
new LongSumAggregatorFactory("qfLong", "qualityFloat"),
Longs.asList(2790000L, 2790000L, 11718000L)
));
List<List<Pair<AggregatorFactory, List<?>>>> aggregationCombinations = new ArrayList<>();
for (Pair<AggregatorFactory, List<?>> aggregation : aggregations) {
aggregationCombinations.add(Collections.singletonList(aggregation));
}
aggregationCombinations.add(aggregations);
for (List<Pair<AggregatorFactory, List<?>>> aggregationCombination : aggregationCombinations) {
boolean hasIndexAggregator = aggregationCombination.stream().anyMatch(agg -> "index".equals(agg.lhs.getName()));
boolean hasRowsAggregator = aggregationCombination.stream().anyMatch(agg -> "rows".equals(agg.lhs.getName()));
TopNQueryBuilder queryBuilder = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.threshold(4)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(aggregationCombination.stream().map(agg -> agg.lhs).collect(Collectors.toList()));
String metric;
if (hasIndexAggregator) {
metric = "index";
} else {
metric = aggregationCombination.get(0).lhs.getName();
}
queryBuilder.metric(metric);
if (hasIndexAggregator && hasRowsAggregator) {
queryBuilder.postAggregators(QueryRunnerTestHelper.ADD_ROWS_INDEX_CONSTANT);
}
TopNQuery query = queryBuilder.build();
ImmutableMap.Builder<String, Object> row1 = ImmutableMap.<String, Object>builder()
.put(QueryRunnerTestHelper.MARKET_DIMENSION, "total_market");
ImmutableMap.Builder<String, Object> row2 = ImmutableMap.<String, Object>builder()
.put(QueryRunnerTestHelper.MARKET_DIMENSION, "upfront");
ImmutableMap.Builder<String, Object> row3 = ImmutableMap.<String, Object>builder()
.put(QueryRunnerTestHelper.MARKET_DIMENSION, "spot");
if (hasIndexAggregator && hasRowsAggregator) {
row1.put("addRowsIndexConstant", 215866.82879638672D);
row2.put("addRowsIndexConstant", 192233.1060180664D);
row3.put("addRowsIndexConstant", 96444.57232284546D);
}
aggregationCombination.forEach(agg -> {
row1.put(agg.lhs.getName(), agg.rhs.get(0));
row2.put(agg.lhs.getName(), agg.rhs.get(1));
row3.put(agg.lhs.getName(), agg.rhs.get(2));
});
List<ImmutableMap<String, Object>> rows = Lists.newArrayList(row1.build(), row2.build(), row3.build());
rows.sort((r1, r2) -> ((Comparable) r2.get(metric)).compareTo(r1.get(metric)));
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(rows)
)
);
assertExpectedResults(expectedResults, query);
}
}
@Test
public void testFullOnTopNBoundFilterAndLongSumMetric()
{
// this tests the stack overflow issue from https://github.com/apache/druid/issues/4628
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION, "Market")
.filters(new BoundDimFilter(
QueryRunnerTestHelper.INDEX_METRIC,
"0",
"46.64980229268867",
true,
true,
false,
null,
StringComparators.NUMERIC
))
.metric("Count")
.threshold(5)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(new LongSumAggregatorFactory("Count", "qualityLong"))
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(Collections.emptyList())
)
);
assertExpectedResults(expectedResults, query);
}
/**
* Regression test for https://github.com/apache/druid/issues/5132
*/
@Test
public void testTopNWithNonBitmapFilter()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.filters(new BoundDimFilter(
ColumnHolder.TIME_COLUMN_NAME,
"0",
String.valueOf(Long.MAX_VALUE),
true,
true,
false,
null,
StringComparators.NUMERIC
))
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric("count")
.threshold(4)
.intervals(QueryRunnerTestHelper.FIRST_TO_THIRD)
.aggregators(new DoubleSumAggregatorFactory("count", "qualityDouble"))
.build();
// Don't check results, just the fact that the query could complete
Assert.assertNotNull(runWithMerge(query).toList());
}
@Test
public void test_topN_orderByLongNumericColumnWithNulls_returnsDescendingResults()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(new DefaultDimensionSpec("index", "index_alias", ValueType.LONG))
.metric(new NumericTopNMetricSpec("longNumericNull"))
.threshold(10000)
.aggregators(new LongSumAggregatorFactory("longNumericNull", "longNumericNull"))
.intervals(QueryRunnerTestHelper.SECOND_ONLY)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-02T00:00:00.000Z"),
new TopNResultValue(
Arrays.asList(
ImmutableMap.<String, Object>builder()
.put("index_alias", 97L)
.put("longNumericNull", 80L)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 135L)
.put("longNumericNull", 70L)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 1049L)
.put("longNumericNull", 70L)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 1321L)
.put("longNumericNull", 70L)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 110L)
.put("longNumericNull", 50L)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 1144L)
.put("longNumericNull", 50L)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 1193L)
.put("longNumericNull", 50L)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 113L)
.put("longNumericNull", 40L)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 112L)
.put("longNumericNull", 20L)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 147L)
.put("longNumericNull", 10L)
.build(),
makeRowWithNulls("index_alias", 114L, "longNumericNull", NullHandling.defaultLongValue()),
makeRowWithNulls("index_alias", 126L, "longNumericNull", NullHandling.defaultLongValue()),
makeRowWithNulls("index_alias", 166L, "longNumericNull", NullHandling.defaultLongValue())
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void test_topN_orderByFloatNumericColumnWithNulls_returnsDescendingResults()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(new DefaultDimensionSpec("index", "index_alias", ValueType.LONG))
.metric(new NumericTopNMetricSpec("floatNumericNull"))
.threshold(10000)
.aggregators(new LongSumAggregatorFactory("floatNumericNull", "floatNumericNull"))
.intervals(QueryRunnerTestHelper.SECOND_ONLY)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-02T00:00:00.000Z"),
new TopNResultValue(
Arrays.asList(
ImmutableMap.<String, Object>builder()
.put("index_alias", 97L)
.put("floatNumericNull", 80f)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 135L)
.put("floatNumericNull", 70f)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 1049L)
.put("floatNumericNull", 70f)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 1321L)
.put("floatNumericNull", 70f)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 110L)
.put("floatNumericNull", 50f)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 1144L)
.put("floatNumericNull", 50f)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 1193L)
.put("floatNumericNull", 50f)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 113L)
.put("floatNumericNull", 40f)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 112L)
.put("floatNumericNull", 20f)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 147L)
.put("floatNumericNull", 10f)
.build(),
makeRowWithNulls("index_alias", 114L, "floatNumericNull", NullHandling.defaultFloatValue()),
makeRowWithNulls("index_alias", 126L, "floatNumericNull", NullHandling.defaultFloatValue()),
makeRowWithNulls("index_alias", 166L, "floatNumericNull", NullHandling.defaultFloatValue())
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void test_topN_orderByDoubleNumericColumnWithNulls_returnsDescendingResults()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(new DefaultDimensionSpec("index", "index_alias", ValueType.LONG))
.metric(new NumericTopNMetricSpec("doubleNumericNull"))
.threshold(10000)
.aggregators(new LongSumAggregatorFactory("doubleNumericNull", "doubleNumericNull"))
.intervals(QueryRunnerTestHelper.SECOND_ONLY)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-04-02T00:00:00.000Z"),
new TopNResultValue(
Arrays.asList(
ImmutableMap.<String, Object>builder()
.put("index_alias", 97L)
.put("doubleNumericNull", 80d)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 135L)
.put("doubleNumericNull", 70d)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 1049L)
.put("doubleNumericNull", 70d)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 1321L)
.put("doubleNumericNull", 70d)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 110L)
.put("doubleNumericNull", 50d)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 1144L)
.put("doubleNumericNull", 50d)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 1193L)
.put("doubleNumericNull", 50d)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 113L)
.put("doubleNumericNull", 40d)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 112L)
.put("doubleNumericNull", 20d)
.build(),
ImmutableMap.<String, Object>builder()
.put("index_alias", 147L)
.put("doubleNumericNull", 10d)
.build(),
makeRowWithNulls("index_alias", 114L, "doubleNumericNull", NullHandling.defaultDoubleValue()),
makeRowWithNulls("index_alias", 126L, "doubleNumericNull", NullHandling.defaultDoubleValue()),
makeRowWithNulls("index_alias", 166L, "doubleNumericNull", NullHandling.defaultDoubleValue())
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testAggregateOnLongNumericNull()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(new DefaultDimensionSpec("longNumericNull", "dim", ValueType.LONG))
.metric(new DimensionTopNMetricSpec(null, StringComparators.NUMERIC))
.threshold(10000)
.aggregators(new CountAggregatorFactory("count"))
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Arrays.asList(
makeRowWithNulls("dim", NullHandling.defaultLongValue(), "count", 279L),
makeRowWithNulls("dim", 10L, "count", 93L),
makeRowWithNulls("dim", 20L, "count", 93L),
makeRowWithNulls("dim", 40L, "count", 93L),
makeRowWithNulls("dim", 50L, "count", 279L),
makeRowWithNulls("dim", 70L, "count", 279L),
makeRowWithNulls("dim", 80L, "count", 93L)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testAggregateOnDoubleNumericNull()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(new DefaultDimensionSpec("doubleNumericNull", "dim", ValueType.DOUBLE))
.metric(new DimensionTopNMetricSpec(null, StringComparators.NUMERIC))
.threshold(10000)
.aggregators(new CountAggregatorFactory("count"))
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Arrays.asList(
makeRowWithNulls("dim", NullHandling.defaultDoubleValue(), "count", 279L),
makeRowWithNulls("dim", 10.0, "count", 93L),
makeRowWithNulls("dim", 20.0, "count", 93L),
makeRowWithNulls("dim", 40.0, "count", 93L),
makeRowWithNulls("dim", 50.0, "count", 279L),
makeRowWithNulls("dim", 70.0, "count", 279L),
makeRowWithNulls("dim", 80.0, "count", 93L)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testAggregateOnFloatNumericNull()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(new DefaultDimensionSpec("floatNumericNull", "dim", ValueType.FLOAT))
.metric(new DimensionTopNMetricSpec(null, StringComparators.NUMERIC))
.threshold(10000)
.aggregators(new CountAggregatorFactory("count"))
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Arrays.asList(
makeRowWithNulls("dim", NullHandling.defaultFloatValue(), "count", 279L),
makeRowWithNulls("dim", 10.0f, "count", 93L),
makeRowWithNulls("dim", 20.0f, "count", 93L),
makeRowWithNulls("dim", 40.0f, "count", 93L),
makeRowWithNulls("dim", 50.0f, "count", 279L),
makeRowWithNulls("dim", 70.0f, "count", 279L),
makeRowWithNulls("dim", 80.0f, "count", 93L)
)
)
)
);
assertExpectedResults(expectedResults, query);
}
@Test
public void testExpressionAggregator()
{
// sorted by array length of array_agg_distinct
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.DATA_SOURCE)
.granularity(QueryRunnerTestHelper.ALL_GRAN)
.dimension(QueryRunnerTestHelper.MARKET_DIMENSION)
.metric("array_agg_distinct")
.threshold(4)
.intervals(QueryRunnerTestHelper.FULL_ON_INTERVAL_SPEC)
.aggregators(
Lists.newArrayList(
Arrays.asList(
new ExpressionLambdaAggregatorFactory(
"diy_count",
Collections.emptySet(),
null,
"0",
null,
"__acc + 1",
"__acc + diy_count",
null,
null,
null,
TestExprMacroTable.INSTANCE
),
new ExpressionLambdaAggregatorFactory(
"diy_sum",
ImmutableSet.of("index"),
null,
"0.0",
null,
"__acc + index",
null,
null,
null,
null,
TestExprMacroTable.INSTANCE
),
new ExpressionLambdaAggregatorFactory(
"diy_decomposed_sum",
ImmutableSet.of("index"),
null,
"0.0",
"<DOUBLE>[]",
"__acc + index",
"array_concat(__acc, diy_decomposed_sum)",
null,
"fold((x, acc) -> x + acc, o, 0.0)",
null,
TestExprMacroTable.INSTANCE
),
new ExpressionLambdaAggregatorFactory(
"array_agg_distinct",
ImmutableSet.of(QueryRunnerTestHelper.QUALITY_DIMENSION),
"acc",
"[]",
null,
"array_set_add(acc, quality)",
"array_set_add_all(acc, array_agg_distinct)",
"if(array_length(o1) > array_length(o2), 1, if (array_length(o1) == array_length(o2), 0, -1))",
null,
null,
TestExprMacroTable.INSTANCE
)
)
)
)
.build();
List<Result<TopNResultValue>> expectedResults = Collections.singletonList(
new Result<>(
DateTimes.of("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put(QueryRunnerTestHelper.MARKET_DIMENSION, "spot")
.put("diy_count", 837L)
.put("diy_sum", 95606.57232284546D)
.put("diy_decomposed_sum", 95606.57232284546D)
.put("array_agg_distinct", new String[]{"mezzanine", "news", "premium", "business", "entertainment", "health", "technology", "automotive", "travel"})
.build(),
ImmutableMap.<String, Object>builder()
.put(QueryRunnerTestHelper.MARKET_DIMENSION, "total_market")
.put("diy_count", 186L)
.put("diy_sum", 215679.82879638672D)
.put("diy_decomposed_sum", 215679.82879638672D)
.put("array_agg_distinct", new String[]{"mezzanine", "premium"})
.build(),
ImmutableMap.<String, Object>builder()
.put(QueryRunnerTestHelper.MARKET_DIMENSION, "upfront")
.put("diy_count", 186L)
.put("diy_sum", 192046.1060180664D)
.put("diy_decomposed_sum", 192046.1060180664D)
.put("array_agg_distinct", new String[]{"mezzanine", "premium"})
.build()
)
)
)
);
assertExpectedResults(expectedResults, query);
}
private static Map<String, Object> makeRowWithNulls(
String dimName,
@Nullable Object dimValue,
String metric,
@Nullable Object metricVal
)
{
Map<String, Object> nullRow = new HashMap<>();
nullRow.put(dimName, dimValue);
nullRow.put(metric, metricVal);
return nullRow;
}
}