This is an automated email from the ASF dual-hosted git repository. xiangweiwei pushed a commit to branch aggregationOp in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 9d725359fbdd76fa63c9abda1d39dc7f5415179d Author: Alima777 <[email protected]> AuthorDate: Mon May 9 21:36:42 2022 +0800 add null tests to accumulator --- .../db/mpp/aggregation/FirstValueAccumulator.java | 1 + .../db/mpp/aggregation/LastValueAccumulator.java | 1 + .../iotdb/db/mpp/aggregation/AccumulatorTest.java | 116 +++++++++++++++++---- 3 files changed, 98 insertions(+), 20 deletions(-) diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/aggregation/FirstValueAccumulator.java b/server/src/main/java/org/apache/iotdb/db/mpp/aggregation/FirstValueAccumulator.java index 5677d936b0..4a022b436a 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/aggregation/FirstValueAccumulator.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/aggregation/FirstValueAccumulator.java @@ -140,6 +140,7 @@ public class FirstValueAccumulator implements Accumulator { checkArgument(columnBuilders.length == 2, "partialResult of FirstValue should be 2"); if (!hasCandidateResult) { columnBuilders[0].appendNull(); + columnBuilders[1].appendNull(); return; } switch (seriesDataType) { diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/aggregation/LastValueAccumulator.java b/server/src/main/java/org/apache/iotdb/db/mpp/aggregation/LastValueAccumulator.java index 8699f650b1..7dee2be6da 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/aggregation/LastValueAccumulator.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/aggregation/LastValueAccumulator.java @@ -139,6 +139,7 @@ public class LastValueAccumulator implements Accumulator { checkArgument(columnBuilders.length == 2, "partialResult of LastValue should be 2"); if (!initResult) { columnBuilders[0].appendNull(); + columnBuilders[1].appendNull(); return; } switch (seriesDataType) { diff --git a/server/src/test/java/org/apache/iotdb/db/mpp/aggregation/AccumulatorTest.java b/server/src/test/java/org/apache/iotdb/db/mpp/aggregation/AccumulatorTest.java index 6fe08cd345..af3f7f946b 100644 --- a/server/src/test/java/org/apache/iotdb/db/mpp/aggregation/AccumulatorTest.java +++ b/server/src/test/java/org/apache/iotdb/db/mpp/aggregation/AccumulatorTest.java @@ -73,10 +73,19 @@ public class AccumulatorTest { Assert.assertEquals(TSDataType.INT64, avgAccumulator.getIntermediateType()[0]); Assert.assertEquals(TSDataType.DOUBLE, avgAccumulator.getIntermediateType()[1]); Assert.assertEquals(TSDataType.DOUBLE, avgAccumulator.getFinalType()); + // check returning null while no data + ColumnBuilder[] intermediateResult = new ColumnBuilder[2]; + intermediateResult[0] = new LongColumnBuilder(null, 1); + intermediateResult[1] = new DoubleColumnBuilder(null, 1); + avgAccumulator.outputIntermediate(intermediateResult); + Assert.assertTrue(intermediateResult[0].build().isNull(0)); + Assert.assertTrue(intermediateResult[1].build().isNull(0)); + ColumnBuilder finalResult = new DoubleColumnBuilder(null, 1); + avgAccumulator.outputFinal(finalResult); + Assert.assertTrue(finalResult.build().isNull(0)); avgAccumulator.addInput(rawData.getTimeAndValueColumn(0), defaultTimeRange); Assert.assertFalse(avgAccumulator.hasFinalResult()); - ColumnBuilder[] intermediateResult = new ColumnBuilder[2]; intermediateResult[0] = new LongColumnBuilder(null, 1); intermediateResult[1] = new DoubleColumnBuilder(null, 1); avgAccumulator.outputIntermediate(intermediateResult); @@ -86,7 +95,7 @@ public class AccumulatorTest { // add intermediate result as input avgAccumulator.addIntermediate( new Column[] {intermediateResult[0].build(), intermediateResult[1].build()}); - ColumnBuilder finalResult = new DoubleColumnBuilder(null, 1); + finalResult = new DoubleColumnBuilder(null, 1); avgAccumulator.outputFinal(finalResult); Assert.assertEquals(49.5d, finalResult.build().getDouble(0), 0.001); @@ -103,17 +112,24 @@ public class AccumulatorTest { AccumulatorFactory.createAccumulator(AggregationType.COUNT, TSDataType.DOUBLE, true); Assert.assertEquals(TSDataType.INT64, countAccumulator.getIntermediateType()[0]); Assert.assertEquals(TSDataType.INT64, countAccumulator.getFinalType()); + // check returning null while no data + ColumnBuilder[] intermediateResult = new ColumnBuilder[1]; + intermediateResult[0] = new LongColumnBuilder(null, 1); + countAccumulator.outputIntermediate(intermediateResult); + Assert.assertTrue(intermediateResult[0].build().isNull(0)); + ColumnBuilder finalResult = new LongColumnBuilder(null, 1); + countAccumulator.outputFinal(finalResult); + Assert.assertTrue(finalResult.build().isNull(0)); countAccumulator.addInput(rawData.getTimeAndValueColumn(0), defaultTimeRange); Assert.assertFalse(countAccumulator.hasFinalResult()); - ColumnBuilder[] intermediateResult = new ColumnBuilder[1]; intermediateResult[0] = new LongColumnBuilder(null, 1); countAccumulator.outputIntermediate(intermediateResult); Assert.assertEquals(100, intermediateResult[0].build().getLong(0)); // add intermediate result as input countAccumulator.addIntermediate(new Column[] {intermediateResult[0].build()}); - ColumnBuilder finalResult = new LongColumnBuilder(null, 1); + finalResult = new LongColumnBuilder(null, 1); countAccumulator.outputFinal(finalResult); Assert.assertEquals(200, finalResult.build().getLong(0)); @@ -130,17 +146,24 @@ public class AccumulatorTest { AccumulatorFactory.createAccumulator(AggregationType.EXTREME, TSDataType.DOUBLE, true); Assert.assertEquals(TSDataType.DOUBLE, extremeAccumulator.getIntermediateType()[0]); Assert.assertEquals(TSDataType.DOUBLE, extremeAccumulator.getFinalType()); + // check returning null while no data + ColumnBuilder[] intermediateResult = new ColumnBuilder[1]; + intermediateResult[0] = new DoubleColumnBuilder(null, 1); + extremeAccumulator.outputIntermediate(intermediateResult); + Assert.assertTrue(intermediateResult[0].build().isNull(0)); + ColumnBuilder finalResult = new DoubleColumnBuilder(null, 1); + extremeAccumulator.outputFinal(finalResult); + Assert.assertTrue(finalResult.build().isNull(0)); extremeAccumulator.addInput(rawData.getTimeAndValueColumn(0), defaultTimeRange); Assert.assertFalse(extremeAccumulator.hasFinalResult()); - ColumnBuilder[] intermediateResult = new ColumnBuilder[1]; intermediateResult[0] = new DoubleColumnBuilder(null, 1); extremeAccumulator.outputIntermediate(intermediateResult); Assert.assertEquals(99d, intermediateResult[0].build().getDouble(0), 0.001); // add intermediate result as input extremeAccumulator.addIntermediate(new Column[] {intermediateResult[0].build()}); - ColumnBuilder finalResult = new DoubleColumnBuilder(null, 1); + finalResult = new DoubleColumnBuilder(null, 1); extremeAccumulator.outputFinal(finalResult); Assert.assertEquals(99d, finalResult.build().getDouble(0), 0.001); @@ -158,10 +181,19 @@ public class AccumulatorTest { Assert.assertEquals(TSDataType.DOUBLE, firstValueAccumulator.getIntermediateType()[0]); Assert.assertEquals(TSDataType.INT64, firstValueAccumulator.getIntermediateType()[1]); Assert.assertEquals(TSDataType.DOUBLE, firstValueAccumulator.getFinalType()); + // check returning null while no data + ColumnBuilder[] intermediateResult = new ColumnBuilder[2]; + intermediateResult[0] = new DoubleColumnBuilder(null, 1); + intermediateResult[1] = new LongColumnBuilder(null, 1); + firstValueAccumulator.outputIntermediate(intermediateResult); + Assert.assertTrue(intermediateResult[0].build().isNull(0)); + Assert.assertTrue(intermediateResult[1].build().isNull(0)); + ColumnBuilder finalResult = new DoubleColumnBuilder(null, 1); + firstValueAccumulator.outputFinal(finalResult); + Assert.assertTrue(finalResult.build().isNull(0)); firstValueAccumulator.addInput(rawData.getTimeAndValueColumn(0), defaultTimeRange); Assert.assertTrue(firstValueAccumulator.hasFinalResult()); - ColumnBuilder[] intermediateResult = new ColumnBuilder[2]; intermediateResult[0] = new DoubleColumnBuilder(null, 1); intermediateResult[1] = new LongColumnBuilder(null, 1); firstValueAccumulator.outputIntermediate(intermediateResult); @@ -171,7 +203,7 @@ public class AccumulatorTest { // add intermediate result as input firstValueAccumulator.addIntermediate( new Column[] {intermediateResult[0].build(), intermediateResult[1].build()}); - ColumnBuilder finalResult = new DoubleColumnBuilder(null, 1); + finalResult = new DoubleColumnBuilder(null, 1); firstValueAccumulator.outputFinal(finalResult); Assert.assertEquals(0L, finalResult.build().getDouble(0), 0.001); @@ -189,9 +221,18 @@ public class AccumulatorTest { Assert.assertEquals(TSDataType.DOUBLE, lastValueAccumulator.getIntermediateType()[0]); Assert.assertEquals(TSDataType.INT64, lastValueAccumulator.getIntermediateType()[1]); Assert.assertEquals(TSDataType.DOUBLE, lastValueAccumulator.getFinalType()); + // check returning null while no data + ColumnBuilder[] intermediateResult = new ColumnBuilder[2]; + intermediateResult[0] = new DoubleColumnBuilder(null, 1); + intermediateResult[1] = new LongColumnBuilder(null, 1); + lastValueAccumulator.outputIntermediate(intermediateResult); + Assert.assertTrue(intermediateResult[0].build().isNull(0)); + Assert.assertTrue(intermediateResult[1].build().isNull(0)); + ColumnBuilder finalResult = new DoubleColumnBuilder(null, 1); + lastValueAccumulator.outputFinal(finalResult); + Assert.assertTrue(finalResult.build().isNull(0)); lastValueAccumulator.addInput(rawData.getTimeAndValueColumn(0), defaultTimeRange); - ColumnBuilder[] intermediateResult = new ColumnBuilder[2]; intermediateResult[0] = new DoubleColumnBuilder(null, 1); intermediateResult[1] = new LongColumnBuilder(null, 1); lastValueAccumulator.outputIntermediate(intermediateResult); @@ -201,7 +242,7 @@ public class AccumulatorTest { // add intermediate result as input lastValueAccumulator.addIntermediate( new Column[] {intermediateResult[0].build(), intermediateResult[1].build()}); - ColumnBuilder finalResult = new DoubleColumnBuilder(null, 1); + finalResult = new DoubleColumnBuilder(null, 1); lastValueAccumulator.outputFinal(finalResult); Assert.assertEquals(99L, finalResult.build().getDouble(0), 0.001); @@ -218,17 +259,24 @@ public class AccumulatorTest { AccumulatorFactory.createAccumulator(AggregationType.MAX_TIME, TSDataType.DOUBLE, true); Assert.assertEquals(TSDataType.INT64, maxTimeAccumulator.getIntermediateType()[0]); Assert.assertEquals(TSDataType.INT64, maxTimeAccumulator.getFinalType()); + // check returning null while no data + ColumnBuilder[] intermediateResult = new ColumnBuilder[1]; + intermediateResult[0] = new LongColumnBuilder(null, 1); + maxTimeAccumulator.outputIntermediate(intermediateResult); + Assert.assertTrue(intermediateResult[0].build().isNull(0)); + ColumnBuilder finalResult = new LongColumnBuilder(null, 1); + maxTimeAccumulator.outputFinal(finalResult); + Assert.assertTrue(finalResult.build().isNull(0)); maxTimeAccumulator.addInput(rawData.getTimeAndValueColumn(0), defaultTimeRange); Assert.assertFalse(maxTimeAccumulator.hasFinalResult()); - ColumnBuilder[] intermediateResult = new ColumnBuilder[1]; intermediateResult[0] = new LongColumnBuilder(null, 1); maxTimeAccumulator.outputIntermediate(intermediateResult); Assert.assertEquals(99, intermediateResult[0].build().getLong(0)); // add intermediate result as input maxTimeAccumulator.addIntermediate(new Column[] {intermediateResult[0].build()}); - ColumnBuilder finalResult = new LongColumnBuilder(null, 1); + finalResult = new LongColumnBuilder(null, 1); maxTimeAccumulator.outputFinal(finalResult); Assert.assertEquals(99, finalResult.build().getLong(0)); @@ -245,17 +293,24 @@ public class AccumulatorTest { AccumulatorFactory.createAccumulator(AggregationType.MIN_TIME, TSDataType.DOUBLE, true); Assert.assertEquals(TSDataType.INT64, minTimeAccumulator.getIntermediateType()[0]); Assert.assertEquals(TSDataType.INT64, minTimeAccumulator.getFinalType()); + // check returning null while no data + ColumnBuilder[] intermediateResult = new ColumnBuilder[1]; + intermediateResult[0] = new LongColumnBuilder(null, 1); + minTimeAccumulator.outputIntermediate(intermediateResult); + Assert.assertTrue(intermediateResult[0].build().isNull(0)); + ColumnBuilder finalResult = new LongColumnBuilder(null, 1); + minTimeAccumulator.outputFinal(finalResult); + Assert.assertTrue(finalResult.build().isNull(0)); minTimeAccumulator.addInput(rawData.getTimeAndValueColumn(0), defaultTimeRange); Assert.assertTrue(minTimeAccumulator.hasFinalResult()); - ColumnBuilder[] intermediateResult = new ColumnBuilder[1]; intermediateResult[0] = new LongColumnBuilder(null, 1); minTimeAccumulator.outputIntermediate(intermediateResult); Assert.assertEquals(0, intermediateResult[0].build().getLong(0)); // add intermediate result as input minTimeAccumulator.addIntermediate(new Column[] {intermediateResult[0].build()}); - ColumnBuilder finalResult = new LongColumnBuilder(null, 1); + finalResult = new LongColumnBuilder(null, 1); minTimeAccumulator.outputFinal(finalResult); Assert.assertEquals(0, finalResult.build().getLong(0)); @@ -272,17 +327,24 @@ public class AccumulatorTest { AccumulatorFactory.createAccumulator(AggregationType.MAX_VALUE, TSDataType.DOUBLE, true); Assert.assertEquals(TSDataType.DOUBLE, extremeAccumulator.getIntermediateType()[0]); Assert.assertEquals(TSDataType.DOUBLE, extremeAccumulator.getFinalType()); + // check returning null while no data + ColumnBuilder[] intermediateResult = new ColumnBuilder[1]; + intermediateResult[0] = new DoubleColumnBuilder(null, 1); + extremeAccumulator.outputIntermediate(intermediateResult); + Assert.assertTrue(intermediateResult[0].build().isNull(0)); + ColumnBuilder finalResult = new DoubleColumnBuilder(null, 1); + extremeAccumulator.outputFinal(finalResult); + Assert.assertTrue(finalResult.build().isNull(0)); extremeAccumulator.addInput(rawData.getTimeAndValueColumn(0), defaultTimeRange); Assert.assertFalse(extremeAccumulator.hasFinalResult()); - ColumnBuilder[] intermediateResult = new ColumnBuilder[1]; intermediateResult[0] = new DoubleColumnBuilder(null, 1); extremeAccumulator.outputIntermediate(intermediateResult); Assert.assertEquals(99d, intermediateResult[0].build().getDouble(0), 0.001); // add intermediate result as input extremeAccumulator.addIntermediate(new Column[] {intermediateResult[0].build()}); - ColumnBuilder finalResult = new DoubleColumnBuilder(null, 1); + finalResult = new DoubleColumnBuilder(null, 1); extremeAccumulator.outputFinal(finalResult); Assert.assertEquals(99d, finalResult.build().getDouble(0), 0.001); @@ -299,17 +361,24 @@ public class AccumulatorTest { AccumulatorFactory.createAccumulator(AggregationType.MIN_VALUE, TSDataType.DOUBLE, true); Assert.assertEquals(TSDataType.DOUBLE, extremeAccumulator.getIntermediateType()[0]); Assert.assertEquals(TSDataType.DOUBLE, extremeAccumulator.getFinalType()); + // check returning null while no data + ColumnBuilder[] intermediateResult = new ColumnBuilder[1]; + intermediateResult[0] = new DoubleColumnBuilder(null, 1); + extremeAccumulator.outputIntermediate(intermediateResult); + Assert.assertTrue(intermediateResult[0].build().isNull(0)); + ColumnBuilder finalResult = new DoubleColumnBuilder(null, 1); + extremeAccumulator.outputFinal(finalResult); + Assert.assertTrue(finalResult.build().isNull(0)); extremeAccumulator.addInput(rawData.getTimeAndValueColumn(0), defaultTimeRange); Assert.assertFalse(extremeAccumulator.hasFinalResult()); - ColumnBuilder[] intermediateResult = new ColumnBuilder[1]; intermediateResult[0] = new DoubleColumnBuilder(null, 1); extremeAccumulator.outputIntermediate(intermediateResult); Assert.assertEquals(0d, intermediateResult[0].build().getDouble(0), 0.001); // add intermediate result as input extremeAccumulator.addIntermediate(new Column[] {intermediateResult[0].build()}); - ColumnBuilder finalResult = new DoubleColumnBuilder(null, 1); + finalResult = new DoubleColumnBuilder(null, 1); extremeAccumulator.outputFinal(finalResult); Assert.assertEquals(0d, finalResult.build().getDouble(0), 0.001); @@ -326,17 +395,24 @@ public class AccumulatorTest { AccumulatorFactory.createAccumulator(AggregationType.SUM, TSDataType.DOUBLE, true); Assert.assertEquals(TSDataType.DOUBLE, sumAccumulator.getIntermediateType()[0]); Assert.assertEquals(TSDataType.DOUBLE, sumAccumulator.getFinalType()); + // check returning null while no data + ColumnBuilder[] intermediateResult = new ColumnBuilder[1]; + intermediateResult[0] = new DoubleColumnBuilder(null, 1); + sumAccumulator.outputIntermediate(intermediateResult); + Assert.assertTrue(intermediateResult[0].build().isNull(0)); + ColumnBuilder finalResult = new DoubleColumnBuilder(null, 1); + sumAccumulator.outputFinal(finalResult); + Assert.assertTrue(finalResult.build().isNull(0)); sumAccumulator.addInput(rawData.getTimeAndValueColumn(0), defaultTimeRange); Assert.assertFalse(sumAccumulator.hasFinalResult()); - ColumnBuilder[] intermediateResult = new ColumnBuilder[1]; intermediateResult[0] = new DoubleColumnBuilder(null, 1); sumAccumulator.outputIntermediate(intermediateResult); Assert.assertEquals(4950d, intermediateResult[0].build().getDouble(0), 0.001); // add intermediate result as input sumAccumulator.addIntermediate(new Column[] {intermediateResult[0].build()}); - ColumnBuilder finalResult = new DoubleColumnBuilder(null, 1); + finalResult = new DoubleColumnBuilder(null, 1); sumAccumulator.outputFinal(finalResult); Assert.assertEquals(9900d, finalResult.build().getDouble(0), 0.001);
