This is an automated email from the ASF dual-hosted git repository.

jackietien pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new 85d2a4a  [IOTDB-1884] Distinguish between zero and null values in sum 
aggregation (#4233)
85d2a4a is described below

commit 85d2a4a0ab1198ba015df308cd6e93bde7f2205e
Author: CRZbulabula <[email protected]>
AuthorDate: Fri Oct 29 12:02:09 2021 +0800

    [IOTDB-1884] Distinguish between zero and null values in sum aggregation 
(#4233)
---
 .../db/query/aggregation/impl/SumAggrResult.java   |  70 +++++-----
 .../iotdb/db/integration/IOTDBGroupByIT.java       | 149 ++++++++++++++-------
 .../integration/IOTDBGroupByInnerIntervalIT.java   |   2 +-
 .../iotdb/db/integration/IoTDBGroupByMonthIT.java  |   2 +-
 .../aggregation/IoTDBAggregationByLevelIT.java     |   8 +-
 .../aggregation/IoTDBAggregationSmallDataIT.java   |   2 +-
 6 files changed, 145 insertions(+), 88 deletions(-)

diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/SumAggrResult.java
 
b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/SumAggrResult.java
index 2590d3d..a047c33 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/SumAggrResult.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/SumAggrResult.java
@@ -42,23 +42,24 @@ public class SumAggrResult extends AggregateResult {
     super(TSDataType.DOUBLE, AggregationType.SUM);
     this.seriesDataType = seriesDataType;
     reset();
-    setDoubleValue(0.0);
   }
 
   @Override
   public Double getResult() {
-    return getDoubleValue();
+    return hasCandidateResult() ? getDoubleValue() : null;
   }
 
   @Override
   public void updateResultFromStatistics(Statistics statistics) {
-    double preValue = getDoubleValue();
-    if (statistics instanceof IntegerStatistics || statistics instanceof 
BooleanStatistics) {
-      preValue += statistics.getSumLongValue();
-    } else {
-      preValue += statistics.getSumDoubleValue();
+    if (statistics != null && statistics.getCount() > 0) {
+      double preValue = getDoubleValue();
+      if (statistics instanceof IntegerStatistics || statistics instanceof 
BooleanStatistics) {
+        preValue += statistics.getSumLongValue();
+      } else {
+        preValue += statistics.getSumDoubleValue();
+      }
+      setDoubleValue(preValue);
     }
-    setDoubleValue(preValue);
   }
 
   @Override
@@ -99,27 +100,33 @@ public class SumAggrResult extends AggregateResult {
   }
 
   private void updateSum(Object sumVal) throws UnSupportedDataTypeException {
-    double preValue = getDoubleValue();
-    switch (seriesDataType) {
-      case INT32:
-        preValue += (int) sumVal;
-        break;
-      case INT64:
-        preValue += (long) sumVal;
-        break;
-      case FLOAT:
-        preValue += (float) sumVal;
-        break;
-      case DOUBLE:
-        preValue += (double) sumVal;
-        break;
-      case TEXT:
-      case BOOLEAN:
-      default:
-        throw new UnSupportedDataTypeException(
-            String.format("Unsupported data type in aggregation SUM : %s", 
seriesDataType));
+    if (sumVal != null) {
+      double preValue = getDoubleValue();
+      switch (seriesDataType) {
+        case INT32:
+          preValue += (int) sumVal;
+          break;
+        case INT64:
+          preValue += (long) sumVal;
+          break;
+        case FLOAT:
+          preValue += (float) sumVal;
+          break;
+        case DOUBLE:
+          preValue += (double) sumVal;
+          break;
+        case TEXT:
+        case BOOLEAN:
+        default:
+          throw new UnSupportedDataTypeException(
+              String.format("Unsupported data type in aggregation SUM : %s", 
seriesDataType));
+      }
+      setDoubleValue(preValue);
     }
-    setDoubleValue(preValue);
+  }
+
+  public boolean isNotNull() {
+    return hasCandidateResult;
   }
 
   @Override
@@ -129,8 +136,11 @@ public class SumAggrResult extends AggregateResult {
 
   @Override
   public void merge(AggregateResult another) {
-    SumAggrResult anotherSum = (SumAggrResult) another;
-    setDoubleValue(getDoubleValue() + anotherSum.getDoubleValue());
+    if (another instanceof SumAggrResult && ((SumAggrResult) 
another).isNotNull()) {
+      SumAggrResult anotherSum = (SumAggrResult) another;
+      double preValue = getDoubleValue();
+      setDoubleValue(preValue + anotherSum.getDoubleValue());
+    }
   }
 
   @Override
diff --git 
a/server/src/test/java/org/apache/iotdb/db/integration/IOTDBGroupByIT.java 
b/server/src/test/java/org/apache/iotdb/db/integration/IOTDBGroupByIT.java
index 1eb5220..2ff753c 100644
--- a/server/src/test/java/org/apache/iotdb/db/integration/IOTDBGroupByIT.java
+++ b/server/src/test/java/org/apache/iotdb/db/integration/IOTDBGroupByIT.java
@@ -65,27 +65,27 @@ public class IOTDBGroupByIT {
             + "values(5, 5.5, false, 55)",
         "flush",
         "INSERT INTO root.ln.wf01.wt01(timestamp,temperature,status, hardware) 
"
-            + "values(100, 100.1, false, 110)",
+            + "values(10, 10.1, false, 110)",
         "INSERT INTO root.ln.wf01.wt01(timestamp,temperature,status, hardware) 
"
-            + "values(150, 200.2, true, 220)",
-        "flush",
+            + "values(20, 20.2, true, 220)",
         "INSERT INTO root.ln.wf01.wt01(timestamp,temperature,status, hardware) 
"
-            + "values(200, 300.3, false, 330 )",
+            + "values(30, 30.3, false, 330 )",
         "INSERT INTO root.ln.wf01.wt01(timestamp,temperature,status, hardware) 
"
-            + "values(250, 400.4, false, 440)",
+            + "values(40, 40.4, false, 440)",
         "INSERT INTO root.ln.wf01.wt01(timestamp,temperature,status, hardware) 
"
-            + "values(300, 500.5, false, 550)",
+            + "values(50, 50.5, false, 550)",
         "flush",
         "INSERT INTO root.ln.wf01.wt01(timestamp,temperature,status, hardware) 
"
-            + "values(10, 10.1, false, 110)",
+            + "values(100, 100.1, false, 110)",
         "INSERT INTO root.ln.wf01.wt01(timestamp,temperature,status, hardware) 
"
-            + "values(20, 20.2, true, 220)",
+            + "values(150, 200.2, true, 220)",
+        "flush",
         "INSERT INTO root.ln.wf01.wt01(timestamp,temperature,status, hardware) 
"
-            + "values(30, 30.3, false, 330 )",
+            + "values(200, 300.3, false, 330 )",
         "INSERT INTO root.ln.wf01.wt01(timestamp,temperature,status, hardware) 
"
-            + "values(40, 40.4, false, 440)",
+            + "values(250, 400.4, false, 440)",
         "INSERT INTO root.ln.wf01.wt01(timestamp,temperature,status, hardware) 
"
-            + "values(50, 50.5, false, 550)",
+            + "values(300, 500.5, false, 550)",
         "flush",
         "INSERT INTO root.ln.wf01.wt01(timestamp,temperature,status, hardware) 
"
             + "values(500, 100.1, false, 110)",
@@ -108,6 +108,12 @@ public class IOTDBGroupByIT {
             + "values(610, 400.4, false, 440)",
         "INSERT INTO root.ln.wf01.wt01(timestamp,temperature,status, hardware) 
"
             + "values(620, 500.5, false, 550)",
+        "flush",
+        "INSERT INTO root.ln.wf01.wt01(timestamp,temperature,status, hardware) 
"
+            + "values(1500, 23.3, false, 666)",
+        "INSERT INTO root.ln.wf01.wt01(timestamp,temperature,status, hardware) 
"
+            + "values(1550, -23.3, true, 888)",
+        "flush",
       };
 
   private static final String TIMESTAMP_STR = "Time";
@@ -137,43 +143,43 @@ public class IOTDBGroupByIT {
           "5,3,35.8,11.933333333333332",
           "25,2,70.7,35.35",
           "45,1,50.5,50.5",
-          "65,0,0.0,null",
+          "65,0,null,null",
           "85,1,100.1,100.1",
-          "105,0,0.0,null",
-          "125,0,0.0,null",
+          "105,0,null,null",
+          "125,0,null,null",
           "145,1,200.2,200.2"
         };
     String[] retArray2 =
         new String[] {
           "50,1,50.5,50.5",
-          "60,0,0.0,null",
-          "70,0,0.0,null",
-          "80,0,0.0,null",
-          "90,0,0.0,null",
+          "60,0,null,null",
+          "70,0,null,null",
+          "80,0,null,null",
+          "90,0,null,null",
           "100,1,100.1,100.1",
-          "110,0,0.0,null",
-          "120,0,0.0,null",
-          "130,0,0.0,null",
-          "140,0,0.0,null",
+          "110,0,null,null",
+          "120,0,null,null",
+          "130,0,null,null",
+          "140,0,null,null",
           "150,1,200.2,200.2"
         };
     String[] retArray3 =
         new String[] {
           "25,2,70.7,35.35",
           "45,1,50.5,50.5",
-          "65,0,0.0,null",
+          "65,0,null,null",
           "85,1,100.1,100.1",
-          "105,0,0.0,null",
-          "125,0,0.0,null",
+          "105,0,null,null",
+          "125,0,null,null",
           "145,1,200.2,200.2",
-          "165,0,0.0,null",
+          "165,0,null,null",
           "185,1,300.3,300.3",
-          "205,0,0.0,null",
-          "225,0,0.0,null",
+          "205,0,null,null",
+          "225,0,null,null",
           "245,1,400.4,400.4",
-          "265,0,0.0,null",
+          "265,0,null,null",
           "285,1,500.5,500.5",
-          "305,0,0.0,null"
+          "305,0,null,null"
         };
     try (Connection connection =
             DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/", 
"root", "root");
@@ -735,24 +741,24 @@ public class IOTDBGroupByIT {
         new String[] {
           "0,2,7.7,3.85",
           "30,1,30.3,30.3",
-          "60,0,0.0,null",
-          "90,0,0.0,null",
-          "120,0,0.0,null",
+          "60,0,null,null",
+          "90,0,null,null",
+          "120,0,null,null",
           "150,1,200.2,200.2",
-          "180,0,0.0,null",
-          "210,0,0.0,null",
-          "240,0,0.0,null",
-          "270,0,0.0,null",
+          "180,0,null,null",
+          "210,0,null,null",
+          "240,0,null,null",
+          "270,0,null,null",
           "300,1,500.5,500.5",
-          "330,0,0.0,null",
-          "360,0,0.0,null",
-          "390,0,0.0,null",
-          "420,0,0.0,null",
-          "450,0,0.0,null",
-          "480,0,0.0,null",
+          "330,0,null,null",
+          "360,0,null,null",
+          "390,0,null,null",
+          "420,0,null,null",
+          "450,0,null,null",
+          "480,0,null,null",
           "510,1,200.2,200.2",
           "540,1,500.5,500.5",
-          "570,0,0.0,null"
+          "570,0,null,null"
         };
 
     try (Connection connection =
@@ -817,12 +823,12 @@ public class IOTDBGroupByIT {
     System.out.println("countSumAvgNoDataTest");
     String[] retArray1 =
         new String[] {
-          "10000,0,0.0,null",
-          "10005,0,0.0,null",
-          "10010,0,0.0,null",
-          "10015,0,0.0,null",
-          "10020,0,0.0,null",
-          "10025,0,0.0,null",
+          "10000,0,null,null",
+          "10005,0,null,null",
+          "10010,0,null,null",
+          "10015,0,null,null",
+          "10020,0,null,null",
+          "10025,0,null,null",
         };
 
     try (Connection connection =
@@ -862,7 +868,11 @@ public class IOTDBGroupByIT {
   public void usingLimit() {
     String[] retArray1 =
         new String[] {
-          "90,0,0.0,null", "120,0,0.0,null", "150,1,200.2,200.2", 
"180,0,0.0,null", "210,0,0.0,null"
+          "90,0,null,null",
+          "120,0,null,null",
+          "150,1,200.2,200.2",
+          "180,0,null,null",
+          "210,0,null,null"
         };
 
     try (Connection connection =
@@ -925,6 +935,43 @@ public class IOTDBGroupByIT {
     }
   }
 
+  @Test
+  public void countSumAvgZeroTest() {
+    String ret = "1500,2,0.0,0.0";
+
+    try (Connection connection =
+            DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/", 
"root", "root");
+        Statement statement = connection.createStatement()) {
+      boolean hasResultSet =
+          statement.execute(
+              "select count(temperature), sum(temperature), avg(temperature) 
from "
+                  + "root.ln.wf01.wt01 "
+                  + "GROUP BY ([1500, 1600), 100ms) ");
+
+      Assert.assertTrue(hasResultSet);
+      int cnt;
+      try (ResultSet resultSet = statement.getResultSet()) {
+        cnt = 0;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(count("root.ln.wf01.wt01.temperature"))
+                  + ","
+                  + resultSet.getString(sum("root.ln.wf01.wt01.temperature"))
+                  + ","
+                  + resultSet.getString(avg("root.ln.wf01.wt01.temperature"));
+          Assert.assertEquals(ret, ans);
+          cnt++;
+        }
+        Assert.assertEquals(1, cnt);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
   /**
    * Test group by without aggregation function used in select clause. The 
expected situation is
    * throwing an exception.
diff --git 
a/server/src/test/java/org/apache/iotdb/db/integration/IOTDBGroupByInnerIntervalIT.java
 
b/server/src/test/java/org/apache/iotdb/db/integration/IOTDBGroupByInnerIntervalIT.java
index d68ba21..49faea8 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/integration/IOTDBGroupByInnerIntervalIT.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/integration/IOTDBGroupByInnerIntervalIT.java
@@ -228,7 +228,7 @@ public class IOTDBGroupByInnerIntervalIT {
 
   @Test
   public void countSumAvgInnerIntervalTestWithTimeFilter() {
-    String retArray = "1,0,0.0,null";
+    String retArray = "1,0,null,null";
     double[][] retArray1 = {
       {6.0, 3.0, 23.1, 7.7},
       {11.0, 3.0, 36.6, 12.2},
diff --git 
a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBGroupByMonthIT.java 
b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBGroupByMonthIT.java
index 22e6242..47acc3a 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBGroupByMonthIT.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBGroupByMonthIT.java
@@ -242,7 +242,7 @@ public class IoTDBGroupByMonthIT {
         while (resultSet.next()) {
           String ans = resultSet.getString(sum("root.sg1.d1.temperature"));
           times.add(resultSet.getString("Time"));
-          if (ans.equals("0.0")) {
+          if (ans == null) {
             cnt++;
           }
         }
diff --git 
a/server/src/test/java/org/apache/iotdb/db/integration/aggregation/IoTDBAggregationByLevelIT.java
 
b/server/src/test/java/org/apache/iotdb/db/integration/aggregation/IoTDBAggregationByLevelIT.java
index 9d93381..4057321 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/integration/aggregation/IoTDBAggregationByLevelIT.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/integration/aggregation/IoTDBAggregationByLevelIT.java
@@ -357,7 +357,7 @@ public class IoTDBAggregationByLevelIT {
   public void groupByLevelWithTimeIntervalTest() throws Exception {
     String[] retArray1 =
         new String[] {
-          "0.0", "88.24", "105.5", "0.0", "0.0", "125.5",
+          "null", "88.24", "105.5", "null", "null", "125.5",
         };
     String[] retArray2 =
         new String[] {
@@ -377,7 +377,7 @@ public class IoTDBAggregationByLevelIT {
       int cnt = 0;
       try (ResultSet resultSet = statement.getResultSet()) {
         while (resultSet.next()) {
-          String ans = 
resultSet.getString(TestConstant.sum("root.sg2.*.temperature"));
+          String ans = "" + 
resultSet.getString(TestConstant.sum("root.sg2.*.temperature"));
           Assert.assertEquals(retArray1[cnt], ans);
           cnt++;
         }
@@ -407,7 +407,7 @@ public class IoTDBAggregationByLevelIT {
   public void groupByMultiLevelWithTimeIntervalTest() throws Exception {
     String[] retArray1 =
         new String[] {
-          "0.0", "88.24", "105.5", "0.0", "0.0", "125.5",
+          "null", "88.24", "105.5", "null", "null", "125.5",
         };
     try (Connection connection =
             DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/", 
"root", "root");
@@ -418,7 +418,7 @@ public class IoTDBAggregationByLevelIT {
       int cnt = 0;
       try (ResultSet resultSet = statement.getResultSet()) {
         while (resultSet.next()) {
-          String ans = 
resultSet.getString(TestConstant.sum("root.sg2.*.temperature"));
+          String ans = "" + 
resultSet.getString(TestConstant.sum("root.sg2.*.temperature"));
           Assert.assertEquals(retArray1[cnt], ans);
           cnt++;
         }
diff --git 
a/server/src/test/java/org/apache/iotdb/db/integration/aggregation/IoTDBAggregationSmallDataIT.java
 
b/server/src/test/java/org/apache/iotdb/db/integration/aggregation/IoTDBAggregationSmallDataIT.java
index 37a0c60..b48619a 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/integration/aggregation/IoTDBAggregationSmallDataIT.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/integration/aggregation/IoTDBAggregationSmallDataIT.java
@@ -371,7 +371,7 @@ public class IoTDBAggregationSmallDataIT {
 
   @Test
   public void sumWithoutFilterTest() throws ClassNotFoundException {
-    String[] retArray = new String[] {"0,22610.0,0.0"};
+    String[] retArray = new String[] {"0,22610.0,null"};
 
     Class.forName(Config.JDBC_DRIVER_NAME);
     try (Connection connection =

Reply via email to