diff --git a/processing/src/main/java/io/druid/query/topn/TopNLexicographicResultBuilder.java b/processing/src/main/java/io/druid/query/topn/TopNLexicographicResultBuilder.java index b516b6d1ac49..5b591bd1ea7b 100644 --- a/processing/src/main/java/io/druid/query/topn/TopNLexicographicResultBuilder.java +++ b/processing/src/main/java/io/druid/query/topn/TopNLexicographicResultBuilder.java @@ -131,7 +131,7 @@ public TopNResultBuilder addEntry( public TopNResultBuilder addEntry(DimensionAndMetricValueExtractor dimensionAndMetricValueExtractor) { Object dimensionValueObj = dimensionAndMetricValueExtractor.getDimensionValue(dimSpec.getOutputName()); - String dimensionValue = dimensionValueObj.toString(); + String dimensionValue = dimensionValueObj == null ? null : dimensionValueObj.toString(); if (shouldAdd(dimensionValue)) { pQueue.add( diff --git a/processing/src/test/java/io/druid/query/topn/TopNBinaryFnTest.java b/processing/src/test/java/io/druid/query/topn/TopNBinaryFnTest.java index 9500bdc511f1..cb5c0f2903b8 100644 --- a/processing/src/test/java/io/druid/query/topn/TopNBinaryFnTest.java +++ b/processing/src/test/java/io/druid/query/topn/TopNBinaryFnTest.java @@ -37,6 +37,7 @@ import org.junit.Test; import java.util.Arrays; +import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -461,4 +462,62 @@ public void testMergeShiftedTimestamp() Assert.assertEquals(expected.getTimestamp(), actual.getTimestamp()); assertTopNMergeResult(expected.getValue(), actual.getValue()); } + + @Test + public void testMergeLexicographicWithInvalidDimName() + { + Result result1 = new Result( + currTime, + new TopNResultValue( + ImmutableList.>of( + ImmutableMap.of( + "rows", 1L, + "index", 2L, + "testdim", "1" + ) + ) + ) + ); + Result result2 = new Result( + currTime, + new TopNResultValue( + ImmutableList.>of( + ImmutableMap.of( + "rows", 2L, + "index", 3L, + "testdim", "1" + ) + ) + ) + ); + + Map resultMap = new HashMap<>(); + resultMap.put("INVALID_DIM_NAME", null); + resultMap.put("rows", 3L); + resultMap.put("index", 5L); + + Result expected = new Result( + currTime, + new TopNResultValue( + ImmutableList.>of( + resultMap + ) + ) + ); + + Result actual = new TopNBinaryFn( + TopNResultMerger.identity, + QueryGranularity.ALL, + new DefaultDimensionSpec("INVALID_DIM_NAME", null), + new LexicographicTopNMetricSpec(null), + 2, + aggregatorFactories, + postAggregators + ).apply( + result1, + result2 + ); + Assert.assertEquals(expected.getTimestamp(), actual.getTimestamp()); + assertTopNMergeResult(expected.getValue(), actual.getValue()); + } }