This is an automated email from the ASF dual-hosted git repository.
tanxinyu 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 32eaa9e simplify the Avg formula on removing redundant operations
(#2868)
32eaa9e is described below
commit 32eaa9eb11352415627b234087ed2e617073b535
Author: Yifu Zhou <[email protected]>
AuthorDate: Fri Mar 19 23:47:15 2021 +0800
simplify the Avg formula on removing redundant operations (#2868)
* simplify the Avg formula on removing redundant operations
* fix test error
* fix error test
* fix
* rerun ci
Co-authored-by: YIFU ZHOU <>
---
.../db/query/aggregation/impl/AvgAggrResult.java | 10 +-
.../integration/IOTDBGroupByInnerIntervalIT.java | 135 ++++++++++----------
.../aggregation/IoTDBAggregationIT.java | 137 +++++++++------------
3 files changed, 128 insertions(+), 154 deletions(-)
diff --git
a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/AvgAggrResult.java
b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/AvgAggrResult.java
index 23842cf..d808c0b 100644
---
a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/AvgAggrResult.java
+++
b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/AvgAggrResult.java
@@ -78,9 +78,7 @@ public class AvgAggrResult extends AggregateResult {
} else {
sum = statistics.getSumDoubleValue();
}
- avg =
- avg * ((double) preCnt / cnt)
- + ((double) statistics.getCount() / cnt) * sum /
statistics.getCount();
+ avg = (avg * preCnt + sum) / cnt;
}
@Override
@@ -140,7 +138,7 @@ public class AvgAggrResult extends AggregateResult {
throw new UnSupportedDataTypeException(
String.format("Unsupported data type in aggregation AVG : %s",
type));
}
- avg = avg * ((double) cnt / (cnt + 1)) + val * (1.0 / (cnt + 1));
+ avg = (avg * cnt + val) / (cnt + 1);
cnt++;
}
@@ -173,9 +171,7 @@ public class AvgAggrResult extends AggregateResult {
// avoid two empty results producing an NaN
return;
}
- avg =
- avg * ((double) cnt / (cnt + anotherAvg.cnt))
- + anotherAvg.avg * ((double) anotherAvg.cnt / (cnt +
anotherAvg.cnt));
+ avg = (avg * cnt + anotherAvg.avg * anotherAvg.cnt) / (cnt +
anotherAvg.cnt);
cnt += anotherAvg.cnt;
}
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 80f2c71..d68ba21 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
@@ -95,6 +95,8 @@ public class IOTDBGroupByInnerIntervalIT {
+ "values(29, 50.5, false, 550)",
};
+ private static final double DETLA = 1e-6;
+
private static final String TIMESTAMP_STR = "Time";
@Before
@@ -112,15 +114,14 @@ public class IOTDBGroupByInnerIntervalIT {
@Test
public void countSumAvgInnerIntervalTest() {
- String[] retArray1 =
- new String[] {
- "1,3,6.6,2.2",
- "6,3,23.1,7.7",
- "11,3,36.599999999999994,12.2",
- "16,2,35.400000000000006,17.700000000000003",
- "21,2,45.5,22.75",
- "26,3,90.9,30.299999999999997"
- };
+ double[][] retArray1 = {
+ {1.0, 3.0, 6.6, 2.2},
+ {6.0, 3.0, 23.1, 7.7},
+ {11.0, 3.0, 36.6, 12.2},
+ {16.0, 2.0, 35.4, 17.7},
+ {21.0, 2.0, 45.5, 22.75},
+ {26.0, 3.0, 90.9, 30.3}
+ };
try (Connection connection =
DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/",
"root", "root");
@@ -136,15 +137,13 @@ public class IOTDBGroupByInnerIntervalIT {
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"));
- assertEquals(retArray1[cnt], ans);
+ double[] ans = new double[4];
+ ans[0] = Double.valueOf(resultSet.getString(TIMESTAMP_STR));
+ ans[1] =
Double.valueOf(resultSet.getString(count("root.ln.wf01.wt01.temperature")));
+ ans[2] =
Double.valueOf(resultSet.getString(sum("root.ln.wf01.wt01.temperature")));
+ ans[3] =
Double.valueOf(resultSet.getString(avg("root.ln.wf01.wt01.temperature")));
+ assertArrayEquals(retArray1[cnt], ans, DETLA);
+
cnt++;
}
assertEquals(retArray1.length, cnt);
@@ -158,15 +157,14 @@ public class IOTDBGroupByInnerIntervalIT {
@Test
public void countSumAvgInnerIntervalTestWithValueFilter() {
- String[] retArray1 =
- new String[] {
- "1,1,3.3,3.3",
- "6,3,23.1,7.7",
- "11,3,36.599999999999994,12.2",
- "16,2,35.400000000000006,17.700000000000003",
- "21,2,45.5,22.75",
- "26,3,90.9,30.299999999999997"
- };
+ double[][] retArray1 = {
+ {1.0, 1.0, 3.3, 3.3},
+ {6.0, 3.0, 23.1, 7.7},
+ {11.0, 3.0, 36.6, 12.2},
+ {16.0, 2.0, 35.4, 17.7},
+ {21.0, 2.0, 45.5, 22.75},
+ {26.0, 3.0, 90.9, 30.3}
+ };
try (Connection connection =
DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/",
"root", "root");
@@ -182,29 +180,26 @@ public class IOTDBGroupByInnerIntervalIT {
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"));
- assertEquals(retArray1[cnt], ans);
+ double[] ans = new double[4];
+ ans[0] = Double.valueOf(resultSet.getString(TIMESTAMP_STR));
+ ans[1] =
Double.valueOf(resultSet.getString(count("root.ln.wf01.wt01.temperature")));
+ ans[2] =
Double.valueOf(resultSet.getString(sum("root.ln.wf01.wt01.temperature")));
+ ans[3] =
Double.valueOf(resultSet.getString(avg("root.ln.wf01.wt01.temperature")));
+ assertArrayEquals(retArray1[cnt], ans, DETLA);
cnt++;
}
assertEquals(retArray1.length, cnt);
}
- String[] retArray2 =
- new String[] {
- "26,3,90.9,30.299999999999997",
- "21,2,45.5,22.75",
- "16,2,35.400000000000006,17.700000000000003",
- "11,3,36.6,12.2",
- "6,3,23.1,7.699999999999999",
- "1,1,3.3,3.3",
- };
+ double[][] retArray2 = {
+ {26.0, 3.0, 90.9, 30.3},
+ {21.0, 2.0, 45.5, 22.75},
+ {16.0, 2.0, 35.4, 17.7},
+ {11.0, 3.0, 36.6, 12.2},
+ {6.0, 3.0, 23.1, 7.7},
+ {1.0, 1.0, 3.3, 3.3}
+ };
+
hasResultSet =
statement.execute(
"select count(temperature), sum(temperature), avg(temperature)
from "
@@ -215,15 +210,12 @@ public class IOTDBGroupByInnerIntervalIT {
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"));
- assertEquals(retArray2[cnt], ans);
+ double[] ans = new double[4];
+ ans[0] = Double.valueOf(resultSet.getString(TIMESTAMP_STR));
+ ans[1] =
Double.valueOf(resultSet.getString(count("root.ln.wf01.wt01.temperature")));
+ ans[2] =
Double.valueOf(resultSet.getString(sum("root.ln.wf01.wt01.temperature")));
+ ans[3] =
Double.valueOf(resultSet.getString(avg("root.ln.wf01.wt01.temperature")));
+ assertArrayEquals(retArray2[cnt], ans, DETLA);
cnt++;
}
assertEquals(retArray2.length, cnt);
@@ -236,15 +228,14 @@ public class IOTDBGroupByInnerIntervalIT {
@Test
public void countSumAvgInnerIntervalTestWithTimeFilter() {
- String[] retArray1 =
- new String[] {
- "1,0,0.0,null",
- "6,3,23.1,7.7",
- "11,3,36.599999999999994,12.2",
- "16,2,35.400000000000006,17.700000000000003",
- "21,2,45.5,22.75",
- "26,3,90.9,30.299999999999997"
- };
+ String retArray = "1,0,0.0,null";
+ double[][] retArray1 = {
+ {6.0, 3.0, 23.1, 7.7},
+ {11.0, 3.0, 36.6, 12.2},
+ {16.0, 2.0, 35.4, 17.7},
+ {21.0, 2.0, 45.5, 22.75},
+ {26.0, 3.0, 90.9, 30.3}
+ };
try (Connection connection =
DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/",
"root", "root");
@@ -254,13 +245,11 @@ public class IOTDBGroupByInnerIntervalIT {
"select count(temperature), sum(temperature), avg(temperature)
from "
+ "root.ln.wf01.wt01 where time > 3"
+ " GROUP BY ([1, 30), 3ms, 5ms)");
-
assertTrue(hasResultSet);
int cnt;
try (ResultSet resultSet = statement.getResultSet()) {
- cnt = 0;
- while (resultSet.next()) {
- String ans =
+ if (resultSet.next()) {
+ String res =
resultSet.getString(TIMESTAMP_STR)
+ ","
+ resultSet.getString(count("root.ln.wf01.wt01.temperature"))
@@ -268,12 +257,20 @@ public class IOTDBGroupByInnerIntervalIT {
+ resultSet.getString(sum("root.ln.wf01.wt01.temperature"))
+ ","
+ resultSet.getString(avg("root.ln.wf01.wt01.temperature"));
- assertEquals(retArray1[cnt], ans);
+ assertEquals(retArray, res);
+ }
+ cnt = 0;
+ while (resultSet.next()) {
+ double[] ans = new double[4];
+ ans[0] = Double.valueOf(resultSet.getString(TIMESTAMP_STR));
+ ans[1] =
Double.valueOf(resultSet.getString(count("root.ln.wf01.wt01.temperature")));
+ ans[2] =
Double.valueOf(resultSet.getString(sum("root.ln.wf01.wt01.temperature")));
+ ans[3] =
Double.valueOf(resultSet.getString(avg("root.ln.wf01.wt01.temperature")));
+ assertArrayEquals(retArray1[cnt], ans, DETLA);
cnt++;
}
assertEquals(retArray1.length, cnt);
}
-
} catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
diff --git
a/server/src/test/java/org/apache/iotdb/db/integration/aggregation/IoTDBAggregationIT.java
b/server/src/test/java/org/apache/iotdb/db/integration/aggregation/IoTDBAggregationIT.java
index 7f5981e..bfdfbf2 100644
---
a/server/src/test/java/org/apache/iotdb/db/integration/aggregation/IoTDBAggregationIT.java
+++
b/server/src/test/java/org/apache/iotdb/db/integration/aggregation/IoTDBAggregationIT.java
@@ -45,10 +45,12 @@ import static
org.apache.iotdb.db.constant.TestConstant.max_value;
import static org.apache.iotdb.db.constant.TestConstant.min_time;
import static org.apache.iotdb.db.constant.TestConstant.min_value;
import static org.apache.iotdb.db.constant.TestConstant.sum;
+import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.fail;
public class IoTDBAggregationIT {
+ private static final double DETLA = 1e-6;
private static final String TIMESTAMP_STR = "Time";
private static final String TEMPERATURE_STR =
"root.ln.wf01.wt01.temperature";
@@ -694,8 +696,11 @@ public class IoTDBAggregationIT {
@Test
public void avgSumTest() {
- String[] retArray =
- new String[] {"0,1.4508E7,7250.374812593702",
"0,626750.0,1250.9980039920158"};
+ double[][] retArray = {
+ {0.0, 1.4508E7, 7250.374812593702},
+ {0.0, 626750.0, 1250.9980039920158}
+ };
+
try (Connection connection =
DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/",
"root", "root");
Statement statement = connection.createStatement()) {
@@ -709,13 +714,11 @@ public class IoTDBAggregationIT {
int cnt = 0;
try (ResultSet resultSet = statement.getResultSet()) {
while (resultSet.next()) {
- String ans =
- resultSet.getString(TIMESTAMP_STR)
- + ","
- + resultSet.getString(sum(d0s0))
- + ","
- + resultSet.getString(avg(d0s2));
- Assert.assertEquals(retArray[cnt], ans);
+ double[] ans = new double[3];
+ ans[0] = Double.valueOf(resultSet.getString(TIMESTAMP_STR));
+ ans[1] = Double.valueOf(resultSet.getString(sum(d0s0)));
+ ans[2] = Double.valueOf(resultSet.getString(avg(d0s2)));
+ assertArrayEquals(retArray[cnt], ans, DETLA);
cnt++;
}
Assert.assertEquals(1, cnt);
@@ -729,13 +732,11 @@ public class IoTDBAggregationIT {
try (ResultSet resultSet = statement.getResultSet()) {
while (resultSet.next()) {
- String ans =
- resultSet.getString(TIMESTAMP_STR)
- + ","
- + resultSet.getString(sum(d0s0))
- + ","
- + resultSet.getString(avg(d0s2));
- Assert.assertEquals(retArray[cnt], ans);
+ double[] ans = new double[3];
+ ans[0] = Double.valueOf(resultSet.getString(TIMESTAMP_STR));
+ ans[1] = Double.valueOf(resultSet.getString(sum(d0s0)));
+ ans[2] = Double.valueOf(resultSet.getString(avg(d0s2)));
+ assertArrayEquals(retArray[cnt], ans, DETLA);
cnt++;
}
Assert.assertEquals(2, cnt);
@@ -751,13 +752,11 @@ public class IoTDBAggregationIT {
cnt = 0;
try (ResultSet resultSet = statement.getResultSet()) {
while (resultSet.next()) {
- String ans =
- resultSet.getString(TIMESTAMP_STR)
- + ","
- + resultSet.getString(sum(d0s0))
- + ","
- + resultSet.getString(avg(d0s2));
- Assert.assertEquals(retArray[cnt], ans);
+ double[] ans = new double[3];
+ ans[0] = Double.valueOf(resultSet.getString(TIMESTAMP_STR));
+ ans[1] = Double.valueOf(resultSet.getString(sum(d0s0)));
+ ans[2] = Double.valueOf(resultSet.getString(avg(d0s2)));
+ assertArrayEquals(retArray[cnt], ans, DETLA);
cnt++;
}
Assert.assertEquals(1, cnt);
@@ -835,13 +834,13 @@ public class IoTDBAggregationIT {
/** test aggregation query with more than one functions on one series */
@Test
public void mergeAggrOnOneSeriesTest() {
- String[] retArray =
- new String[] {
- "0,1.4508E7,7250.374812593702,7250.374812593702,1.4508E7",
- "0,626750.0,1250.9980039920158,1250.9980039920158,626750.0",
- "0,1.4508E7,2001,7250.374812593702,7250.374812593702",
- "0,1.4508E7,2001,7250.374812593702,7250.374812593702,2001,1.4508E7"
- };
+ double[][] retArray = {
+ {0.0, 1.4508E7, 7250.374812593702, 7250.374812593702, 1.4508E7},
+ {0.0, 626750.0, 1250.9980039920158, 1250.9980039920158, 626750.0},
+ {0.0, 1.4508E7, 2001, 7250.374812593702, 7250.374812593702},
+ {0.0, 1.4508E7, 2001, 7250.374812593702, 7250.374812593702, 2001,
1.4508E7}
+ };
+
try (Connection connection =
DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/",
"root", "root");
Statement statement = connection.createStatement()) {
@@ -855,17 +854,13 @@ public class IoTDBAggregationIT {
int cnt = 0;
try (ResultSet resultSet = statement.getResultSet()) {
while (resultSet.next()) {
- String ans =
- resultSet.getString(TIMESTAMP_STR)
- + ","
- + resultSet.getString(sum(d0s0))
- + ","
- + resultSet.getString(avg(d0s2))
- + ","
- + resultSet.getString(avg(d0s0))
- + ","
- + resultSet.getString(sum(d0s2));
- Assert.assertEquals(retArray[cnt], ans);
+ double[] ans = new double[5];
+ ans[0] = Double.valueOf(resultSet.getString(TIMESTAMP_STR));
+ ans[1] = Double.valueOf(resultSet.getString(sum(d0s0)));
+ ans[2] = Double.valueOf(resultSet.getString(avg(d0s2)));
+ ans[3] = Double.valueOf(resultSet.getString(avg(d0s0)));
+ ans[4] = Double.valueOf(resultSet.getString(sum(d0s2)));
+ assertArrayEquals(retArray[cnt], ans, DETLA);
cnt++;
}
Assert.assertEquals(1, cnt);
@@ -879,17 +874,13 @@ public class IoTDBAggregationIT {
try (ResultSet resultSet = statement.getResultSet()) {
while (resultSet.next()) {
- String ans =
- resultSet.getString(TIMESTAMP_STR)
- + ","
- + resultSet.getString(sum(d0s0))
- + ","
- + resultSet.getString(avg(d0s2))
- + ","
- + resultSet.getString(avg(d0s0))
- + ","
- + resultSet.getString(sum(d0s2));
- Assert.assertEquals(retArray[cnt], ans);
+ double[] ans = new double[5];
+ ans[0] = Double.valueOf(resultSet.getString(TIMESTAMP_STR));
+ ans[1] = Double.valueOf(resultSet.getString(sum(d0s0)));
+ ans[2] = Double.valueOf(resultSet.getString(avg(d0s2)));
+ ans[3] = Double.valueOf(resultSet.getString(avg(d0s0)));
+ ans[4] = Double.valueOf(resultSet.getString(sum(d0s2)));
+ assertArrayEquals(retArray[cnt], ans, DETLA);
cnt++;
}
Assert.assertEquals(2, cnt);
@@ -903,17 +894,13 @@ public class IoTDBAggregationIT {
try (ResultSet resultSet = statement.getResultSet()) {
while (resultSet.next()) {
- String ans =
- resultSet.getString(TIMESTAMP_STR)
- + ","
- + resultSet.getString(sum(d0s0))
- + ","
- + resultSet.getString(count(d0s0))
- + ","
- + resultSet.getString(avg(d0s2))
- + ","
- + resultSet.getString(avg(d0s0));
- Assert.assertEquals(retArray[cnt], ans);
+ double[] ans = new double[5];
+ ans[0] = Double.valueOf(resultSet.getString(TIMESTAMP_STR));
+ ans[1] = Double.valueOf(resultSet.getString(sum(d0s0)));
+ ans[2] = Double.valueOf(resultSet.getString(count(d0s0)));
+ ans[3] = Double.valueOf(resultSet.getString(avg(d0s2)));
+ ans[4] = Double.valueOf(resultSet.getString(avg(d0s0)));
+ assertArrayEquals(retArray[cnt], ans, DETLA);
cnt++;
}
Assert.assertEquals(3, cnt);
@@ -927,21 +914,15 @@ public class IoTDBAggregationIT {
try (ResultSet resultSet = statement.getResultSet()) {
while (resultSet.next()) {
- String ans =
- resultSet.getString(TIMESTAMP_STR)
- + ","
- + resultSet.getString(sum(d0s2))
- + ","
- + resultSet.getString(count(d0s0))
- + ","
- + resultSet.getString(avg(d0s2))
- + ","
- + resultSet.getString(avg(d0s1))
- + ","
- + resultSet.getString(count(d0s2))
- + ","
- + resultSet.getString(sum(d0s0));
- Assert.assertEquals(retArray[cnt], ans);
+ double[] ans = new double[7];
+ ans[0] = Double.valueOf(resultSet.getString(TIMESTAMP_STR));
+ ans[1] = Double.valueOf(resultSet.getString(sum(d0s2)));
+ ans[2] = Double.valueOf(resultSet.getString(count(d0s0)));
+ ans[3] = Double.valueOf(resultSet.getString(avg(d0s2)));
+ ans[4] = Double.valueOf(resultSet.getString(avg(d0s1)));
+ ans[5] = Double.valueOf(resultSet.getString(count(d0s2)));
+ ans[6] = Double.valueOf(resultSet.getString(sum(d0s0)));
+ assertArrayEquals(retArray[cnt], ans, DETLA);
cnt++;
}
Assert.assertEquals(4, cnt);