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);
 

Reply via email to