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 =