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 <[email protected]> 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); + } + } }
