diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/hyperloglog/HyperUniquesAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/hyperloglog/HyperUniquesAggregatorFactory.java index ceb82d5247e..e0b7686ed1f 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/hyperloglog/HyperUniquesAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/hyperloglog/HyperUniquesAggregatorFactory.java @@ -58,17 +58,13 @@ public class HyperUniquesAggregatorFactory extends AggregatorFactory { public static Object estimateCardinality(@Nullable Object object, boolean round) { - if (object == null) { - return 0; - } - final HyperLogLogCollector collector = (HyperLogLogCollector) object; - // Avoid ternary, it causes estimateCardinalityRound to be cast to double. + // Avoid ternary for round check as it causes estimateCardinalityRound to be cast to double. if (round) { - return collector.estimateCardinalityRound(); + return collector == null ? 0L : collector.estimateCardinalityRound(); } else { - return collector.estimateCardinality(); + return collector == null ? 0d : collector.estimateCardinality(); } } diff --git a/processing/src/test/java/org/apache/druid/query/SchemaEvolutionTest.java b/processing/src/test/java/org/apache/druid/query/SchemaEvolutionTest.java index 7e829e00a89..ce17b38ba46 100644 --- a/processing/src/test/java/org/apache/druid/query/SchemaEvolutionTest.java +++ b/processing/src/test/java/org/apache/druid/query/SchemaEvolutionTest.java @@ -241,7 +241,7 @@ public class SchemaEvolutionTest // index1 has no "uniques" column Assert.assertEquals( - timeseriesResult(ImmutableMap.of("uniques", 0)), + timeseriesResult(ImmutableMap.of("uniques", 0d)), runQuery(query, factory, ImmutableList.of(index1)) ); diff --git a/processing/src/test/java/org/apache/druid/query/aggregation/hyperloglog/HyperUniquesAggregatorFactoryTest.java b/processing/src/test/java/org/apache/druid/query/aggregation/hyperloglog/HyperUniquesAggregatorFactoryTest.java index f9151923413..421a457999d 100644 --- a/processing/src/test/java/org/apache/druid/query/aggregation/hyperloglog/HyperUniquesAggregatorFactoryTest.java +++ b/processing/src/test/java/org/apache/druid/query/aggregation/hyperloglog/HyperUniquesAggregatorFactoryTest.java @@ -30,6 +30,7 @@ import org.apache.druid.segment.TestHelper; import org.junit.Assert; import org.junit.Test; +import java.nio.ByteBuffer; import java.util.Comparator; import java.util.Random; @@ -173,6 +174,30 @@ public class HyperUniquesAggregatorFactoryTest } } + @Test + public void testEstimateCardinalityForZeroCardinality() + { + HyperLogLogCollector emptyHyperLogLogCollector = HyperUniquesBufferAggregator.doGet( + ByteBuffer.allocate(HyperLogLogCollector.getLatestNumBytesForDenseStorage()), + 0 + ); + + Assert.assertEquals(0L, HyperUniquesAggregatorFactory.estimateCardinality(null, true)); + Assert.assertEquals(0d, HyperUniquesAggregatorFactory.estimateCardinality(null, false)); + + Assert.assertEquals(0L, HyperUniquesAggregatorFactory.estimateCardinality(emptyHyperLogLogCollector, true)); + Assert.assertEquals(0d, HyperUniquesAggregatorFactory.estimateCardinality(emptyHyperLogLogCollector, false)); + + Assert.assertEquals( + HyperUniquesAggregatorFactory.estimateCardinality(emptyHyperLogLogCollector, true).getClass(), + HyperUniquesAggregatorFactory.estimateCardinality(null, true).getClass() + ); + Assert.assertEquals( + HyperUniquesAggregatorFactory.estimateCardinality(emptyHyperLogLogCollector, false).getClass(), + HyperUniquesAggregatorFactory.estimateCardinality(null, false).getClass() + ); + } + @Test public void testSerde() throws Exception { diff --git a/processing/src/test/java/org/apache/druid/query/timeseries/TimeseriesQueryRunnerTest.java b/processing/src/test/java/org/apache/druid/query/timeseries/TimeseriesQueryRunnerTest.java index 5d5af015b5c..99989c01d8b 100644 --- a/processing/src/test/java/org/apache/druid/query/timeseries/TimeseriesQueryRunnerTest.java +++ b/processing/src/test/java/org/apache/druid/query/timeseries/TimeseriesQueryRunnerTest.java @@ -2568,7 +2568,7 @@ public class TimeseriesQueryRunnerTest extends InitializedNullHandlingTest ); Assert.assertEquals( 0.0D, - NullHandling.sqlCompatible() ? (Double) result[4] : (Integer) result[4], + (Double) result[4], 0.02 ); Assert.assertEquals( @@ -2581,7 +2581,7 @@ public class TimeseriesQueryRunnerTest extends InitializedNullHandlingTest result[3] ); Assert.assertEquals( - (Integer) result[4], + (Double) result[4], 0.0, 0.02 ); diff --git a/processing/src/test/java/org/apache/druid/query/topn/TopNQueryRunnerTest.java b/processing/src/test/java/org/apache/druid/query/topn/TopNQueryRunnerTest.java index 3f5b41db0a1..f98160a1a39 100644 --- a/processing/src/test/java/org/apache/druid/query/topn/TopNQueryRunnerTest.java +++ b/processing/src/test/java/org/apache/druid/query/topn/TopNQueryRunnerTest.java @@ -647,15 +647,15 @@ public class TopNQueryRunnerTest extends InitializedNullHandlingTest Arrays.>asList( ImmutableMap.builder() .put("market", "spot") - .put("uniques", 0) + .put("uniques", 0d) .build(), ImmutableMap.builder() .put("market", "total_market") - .put("uniques", 0) + .put("uniques", 0d) .build(), ImmutableMap.builder() .put("market", "upfront") - .put("uniques", 0) + .put("uniques", 0d) .build() ) )