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

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


The following commit(s) were added to refs/heads/rel/0.13 by this push:
     new c602d69f0a [To rel/0.13] [IOTDB-3645] Fix use statistics bug in 
aggregation query (#6429)
c602d69f0a is described below

commit c602d69f0af9b34330425de4f0ff259adb7686d1
Author: liuminghui233 <[email protected]>
AuthorDate: Sat Jun 25 10:05:42 2022 +0800

    [To rel/0.13] [IOTDB-3645] Fix use statistics bug in aggregation query 
(#6429)
---
 .../IoTDBGroupByQueryWithoutValueFilter2IT.java    |  3 +-
 ...=> IoTDBGroupByQueryWithoutValueFilter3IT.java} |  7 +-
 .../IoTDBGroupByQueryWithoutValueFilterIT.java     | 43 ++++++++++++
 .../groupby/LocalAlignedGroupByExecutor.java       | 81 +++++++++++-----------
 .../dataset/groupby/LocalGroupByExecutor.java      | 56 +++++++--------
 5 files changed, 117 insertions(+), 73 deletions(-)

diff --git 
a/integration/src/test/java/org/apache/iotdb/db/integration/aligned/IoTDBGroupByQueryWithoutValueFilter2IT.java
 
b/integration/src/test/java/org/apache/iotdb/db/integration/aligned/IoTDBGroupByQueryWithoutValueFilter2IT.java
index 7f08a03329..674d4a4a4d 100644
--- 
a/integration/src/test/java/org/apache/iotdb/db/integration/aligned/IoTDBGroupByQueryWithoutValueFilter2IT.java
+++ 
b/integration/src/test/java/org/apache/iotdb/db/integration/aligned/IoTDBGroupByQueryWithoutValueFilter2IT.java
@@ -37,7 +37,6 @@ public class IoTDBGroupByQueryWithoutValueFilter2IT extends 
IoTDBGroupByQueryWit
   @BeforeClass
   public static void setUp() throws Exception {
     EnvFactory.getEnv().initBeforeClass();
-    // TODO When the aligned time series support compaction, we need to set 
compaction to true
     enableSeqSpaceCompaction =
         IoTDBDescriptor.getInstance().getConfig().isEnableSeqSpaceCompaction();
     enableUnseqSpaceCompaction =
@@ -49,7 +48,7 @@ public class IoTDBGroupByQueryWithoutValueFilter2IT extends 
IoTDBGroupByQueryWit
     ConfigFactory.getConfig().setEnableSeqSpaceCompaction(false);
     ConfigFactory.getConfig().setEnableUnseqSpaceCompaction(false);
     ConfigFactory.getConfig().setEnableCrossSpaceCompaction(false);
-    TSFileDescriptor.getInstance().getConfig().setMaxNumberOfPointsInPage(3);
+    TSFileDescriptor.getInstance().getConfig().setMaxNumberOfPointsInPage(2);
     AlignedWriteUtil.insertData();
   }
 
diff --git 
a/integration/src/test/java/org/apache/iotdb/db/integration/aligned/IoTDBGroupByQueryWithoutValueFilter2IT.java
 
b/integration/src/test/java/org/apache/iotdb/db/integration/aligned/IoTDBGroupByQueryWithoutValueFilter3IT.java
similarity index 89%
copy from 
integration/src/test/java/org/apache/iotdb/db/integration/aligned/IoTDBGroupByQueryWithoutValueFilter2IT.java
copy to 
integration/src/test/java/org/apache/iotdb/db/integration/aligned/IoTDBGroupByQueryWithoutValueFilter3IT.java
index 7f08a03329..193caa0911 100644
--- 
a/integration/src/test/java/org/apache/iotdb/db/integration/aligned/IoTDBGroupByQueryWithoutValueFilter2IT.java
+++ 
b/integration/src/test/java/org/apache/iotdb/db/integration/aligned/IoTDBGroupByQueryWithoutValueFilter3IT.java
@@ -16,28 +16,25 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 package org.apache.iotdb.db.integration.aligned;
 
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 import org.apache.iotdb.integration.env.ConfigFactory;
 import org.apache.iotdb.integration.env.EnvFactory;
-import org.apache.iotdb.itbase.category.LocalStandaloneTest;
 import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
 
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
-import org.junit.experimental.categories.Category;
 
-@Category({LocalStandaloneTest.class})
-public class IoTDBGroupByQueryWithoutValueFilter2IT extends 
IoTDBGroupByQueryWithoutValueFilterIT {
+public class IoTDBGroupByQueryWithoutValueFilter3IT extends 
IoTDBGroupByQueryWithoutValueFilterIT {
 
   private static int numOfPointsPerPage;
 
   @BeforeClass
   public static void setUp() throws Exception {
     EnvFactory.getEnv().initBeforeClass();
-    // TODO When the aligned time series support compaction, we need to set 
compaction to true
     enableSeqSpaceCompaction =
         IoTDBDescriptor.getInstance().getConfig().isEnableSeqSpaceCompaction();
     enableUnseqSpaceCompaction =
diff --git 
a/integration/src/test/java/org/apache/iotdb/db/integration/aligned/IoTDBGroupByQueryWithoutValueFilterIT.java
 
b/integration/src/test/java/org/apache/iotdb/db/integration/aligned/IoTDBGroupByQueryWithoutValueFilterIT.java
index a93a4771aa..02affb2fdd 100644
--- 
a/integration/src/test/java/org/apache/iotdb/db/integration/aligned/IoTDBGroupByQueryWithoutValueFilterIT.java
+++ 
b/integration/src/test/java/org/apache/iotdb/db/integration/aligned/IoTDBGroupByQueryWithoutValueFilterIT.java
@@ -1165,6 +1165,49 @@ public class IoTDBGroupByQueryWithoutValueFilterIT {
     }
   }
 
+  @Test
+  public void groupBySmallWindowTest() throws SQLException {
+    String[] retArray = new String[] {"10,0", "11,1", "12,1", "13,1", "14,1", 
"15,1"};
+    try (Connection connection = EnvFactory.getEnv().getConnection();
+        Statement statement = connection.createStatement()) {
+      boolean hasResultSet =
+          statement.execute("select count(s1) from root.sg1.d1 GROUP BY ([10, 
16), 1ms)");
+      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.sg1.d1.s1"));
+          Assert.assertEquals(retArray[cnt], ans);
+          cnt++;
+        }
+        Assert.assertEquals(retArray.length, cnt);
+      }
+
+      hasResultSet =
+          statement.execute(
+              "select count(s1) from root.sg1.d1 GROUP BY ([10, 16), 1ms) 
order by time desc");
+      Assert.assertTrue(hasResultSet);
+
+      try (ResultSet resultSet = statement.getResultSet()) {
+        cnt = retArray.length;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(count("root.sg1.d1.s1"));
+          Assert.assertEquals(retArray[cnt - 1], ans);
+          cnt--;
+        }
+        Assert.assertEquals(0, cnt);
+      }
+    }
+  }
+
   @Test
   public void groupByWithoutAggregationFuncTest() {
     try (Connection connection = EnvFactory.getEnv().getConnection();
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalAlignedGroupByExecutor.java
 
b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalAlignedGroupByExecutor.java
index 87faffebbb..fd00c3d3e3 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalAlignedGroupByExecutor.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalAlignedGroupByExecutor.java
@@ -124,27 +124,29 @@ public class LocalAlignedGroupByExecutor implements 
AlignedGroupByExecutor {
     // read from file
     while (reader.hasNextFile()) {
       // try to calc from fileMetaData
-      Statistics fileTimeStatistics = reader.currentFileTimeStatistics();
-      if (fileTimeStatistics.getStartTime() >= curEndTime) {
-        if (ascending) {
-          return results;
-        } else {
+      if (reader.canUseCurrentFileStatistics()) {
+        Statistics fileTimeStatistics = reader.currentFileTimeStatistics();
+        if (fileTimeStatistics.getStartTime() >= curEndTime) {
+          if (ascending) {
+            return results;
+          } else {
+            reader.skipCurrentFile();
+            continue;
+          }
+        }
+        if (timeRange.contains(
+            fileTimeStatistics.getStartTime(), 
fileTimeStatistics.getEndTime())) {
+          // calc from fileMetaData
+          while (reader.hasNextSubSeries()) {
+            Statistics currentFileStatistics = reader.currentFileStatistics();
+            calcFromStatistics(currentFileStatistics, 
results.get(reader.getCurIndex()));
+            reader.nextSeries();
+          }
           reader.skipCurrentFile();
           continue;
         }
       }
-      if (reader.canUseCurrentFileStatistics()
-          && timeRange.contains(
-              fileTimeStatistics.getStartTime(), 
fileTimeStatistics.getEndTime())) {
-        // calc from fileMetaData
-        while (reader.hasNextSubSeries()) {
-          Statistics currentFileStatistics = reader.currentFileStatistics();
-          calcFromStatistics(currentFileStatistics, 
results.get(reader.getCurIndex()));
-          reader.nextSeries();
-        }
-        reader.skipCurrentFile();
-        continue;
-      }
+
       // read chunk
       if (readAndCalcFromChunk(curStartTime, curEndTime)) {
         return results;
@@ -175,27 +177,29 @@ public class LocalAlignedGroupByExecutor implements 
AlignedGroupByExecutor {
       throws IOException, QueryProcessException {
     while (reader.hasNextChunk()) {
       // try to calc from chunkMetaData
-      Statistics chunkTimeStatistics = reader.currentChunkTimeStatistics();
-      if (chunkTimeStatistics.getStartTime() >= curEndTime) {
-        if (ascending) {
-          return true;
-        } else {
+      if (reader.canUseCurrentChunkStatistics()) {
+        Statistics chunkTimeStatistics = reader.currentChunkTimeStatistics();
+        if (chunkTimeStatistics.getStartTime() >= curEndTime) {
+          if (ascending) {
+            return true;
+          } else {
+            reader.skipCurrentChunk();
+            continue;
+          }
+        }
+        if (timeRange.contains(
+            chunkTimeStatistics.getStartTime(), 
chunkTimeStatistics.getEndTime())) {
+          // calc from chunkMetaData
+          while (reader.hasNextSubSeries()) {
+            Statistics currentChunkStatistics = 
reader.currentChunkStatistics();
+            calcFromStatistics(currentChunkStatistics, 
results.get(reader.getCurIndex()));
+            reader.nextSeries();
+          }
           reader.skipCurrentChunk();
           continue;
         }
       }
-      if (reader.canUseCurrentChunkStatistics()
-          && timeRange.contains(
-              chunkTimeStatistics.getStartTime(), 
chunkTimeStatistics.getEndTime())) {
-        // calc from chunkMetaData
-        while (reader.hasNextSubSeries()) {
-          Statistics currentChunkStatistics = reader.currentChunkStatistics();
-          calcFromStatistics(currentChunkStatistics, 
results.get(reader.getCurIndex()));
-          reader.nextSeries();
-        }
-        reader.skipCurrentChunk();
-        continue;
-      }
+
       // read page
       if (readAndCalcFromPage(curStartTime, curEndTime)) {
         return true;
@@ -208,8 +212,8 @@ public class LocalAlignedGroupByExecutor implements 
AlignedGroupByExecutor {
       throws IOException, QueryProcessException {
     while (reader.hasNextPage()) {
       // try to calc from pageHeader
-      Statistics pageTimeStatistics = reader.currentPageTimeStatistics();
-      if (pageTimeStatistics != null) {
+      if (reader.canUseCurrentPageStatistics()) {
+        Statistics pageTimeStatistics = reader.currentPageTimeStatistics();
         // current page max than time range
         if (pageTimeStatistics.getStartTime() >= curEndTime) {
           if (ascending) {
@@ -219,9 +223,8 @@ public class LocalAlignedGroupByExecutor implements 
AlignedGroupByExecutor {
             continue;
           }
         }
-        if (reader.canUseCurrentPageStatistics()
-            && timeRange.contains(
-                pageTimeStatistics.getStartTime(), 
pageTimeStatistics.getEndTime())) {
+        if (timeRange.contains(
+            pageTimeStatistics.getStartTime(), 
pageTimeStatistics.getEndTime())) {
           // calc from pageHeader
           while (reader.hasNextSubSeries()) {
             int subIndex = reader.getCurIndex();
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalGroupByExecutor.java
 
b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalGroupByExecutor.java
index fd692c410a..1b96765e21 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalGroupByExecutor.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/dataset/groupby/LocalGroupByExecutor.java
@@ -212,22 +212,23 @@ public class LocalGroupByExecutor implements 
GroupByExecutor {
 
     // read from file first
     while (reader.hasNextFile()) {
-      Statistics fileStatistics = reader.currentFileStatistics();
-      if (fileStatistics.getStartTime() >= curEndTime) {
-        if (ascending) {
-          return results;
-        } else {
+      if (reader.canUseCurrentFileStatistics()) {
+        Statistics fileStatistics = reader.currentFileStatistics();
+        if (fileStatistics.getStartTime() >= curEndTime) {
+          if (ascending) {
+            return results;
+          } else {
+            reader.skipCurrentFile();
+            continue;
+          }
+        }
+        // calc from fileMetaData
+        if (timeRange.contains(fileStatistics.getStartTime(), 
fileStatistics.getEndTime())) {
+          calcFromStatistics(fileStatistics);
           reader.skipCurrentFile();
           continue;
         }
       }
-      // calc from fileMetaData
-      if (reader.canUseCurrentFileStatistics()
-          && timeRange.contains(fileStatistics.getStartTime(), 
fileStatistics.getEndTime())) {
-        calcFromStatistics(fileStatistics);
-        reader.skipCurrentFile();
-        continue;
-      }
 
       // read chunk
       if (readAndCalcFromChunk(curStartTime, curEndTime)) {
@@ -281,22 +282,24 @@ public class LocalGroupByExecutor implements 
GroupByExecutor {
   private boolean readAndCalcFromChunk(long curStartTime, long curEndTime)
       throws IOException, QueryProcessException {
     while (reader.hasNextChunk()) {
-      Statistics chunkStatistics = reader.currentChunkStatistics();
-      if (chunkStatistics.getStartTime() >= curEndTime) {
-        if (ascending) {
-          return true;
-        } else {
+      if (reader.canUseCurrentChunkStatistics()) {
+        Statistics chunkStatistics = reader.currentChunkStatistics();
+        if (chunkStatistics.getStartTime() >= curEndTime) {
+          if (ascending) {
+            return true;
+          } else {
+            reader.skipCurrentChunk();
+            continue;
+          }
+        }
+        // calc from chunkMetaData
+        if (timeRange.contains(chunkStatistics.getStartTime(), 
chunkStatistics.getEndTime())) {
+          calcFromStatistics(chunkStatistics);
           reader.skipCurrentChunk();
           continue;
         }
       }
-      // calc from chunkMetaData
-      if (reader.canUseCurrentChunkStatistics()
-          && timeRange.contains(chunkStatistics.getStartTime(), 
chunkStatistics.getEndTime())) {
-        calcFromStatistics(chunkStatistics);
-        reader.skipCurrentChunk();
-        continue;
-      }
+
       // read page
       if (readAndCalcFromPage(curStartTime, curEndTime)) {
         return true;
@@ -309,9 +312,8 @@ public class LocalGroupByExecutor implements 
GroupByExecutor {
   private boolean readAndCalcFromPage(long curStartTime, long curEndTime)
       throws IOException, QueryProcessException {
     while (reader.hasNextPage()) {
-      Statistics pageStatistics = reader.currentPageStatistics();
-      // must be non overlapped page
-      if (pageStatistics != null) {
+      if (reader.canUseCurrentPageStatistics()) {
+        Statistics pageStatistics = reader.currentPageStatistics();
         // current page max than time range
         if (pageStatistics.getStartTime() >= curEndTime) {
           if (ascending) {

Reply via email to