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

spricoder pushed a commit to branch object_type
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/object_type by this push:
     new 70ef28c67e5 fix out of order
70ef28c67e5 is described below

commit 70ef28c67e5f8923fb64020e1d5c80c749822a02
Author: spricoder <[email protected]>
AuthorDate: Thu Jul 10 15:01:33 2025 +0800

    fix out of order
---
 .../utils/model/CompressedTsFileModelReader.java   | 36 ++++++++++++++++------
 1 file changed, 27 insertions(+), 9 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/model/CompressedTsFileModelReader.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/model/CompressedTsFileModelReader.java
index 2849e0657dd..d3098221999 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/model/CompressedTsFileModelReader.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/model/CompressedTsFileModelReader.java
@@ -40,6 +40,8 @@ import org.slf4j.LoggerFactory;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
 import java.util.List;
 
 import static 
org.apache.tsfile.read.reader.chunk.ChunkReader.decryptAndUncompressPageData;
@@ -49,8 +51,24 @@ public class CompressedTsFileModelReader extends ModelReader 
{
 
   @Override
   public List<float[]> penetrate(String filePath, List<List<Integer>> 
startAndEndTimeArray) {
+    int pairSize = startAndEndTimeArray.size();
+    Integer[] indexes = new Integer[pairSize];
+    for (int i = 0; i < pairSize; i++) {
+      indexes[i] = i;
+    }
+    Arrays.sort(
+        indexes,
+        Comparator.comparingInt((Integer i) -> 
startAndEndTimeArray.get(i).get(0))
+            .thenComparingInt(i -> startAndEndTimeArray.get(i).get(1)));
+    List<List<Integer>> sorted = new ArrayList<>();
+
+    for (int sortedIndex = 0; sortedIndex < pairSize; sortedIndex++) {
+      int originalIndex = indexes[sortedIndex];
+      sorted.add(startAndEndTimeArray.get(originalIndex));
+    }
+
     try {
-      List<float[]> results = new ArrayList<>(startAndEndTimeArray.size());
+      List<float[]> results = new ArrayList<>(pairSize);
       int currentQueryIndex = 0;
       int currentResultSetIndex = 0;
       for (List<Integer> ints : startAndEndTimeArray) {
@@ -65,8 +83,8 @@ public class CompressedTsFileModelReader extends ModelReader {
           TimeRange timeRange =
               new TimeRange(chunkMetadata.getStartTime(), 
chunkMetadata.getEndTime());
           boolean overlap = false;
-          for (int i = currentQueryIndex; i < startAndEndTimeArray.size(); 
i++) {
-            List<Integer> startAndEnd = startAndEndTimeArray.get(i);
+          for (int i = currentQueryIndex; i < pairSize; i++) {
+            List<Integer> startAndEnd = sorted.get(i);
             if (timeRange.overlaps(new TimeRange(startAndEnd.get(0), 
startAndEnd.get(1)))) {
               overlap = true;
               break;
@@ -93,8 +111,8 @@ public class CompressedTsFileModelReader extends ModelReader 
{
             TimeRange pageTimeRange =
                 new TimeRange(pageHeader.getStartTime(), 
pageHeader.getEndTime());
             boolean pageOverlap = false;
-            for (int i = currentQueryIndex; i < startAndEndTimeArray.size(); 
i++) {
-              List<Integer> startAndEnd = startAndEndTimeArray.get(i);
+            for (int i = currentQueryIndex; i < pairSize; i++) {
+              List<Integer> startAndEnd = sorted.get(i);
               if (pageTimeRange.overlaps(new TimeRange(startAndEnd.get(0), 
startAndEnd.get(1)))) {
                 pageOverlap = true;
                 break;
@@ -122,18 +140,18 @@ public class CompressedTsFileModelReader extends 
ModelReader {
               uncompressedPageData.get(bitmap);
             }
             while (decoder.hasNext(uncompressedPageData)) {
-              float[] currentQueryResult = results.get(currentQueryIndex);
+              float[] currentQueryResult = 
results.get(indexes[currentQueryIndex]);
               if (currentResultSetIndex >= currentQueryResult.length) {
                 currentQueryIndex++;
                 currentResultSetIndex = 0;
               }
-              if (currentQueryIndex == startAndEndTimeArray.size()) {
+              if (currentQueryIndex == pairSize) {
                 return results;
               }
-              currentQueryResult = results.get(currentQueryIndex);
+              currentQueryResult = results.get(indexes[currentQueryIndex]);
               float v = decoder.readFloat(uncompressedPageData);
 
-              List<Integer> currentQueryStartAndEnd = 
startAndEndTimeArray.get(currentQueryIndex);
+              List<Integer> currentQueryStartAndEnd = 
sorted.get(currentQueryIndex);
               if (index >= currentQueryStartAndEnd.get(0)
                   && index <= currentQueryStartAndEnd.get(1)) {
                 currentQueryResult[currentResultSetIndex++] = v;

Reply via email to