Merge pull request #1070 from metamx/fix-topn-missing-hll-npe

fix NPE for topN over missing hyperUniques column
This commit is contained in:
Fangjin Yang 2015-01-29 08:28:52 +08:00
commit d875d7294b
2 changed files with 47 additions and 0 deletions

View File

@ -111,6 +111,12 @@ public class HyperUniquesAggregatorFactory implements AggregatorFactory
@Override
public int compare(HyperLogLogCollector lhs, HyperLogLogCollector rhs)
{
if(lhs == null) {
return -1;
}
if(rhs == null) {
return 1;
}
return lhs.compareTo(rhs);
}
};

View File

@ -37,6 +37,7 @@ import io.druid.query.aggregation.AggregatorFactory;
import io.druid.query.aggregation.MaxAggregatorFactory;
import io.druid.query.aggregation.MinAggregatorFactory;
import io.druid.query.aggregation.PostAggregator;
import io.druid.query.aggregation.hyperloglog.HyperUniquesAggregatorFactory;
import io.druid.query.dimension.ExtractionDimensionSpec;
import io.druid.query.extraction.RegexDimExtractionFn;
import io.druid.query.filter.AndDimFilter;
@ -303,6 +304,46 @@ public class TopNQueryRunnerTest
TestHelper.assertExpectedResults(expectedResults, runner.run(query, context));
}
@Test
public void testTopNOverMissingUniques()
{
TopNQuery query = new TopNQueryBuilder()
.dataSource(QueryRunnerTestHelper.dataSource)
.granularity(QueryRunnerTestHelper.allGran)
.dimension(marketDimension)
.metric(QueryRunnerTestHelper.uniqueMetric)
.threshold(3)
.intervals(QueryRunnerTestHelper.fullOnInterval)
.aggregators(
Arrays.<AggregatorFactory>asList(new HyperUniquesAggregatorFactory("uniques", "missingUniques"))
)
.build();
List<Result<TopNResultValue>> expectedResults = Arrays.asList(
new Result<TopNResultValue>(
new DateTime("2011-01-12T00:00:00.000Z"),
new TopNResultValue(
Arrays.<Map<String, Object>>asList(
ImmutableMap.<String, Object>builder()
.put("market", "total_market")
.put("uniques", 0)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "spot")
.put("uniques", 0)
.build(),
ImmutableMap.<String, Object>builder()
.put("market", "upfront")
.put("uniques", 0)
.build()
)
)
)
);
HashMap<String, Object> context = new HashMap<String, Object>();
TestHelper.assertExpectedResults(expectedResults, runner.run(query, context));
}
@Test
public void testTopNBySegment()