You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by xi...@apache.org on 2021/06/03 02:35:14 UTC
[iotdb] 01/01: [ISSUE-3316] Query result with the same time range
is inconsistent in group by query
This is an automated email from the ASF dual-hosted git repository.
xiangweiwei pushed a commit to branch 0.11groupbybug
in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit f55cd565b442d1d117cda210d8f3f10d0d6029c0
Author: Alima777 <wx...@gmail.com>
AuthorDate: Thu Jun 3 10:34:25 2021 +0800
[ISSUE-3316] Query result with the same time range is inconsistent in group by query
---
.../iotdb/db/query/reader/series/SeriesReader.java | 3 +-
.../iotdb/db/integration/IoTDBGroupByUnseqIT.java | 96 +++++++++++++++++-----
2 files changed, 76 insertions(+), 23 deletions(-)
diff --git a/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java b/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java
index 46b8c1c..de54f03 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java
@@ -264,11 +264,12 @@ public class SeriesReader {
* first time series metadata is already unpacked, consume cached ChunkMetadata
*/
if (!cachedChunkMetadata.isEmpty()) {
- firstChunkMetadata = cachedChunkMetadata.poll();
+ firstChunkMetadata = cachedChunkMetadata.peek();
unpackAllOverlappedTsFilesToTimeSeriesMetadata(
orderUtils.getOverlapCheckTime(firstChunkMetadata.getStatistics()));
unpackAllOverlappedTimeSeriesMetadataToCachedChunkMetadata(
orderUtils.getOverlapCheckTime(firstChunkMetadata.getStatistics()), false);
+ firstChunkMetadata = cachedChunkMetadata.poll();
}
}
diff --git a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBGroupByUnseqIT.java b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBGroupByUnseqIT.java
index 746b004..834555c 100644
--- a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBGroupByUnseqIT.java
+++ b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBGroupByUnseqIT.java
@@ -26,6 +26,7 @@ import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import org.apache.iotdb.db.conf.IoTDBDescriptor;
+import org.apache.iotdb.db.constant.TestConstant;
import org.apache.iotdb.db.utils.EnvironmentUtils;
import org.apache.iotdb.jdbc.Config;
import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
@@ -59,7 +60,22 @@ public class IoTDBGroupByUnseqIT {
"flush"
};
- private static final String TIMESTAMP_STR = "Time";
+ private static String[] dataSet2 =
+ new String[] {
+ "SET STORAGE GROUP TO root.sg2",
+ "CREATE TIMESERIES root.sg2.d1.s1 WITH DATATYPE=INT32, ENCODING=PLAIN",
+ "INSERT INTO root.sg2.d1(time,s1) values(1, 1)",
+ "INSERT INTO root.sg2.d1(time,s1) values(10, 10)",
+ "flush",
+ "INSERT INTO root.sg2.d1(time,s1) values(19, 19)",
+ "INSERT INTO root.sg2.d1(time,s1) values(30, 30)",
+ "flush",
+ "INSERT INTO root.sg2.d1(time,s1) values(5, 5)",
+ "INSERT INTO root.sg2.d1(time,s1) values(15, 15)",
+ "INSERT INTO root.sg2.d1(time,s1) values(26, 26)",
+ "INSERT INTO root.sg2.d1(time,s1) values(30, 30)",
+ "flush"
+ };
private boolean enableUnseqCompaction;
private int maxNumberOfPointsInPage;
@@ -67,6 +83,7 @@ public class IoTDBGroupByUnseqIT {
@Before
public void setUp() throws Exception {
+ Class.forName(Config.JDBC_DRIVER_NAME);
EnvironmentUtils.closeStatMonitor();
enableUnseqCompaction = IoTDBDescriptor.getInstance().getConfig().isEnableUnseqCompaction();
IoTDBDescriptor.getInstance().getConfig().setEnableUnseqCompaction(false);
@@ -74,24 +91,6 @@ public class IoTDBGroupByUnseqIT {
.getMaxNumberOfPointsInPage();
TSFileDescriptor.getInstance().getConfig().setMaxNumberOfPointsInPage(4);
EnvironmentUtils.envSetUp();
- Class.forName(Config.JDBC_DRIVER_NAME);
- prepareData();
- }
-
-
- private void prepareData() {
- try (Connection connection = DriverManager
- .getConnection(Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root",
- "root");
- Statement statement = connection.createStatement();) {
-
- for (String sql : dataSet1) {
- statement.execute(sql);
- }
-
- } catch (Exception e) {
- e.printStackTrace();
- }
}
@After
@@ -113,15 +112,19 @@ public class IoTDBGroupByUnseqIT {
try (Connection connection = DriverManager.
getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", "root");
Statement statement = connection.createStatement()) {
+
+ for (String sql : dataSet1) {
+ statement.execute(sql);
+ }
+
boolean hasResultSet = statement.execute(
"select count(s1) from root.sg1.d1 group by ([1, 13), 3ms)");
Assert.assertTrue(hasResultSet);
- int cnt;
+ int cnt = 0;
try (ResultSet resultSet = statement.getResultSet()) {
- cnt = 0;
while (resultSet.next()) {
- String ans = resultSet.getString(TIMESTAMP_STR) + "," + resultSet
+ String ans = resultSet.getString(TestConstant.TIMESTAMP_STR) + "," + resultSet
.getString(count("root.sg1.d1.s1"));
Assert.assertEquals(retArray1[cnt], ans);
cnt++;
@@ -133,4 +136,53 @@ public class IoTDBGroupByUnseqIT {
fail(e.getMessage());
}
}
+
+ /**
+ * This test contains two seq files and one unseq file. In the first seq file, it contains two
+ * points: [1, 10]. In the second seq file, it contains two points: [19, 30]. In the unseq file,
+ * it contains two CHUNKS: [5, 15], [26, 30]. The unseq file is overlapped with two seq files.
+ * While the chunk [19,30] in the second seq file is unpacked, it should replace [26,30] as the
+ * first chunk.
+ */
+ @Test
+ public void test2() {
+ String[] retArray1 = new String[] {"5,1", "10,1", "15,2", "20,0", "25,1"};
+
+ int preAvgSeriesPointNumberThreshold =
+ IoTDBDescriptor.getInstance().getConfig().getAvgSeriesPointNumberThreshold();
+ try (Connection connection =
+ DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", "root");
+ Statement statement = connection.createStatement()) {
+
+ IoTDBDescriptor.getInstance().getConfig().setAvgSeriesPointNumberThreshold(2);
+
+ for (String sql : dataSet2) {
+ statement.execute(sql);
+ }
+
+ boolean hasResultSet =
+ statement.execute("select count(s1) from root.sg2.d1 group by ([5, 30), 5ms)");
+
+ Assert.assertTrue(hasResultSet);
+ int cnt = 0;
+ try (ResultSet resultSet = statement.getResultSet()) {
+ while (resultSet.next()) {
+ String ans =
+ resultSet.getString(TestConstant.TIMESTAMP_STR)
+ + ","
+ + resultSet.getString(count("root.sg2.d1.s1"));
+ Assert.assertEquals(retArray1[cnt], ans);
+ cnt++;
+ }
+ Assert.assertEquals(retArray1.length, cnt);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ } finally {
+ IoTDBDescriptor.getInstance()
+ .getConfig()
+ .setAvgSeriesPointNumberThreshold(preAvgSeriesPointNumberThreshold);
+ }
+ }
}