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

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

commit d6a7d0a91ad3b1efc7ad5ce2f077b56aa7c9310e
Author: shuwenwei <[email protected]>
AuthorDate: Wed Jul 2 15:38:11 2025 +0800

    add more checkpoints in series scan
---
 .../AbstractSeriesAggregationScanOperator.java     |  72 ++-
 .../source/AbstractSeriesScanOperator.java         |  43 +-
 .../execution/operator/source/SeriesScanUtil.java  |  46 +-
 .../relational/AbstractAggTableScanOperator.java   |  75 ++-
 .../AbstractDefaultAggTableScanOperator.java       |   4 +-
 .../relational/AbstractTableScanOperator.java      |  16 +-
 .../relational/LastQueryAggTableScanOperator.java  |   4 +-
 .../utils/reader/SeriesDataBlockReader.java        |  20 +-
 .../AlignedSeriesScanLimitOffsetPushDownTest.java  | 608 +++++++++---------
 .../AlignedSeriesScanPredicatePushDownTest.java    | 465 +++++++-------
 ...gleColumnSeriesScanLimitOffsetPushDownTest.java | 402 ++++++------
 .../series/SeriesScanLimitOffsetPushDownTest.java  | 500 +++++++--------
 .../series/SeriesScanPredicatePushDownTest.java    | 692 +++++++++++----------
 13 files changed, 1540 insertions(+), 1407 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/AbstractSeriesAggregationScanOperator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/AbstractSeriesAggregationScanOperator.java
index 1a289ef1fd7..6f59deb17a5 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/AbstractSeriesAggregationScanOperator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/AbstractSeriesAggregationScanOperator.java
@@ -35,6 +35,7 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.TimeUnit;
 
 import static 
org.apache.iotdb.db.queryengine.execution.operator.AggregationUtil.appendAggregationResult;
@@ -140,7 +141,11 @@ public abstract class 
AbstractSeriesAggregationScanOperator extends AbstractData
 
       // calculate aggregation result on current time window
       // Keep curTimeRange if the calculation of this timeRange is not done
-      if (calculateAggregationResultForCurrentTimeRange()) {
+      Optional<Boolean> b = calculateAggregationResultForCurrentTimeRange();
+      if (!b.isPresent()) {
+        continue;
+      }
+      if (b.get()) {
         curTimeRange = null;
       }
     }
@@ -164,41 +169,60 @@ public abstract class 
AbstractSeriesAggregationScanOperator extends AbstractData
 
   @SuppressWarnings("squid:S112")
   /** Return true if we have the result of this timeRange. */
-  protected boolean calculateAggregationResultForCurrentTimeRange() {
+  protected Optional<Boolean> calculateAggregationResultForCurrentTimeRange() {
     try {
       if (calcFromCachedData()) {
         updateResultTsBlock();
-        return true;
+        return Optional.of(true);
       }
 
       if (readAndCalcFromPage()) {
         updateResultTsBlock();
-        return true;
+        return Optional.of(true);
       }
 
       // only when all the page data has been consumed, we need to read the 
chunk data
       if (!seriesScanUtil.hasNextPage() && readAndCalcFromChunk()) {
         updateResultTsBlock();
-        return true;
+        return Optional.of(true);
       }
 
       // only when all the page and chunk data has been consumed, we need to 
read the file data
-      if (!seriesScanUtil.hasNextPage()
-          && !seriesScanUtil.hasNextChunk()
-          && readAndCalcFromFile()) {
-        updateResultTsBlock();
-        return true;
+      Optional<Boolean> b;
+      if (!seriesScanUtil.hasNextPage()) {
+        b = seriesScanUtil.hasNextChunk();
+        if (!b.isPresent()) {
+          return b;
+        }
+        if (!b.get()) {
+          if (readAndCalcFromFile()) {
+            updateResultTsBlock();
+            return Optional.of(true);
+          }
+        }
       }
 
       // If the TimeRange is (Long.MIN_VALUE, Long.MAX_VALUE), for Aggregators 
like countAggregator,
       // we have to consume all the data before we finish the aggregation 
calculation.
-      if (seriesScanUtil.hasNextPage()
-          || seriesScanUtil.hasNextChunk()
-          || seriesScanUtil.hasNextFile()) {
-        return false;
+      if (seriesScanUtil.hasNextPage()) {
+        return Optional.of(false);
+      }
+      b = seriesScanUtil.hasNextChunk();
+      if (!b.isPresent()) {
+        return b;
+      }
+      if (b.get()) {
+        return Optional.of(false);
+      }
+      b = seriesScanUtil.hasNextFile();
+      if (!b.isPresent()) {
+        return b;
+      }
+      if (b.get()) {
+        return Optional.of(false);
       }
       updateResultTsBlock();
-      return true;
+      return Optional.of(true);
     } catch (IOException e) {
       throw new RuntimeException("Error while scanning the file", e);
     }
@@ -241,7 +265,14 @@ public abstract class 
AbstractSeriesAggregationScanOperator extends AbstractData
   protected boolean readAndCalcFromFile() throws IOException {
     // start stopwatch
     long start = System.nanoTime();
-    while (System.nanoTime() - start < leftRuntimeOfOneNextCall && 
seriesScanUtil.hasNextFile()) {
+    while (System.nanoTime() - start < leftRuntimeOfOneNextCall) {
+      Optional<Boolean> b = seriesScanUtil.hasNextFile();
+      if (!b.isPresent()) {
+        continue;
+      }
+      if (!b.get()) {
+        break;
+      }
       if (canUseStatistics && seriesScanUtil.canUseCurrentFileStatistics()) {
         Statistics fileTimeStatistics = 
seriesScanUtil.currentFileTimeStatistics();
         if (fileTimeStatistics.getStartTime() > curTimeRange.getMax()) {
@@ -282,7 +313,14 @@ public abstract class 
AbstractSeriesAggregationScanOperator extends AbstractData
   protected boolean readAndCalcFromChunk() throws IOException {
     // start stopwatch
     long start = System.nanoTime();
-    while (System.nanoTime() - start < leftRuntimeOfOneNextCall && 
seriesScanUtil.hasNextChunk()) {
+    while (System.nanoTime() - start < leftRuntimeOfOneNextCall) {
+      Optional<Boolean> b = seriesScanUtil.hasNextChunk();
+      if (!b.isPresent()) {
+        continue;
+      }
+      if (!b.get()) {
+        break;
+      }
       if (canUseStatistics && seriesScanUtil.canUseCurrentChunkStatistics()) {
         Statistics chunkTimeStatistics = 
seriesScanUtil.currentChunkTimeStatistics();
         if (chunkTimeStatistics.getStartTime() > curTimeRange.getMax()) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/AbstractSeriesScanOperator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/AbstractSeriesScanOperator.java
index c03764bd61c..c798670ae67 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/AbstractSeriesScanOperator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/AbstractSeriesScanOperator.java
@@ -24,6 +24,7 @@ import org.apache.tsfile.read.common.block.TsBlock;
 
 import java.io.IOException;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.TimeUnit;
 
 public abstract class AbstractSeriesScanOperator extends 
AbstractDataSourceOperator {
@@ -70,10 +71,19 @@ public abstract class AbstractSeriesScanOperator extends 
AbstractDataSourceOpera
          * 2. consume chunk data secondly
          * 3. consume next file finally
          */
-        if (!readPageData() && !readChunkData() && !readFileData()) {
-          noMoreData = true;
-          break;
+        if (readPageData()) {
+          continue;
         }
+        Optional<Boolean> b = readChunkData();
+        if (!b.isPresent() || b.get()) {
+          continue;
+        }
+        b = readFileData();
+        if (!b.isPresent() || b.get()) {
+          continue;
+        }
+        noMoreData = true;
+        break;
 
       } while (System.nanoTime() - start < maxRuntime
           && !resultTsBlockBuilder.isFull()
@@ -87,22 +97,31 @@ public abstract class AbstractSeriesScanOperator extends 
AbstractDataSourceOpera
     }
   }
 
-  protected boolean readFileData() throws IOException {
-    while (seriesScanUtil.hasNextFile()) {
-      if (readChunkData()) {
-        return true;
+  protected Optional<Boolean> readFileData() throws IOException {
+    while (true) {
+      Optional<Boolean> b = seriesScanUtil.hasNextFile();
+      if (!b.isPresent() || !b.get()) {
+        return b;
       }
+      b = readChunkData();
+      if (!b.isPresent() || !b.get()) {
+        return b;
+      }
+      return Optional.of(true);
     }
-    return false;
   }
 
-  protected boolean readChunkData() throws IOException {
-    while (seriesScanUtil.hasNextChunk()) {
+  protected Optional<Boolean> readChunkData() throws IOException {
+    while (true) {
+      Optional<Boolean> b = seriesScanUtil.hasNextChunk();
+      if (!b.isPresent() || !b.get()) {
+        return b;
+      }
+
       if (readPageData()) {
-        return true;
+        return Optional.of(true);
       }
     }
-    return false;
   }
 
   protected boolean readPageData() throws IOException {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/SeriesScanUtil.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/SeriesScanUtil.java
index b9b500ad83e..14b43814f88 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/SeriesScanUtil.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/SeriesScanUtil.java
@@ -219,9 +219,9 @@ public class SeriesScanUtil implements Accountable {
   // file level methods
   
/////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public boolean hasNextFile() throws IOException {
+  public Optional<Boolean> hasNextFile() throws IOException {
     if (!paginationController.hasCurLimit()) {
-      return false;
+      return Optional.of(false);
     }
 
     if (!unSeqPageReaders.isEmpty()
@@ -241,21 +241,25 @@ public class SeriesScanUtil implements Accountable {
     }
 
     if (firstTimeSeriesMetadata != null) {
-      return true;
+      return Optional.of(true);
     }
 
-    while (firstTimeSeriesMetadata == null
-        && (orderUtils.hasNextSeqResource()
-            || orderUtils.hasNextUnseqResource()
-            || !seqTimeSeriesMetadata.isEmpty()
-            || !unSeqTimeSeriesMetadata.isEmpty())) {
+    boolean checked = false;
+    if (orderUtils.hasNextSeqResource()
+        || orderUtils.hasNextUnseqResource()
+        || !seqTimeSeriesMetadata.isEmpty()
+        || !unSeqTimeSeriesMetadata.isEmpty()) {
       // init first time series metadata whose startTime is minimum
       tryToUnpackAllOverlappedFilesToTimeSeriesMetadata();
       // filter file based on push-down conditions
       filterFirstTimeSeriesMetadata();
+      checked = true;
     }
 
-    return firstTimeSeriesMetadata != null;
+    if (checked && firstTimeSeriesMetadata == null) {
+      return Optional.empty();
+    }
+    return Optional.of(firstTimeSeriesMetadata != null);
   }
 
   private boolean currentFileOverlapped() {
@@ -301,9 +305,9 @@ public class SeriesScanUtil implements Accountable {
    *
    * @throws IllegalStateException illegal state
    */
-  public boolean hasNextChunk() throws IOException {
+  public Optional<Boolean> hasNextChunk() throws IOException {
     if (!paginationController.hasCurLimit()) {
-      return false;
+      return Optional.of(false);
     }
 
     if (!unSeqPageReaders.isEmpty()
@@ -319,18 +323,30 @@ public class SeriesScanUtil implements Accountable {
     }
 
     if (firstChunkMetadata != null) {
-      return true;
+      return Optional.of(true);
       // hasNextFile() has not been invoked
     } else if (firstTimeSeriesMetadata == null && 
cachedChunkMetadata.isEmpty()) {
-      return false;
+      return Optional.of(false);
     }
 
-    while (firstChunkMetadata == null && (!cachedChunkMetadata.isEmpty() || 
hasNextFile())) {
+    Optional<Boolean> hasNextFileReturnValue = null;
+    while (firstChunkMetadata == null && hasNextFileReturnValue == null) {
+      if (cachedChunkMetadata.isEmpty()) {
+        hasNextFileReturnValue = hasNextFile();
+        if (!hasNextFileReturnValue.isPresent() || 
!hasNextFileReturnValue.get()) {
+          break;
+        }
+      }
       initFirstChunkMetadata();
       // filter chunk based on push-down conditions
       filterFirstChunkMetadata();
     }
-    return firstChunkMetadata != null;
+    if (hasNextFileReturnValue != null
+        && !hasNextFileReturnValue.isPresent()
+        && firstChunkMetadata == null) {
+      return hasNextFileReturnValue;
+    }
+    return Optional.of(firstChunkMetadata != null);
   }
 
   private void filterFirstChunkMetadata() {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/AbstractAggTableScanOperator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/AbstractAggTableScanOperator.java
index dd96578ab92..a59ec643b07 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/AbstractAggTableScanOperator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/AbstractAggTableScanOperator.java
@@ -193,48 +193,63 @@ public abstract class AbstractAggTableScanOperator 
extends AbstractDataSourceOpe
   }
 
   /** Return true if we have the result of this timeRange. */
-  protected boolean calculateAggregationResultForCurrentTimeRange() {
+  protected Optional<Boolean> calculateAggregationResultForCurrentTimeRange() {
     try {
       if (calcFromCachedData()) {
         updateResultTsBlock();
         checkIfAllAggregatorHasFinalResult();
-        return true;
+        return Optional.of(true);
       }
 
       if (readAndCalcFromPage()) {
         updateResultTsBlock();
         checkIfAllAggregatorHasFinalResult();
-        return true;
+        return Optional.of(true);
       }
 
       // only when all the page data has been consumed, we need to read the 
chunk data
       if (!seriesScanUtil.hasNextPage() && readAndCalcFromChunk()) {
         updateResultTsBlock();
         checkIfAllAggregatorHasFinalResult();
-        return true;
+        return Optional.of(true);
       }
 
       // only when all the page and chunk data has been consumed, we need to 
read the file data
-      if (!seriesScanUtil.hasNextPage()
-          && !seriesScanUtil.hasNextChunk()
-          && readAndCalcFromFile()) {
-        updateResultTsBlock();
-        checkIfAllAggregatorHasFinalResult();
-        return true;
+      if (!seriesScanUtil.hasNextPage()) {
+        Optional<Boolean> b = seriesScanUtil.hasNextChunk();
+        if (!b.isPresent()) {
+          return b;
+        }
+        if (!b.get() && readAndCalcFromFile()) {
+          updateResultTsBlock();
+          checkIfAllAggregatorHasFinalResult();
+          return Optional.of(true);
+        }
       }
 
       // If the TimeRange is (Long.MIN_VALUE, Long.MAX_VALUE), for Aggregators 
like countAggregator,
       // we have to consume all the data before we finish the aggregation 
calculation.
-      if (seriesScanUtil.hasNextPage()
-          || seriesScanUtil.hasNextChunk()
-          || seriesScanUtil.hasNextFile()) {
-        return false;
-      } else {
-        // all data of current device has been consumed
-        updateResultTsBlock();
-        timeIterator.resetCurTimeRange();
-        nextDevice();
+      if (seriesScanUtil.hasNextPage()) {
+        return Optional.of(false);
+      }
+      Optional<Boolean> b = seriesScanUtil.hasNextChunk();
+      if (!b.isPresent()) {
+        return b;
+      }
+      if (b.get()) {
+        return Optional.of(false);
+      }
+      b = seriesScanUtil.hasNextFile();
+      if (!b.isPresent()) {
+        return b;
       }
+      if (b.get()) {
+        return Optional.of(false);
+      }
+      // all data of current device has been consumed
+      updateResultTsBlock();
+      timeIterator.resetCurTimeRange();
+      nextDevice();
 
       if (currentDeviceIndex < deviceCount) {
         // construct AlignedSeriesScanUtil for next device
@@ -246,9 +261,9 @@ public abstract class AbstractAggTableScanOperator extends 
AbstractDataSourceOpe
       if (currentDeviceIndex >= deviceCount) {
         // all devices have been consumed
         timeIterator.setFinished();
-        return true;
+        return Optional.of(true);
       } else {
-        return false;
+        return Optional.of(false);
       }
     } catch (IOException e) {
       throw new RuntimeException("Error while scanning the file", e);
@@ -452,7 +467,14 @@ public abstract class AbstractAggTableScanOperator extends 
AbstractDataSourceOpe
   public boolean readAndCalcFromFile() throws IOException {
     // start stopwatch
     long start = System.nanoTime();
-    while (System.nanoTime() - start < leftRuntimeOfOneNextCall && 
seriesScanUtil.hasNextFile()) {
+    while (System.nanoTime() - start < leftRuntimeOfOneNextCall) {
+      Optional<Boolean> b = seriesScanUtil.hasNextFile();
+      if (!b.isPresent()) {
+        continue;
+      }
+      if (!b.get()) {
+        break;
+      }
       if (canUseStatistics && seriesScanUtil.canUseCurrentFileStatistics()) {
         Statistics fileTimeStatistics = 
seriesScanUtil.currentFileTimeStatistics();
 
@@ -498,7 +520,14 @@ public abstract class AbstractAggTableScanOperator extends 
AbstractDataSourceOpe
   protected boolean readAndCalcFromChunk() throws IOException {
     // start stopwatch
     long start = System.nanoTime();
-    while (System.nanoTime() - start < leftRuntimeOfOneNextCall && 
seriesScanUtil.hasNextChunk()) {
+    while (System.nanoTime() - start < leftRuntimeOfOneNextCall) {
+      Optional<Boolean> b = seriesScanUtil.hasNextChunk();
+      if (!b.isPresent()) {
+        continue;
+      }
+      if (!b.get()) {
+        break;
+      }
       if (canUseStatistics && seriesScanUtil.canUseCurrentChunkStatistics()) {
         Statistics chunkTimeStatistics = 
seriesScanUtil.currentChunkTimeStatistics();
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/AbstractDefaultAggTableScanOperator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/AbstractDefaultAggTableScanOperator.java
index ba7e1a226fe..56eddc11533 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/AbstractDefaultAggTableScanOperator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/AbstractDefaultAggTableScanOperator.java
@@ -27,6 +27,7 @@ import org.apache.tsfile.read.common.block.TsBlock;
 import org.apache.tsfile.read.common.block.column.RunLengthEncodedColumn;
 import org.apache.tsfile.utils.RamUsageEstimator;
 
+import java.util.Optional;
 import java.util.concurrent.TimeUnit;
 
 import static 
org.apache.iotdb.db.queryengine.execution.operator.source.relational.AbstractTableScanOperator.TIME_COLUMN_TEMPLATE;
@@ -77,7 +78,8 @@ public abstract class AbstractDefaultAggTableScanOperator 
extends AbstractAggTab
 
       // calculate aggregation result on current time window
       // return true if current time window is calc finished
-      if (calculateAggregationResultForCurrentTimeRange()) {
+      Optional<Boolean> b = calculateAggregationResultForCurrentTimeRange();
+      if (b.isPresent() && b.get()) {
         timeIterator.resetCurTimeRange();
       }
     }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/AbstractTableScanOperator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/AbstractTableScanOperator.java
index 96de6f92e10..151dd6f3f25 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/AbstractTableScanOperator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/AbstractTableScanOperator.java
@@ -142,11 +142,19 @@ public abstract class AbstractTableScanOperator extends 
AbstractSeriesScanOperat
          * 2. consume chunk data secondly
          * 3. consume next file finally
          */
-        if (!readPageData() && !readChunkData() && !readFileData()) {
-          currentDeviceNoMoreData = true;
-          break;
+        if (readPageData()) {
+          continue;
         }
-
+        Optional<Boolean> b = readChunkData();
+        if (!b.isPresent() || b.get()) {
+          continue;
+        }
+        b = readFileData();
+        if (!b.isPresent() || b.get()) {
+          continue;
+        }
+        currentDeviceNoMoreData = true;
+        break;
       } while (System.nanoTime() - start < maxRuntime
           && !measurementDataBuilder.isFull()
           && measurementDataBlock == null);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/LastQueryAggTableScanOperator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/LastQueryAggTableScanOperator.java
index 9b34de4b7dd..df487f06c60 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/LastQueryAggTableScanOperator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/LastQueryAggTableScanOperator.java
@@ -44,6 +44,7 @@ import org.apache.tsfile.write.UnSupportedDataTypeException;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 import java.util.OptionalLong;
 import java.util.concurrent.TimeUnit;
 
@@ -147,7 +148,8 @@ public class LastQueryAggTableScanOperator extends 
AbstractAggTableScanOperator
       return;
     }
 
-    if (calculateAggregationResultForCurrentTimeRange()) {
+    Optional<Boolean> b = calculateAggregationResultForCurrentTimeRange();
+    if (b.isPresent() && b.get()) {
       timeIterator.resetCurTimeRange();
     }
   }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/reader/SeriesDataBlockReader.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/reader/SeriesDataBlockReader.java
index 4df98ddb9bb..a49b97c8f52 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/reader/SeriesDataBlockReader.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/reader/SeriesDataBlockReader.java
@@ -37,6 +37,7 @@ import org.apache.tsfile.read.common.block.TsBlock;
 import java.io.IOException;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 
 public class SeriesDataBlockReader implements IDataBlockReader {
@@ -134,7 +135,14 @@ public class SeriesDataBlockReader implements 
IDataBlockReader {
     /*
      * consume next file finally
      */
-    while (seriesScanUtil.hasNextFile()) {
+    while (true) {
+      Optional<Boolean> b = seriesScanUtil.hasNextFile();
+      if (!b.isPresent()) {
+        continue;
+      }
+      if (!b.get()) {
+        break;
+      }
       if (readChunkData()) {
         hasCachedBatchData = true;
         return true;
@@ -158,7 +166,15 @@ public class SeriesDataBlockReader implements 
IDataBlockReader {
   }
 
   private boolean readChunkData() throws IOException {
-    while (seriesScanUtil.hasNextChunk()) {
+    while (true) {
+      Optional<Boolean> b = seriesScanUtil.hasNextChunk();
+      if (!b.isPresent()) {
+        // This reader is used for compaction, just keep traversing
+        continue;
+      }
+      if (!b.get()) {
+        break;
+      }
       if (readPageData()) {
         return true;
       }
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/AlignedSeriesScanLimitOffsetPushDownTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/AlignedSeriesScanLimitOffsetPushDownTest.java
index 8370634070a..d57139fb8cf 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/AlignedSeriesScanLimitOffsetPushDownTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/AlignedSeriesScanLimitOffsetPushDownTest.java
@@ -1,304 +1,304 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.iotdb.db.storageengine.dataregion.read.reader.series;
-
-import org.apache.iotdb.commons.exception.IllegalPathException;
-import org.apache.iotdb.commons.path.AlignedFullPath;
-import 
org.apache.iotdb.db.queryengine.execution.operator.source.AlignedSeriesScanUtil;
-import 
org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.SeriesScanOptions;
-import org.apache.iotdb.db.queryengine.plan.statement.component.Ordering;
-import org.apache.iotdb.db.storageengine.dataregion.read.QueryDataSource;
-import org.apache.iotdb.db.utils.EnvironmentUtils;
-
-import org.apache.tsfile.enums.TSDataType;
-import org.apache.tsfile.read.common.block.TsBlock;
-import org.apache.tsfile.write.schema.MeasurementSchema;
-import org.junit.Assert;
-import org.junit.Test;
-
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.HashSet;
-
-public class AlignedSeriesScanLimitOffsetPushDownTest extends 
AbstractAlignedSeriesScanTest {
-
-  private AlignedSeriesScanUtil getAlignedSeriesScanUtil(long limit, long 
offset)
-      throws IllegalPathException {
-    AlignedFullPath scanPath =
-        new AlignedFullPath(
-            TEST_DEVICE,
-            Arrays.asList("s1", "s2"),
-            Arrays.asList(
-                new MeasurementSchema("s1", TSDataType.INT32),
-                new MeasurementSchema("s2", TSDataType.INT32)));
-
-    SeriesScanOptions.Builder scanOptionsBuilder = new 
SeriesScanOptions.Builder();
-    scanOptionsBuilder.withAllSensors(new 
HashSet<>(scanPath.getMeasurementList()));
-    scanOptionsBuilder.withPushDownLimit(limit);
-    scanOptionsBuilder.withPushDownOffset(offset);
-    AlignedSeriesScanUtil seriesScanUtil =
-        new AlignedSeriesScanUtil(
-            scanPath,
-            Ordering.ASC,
-            scanOptionsBuilder.build(),
-            EnvironmentUtils.TEST_QUERY_FI_CONTEXT);
-    seriesScanUtil.initQueryDataSource(new QueryDataSource(seqResources, 
unSeqResources));
-    return seriesScanUtil;
-  }
-
-  @Test
-  public void testSkipFile() throws IllegalPathException, IOException {
-    AlignedSeriesScanUtil seriesScanUtil = getAlignedSeriesScanUtil(5, 10);
-
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    TsBlock tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(5, tsBlock.getPositionCount());
-    long expectedTime = 10;
-    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
-      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
-    }
-
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.hasNextChunk());
-    Assert.assertFalse(seriesScanUtil.hasNextFile());
-  }
-
-  @Test
-  public void testCannotSkipFile() throws IllegalPathException, IOException {
-    AlignedSeriesScanUtil seriesScanUtil = getAlignedSeriesScanUtil(5, 20);
-
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    TsBlock tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(0, tsBlock.getPositionCount());
-
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.hasNextChunk());
-
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(5, tsBlock.getPositionCount());
-    long expectedTime = 20;
-    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
-      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
-    }
-  }
-
-  @Test
-  public void testSkipChunk() throws IllegalPathException, IOException {
-    AlignedSeriesScanUtil seriesScanUtil = getAlignedSeriesScanUtil(5, 30);
-
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    TsBlock tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(0, tsBlock.getPositionCount());
-
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.hasNextChunk());
-
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(5, tsBlock.getPositionCount());
-    long expectedTime = 30;
-    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
-      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
-    }
-  }
-
-  @Test
-  public void testCannotSkipChunk() throws IllegalPathException, IOException {
-    AlignedSeriesScanUtil seriesScanUtil = getAlignedSeriesScanUtil(5, 40);
-
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    TsBlock tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(0, tsBlock.getPositionCount());
-
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.hasNextChunk());
-
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(0, tsBlock.getPositionCount());
-
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.hasNextChunk());
-
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(5, tsBlock.getPositionCount());
-    long expectedTime = 40;
-    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
-      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
-    }
-  }
-
-  @Test
-  public void testSkipPage() throws IllegalPathException, IOException {
-    AlignedSeriesScanUtil seriesScanUtil = getAlignedSeriesScanUtil(5, 50);
-
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    TsBlock tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(0, tsBlock.getPositionCount());
-
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.hasNextChunk());
-
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(0, tsBlock.getPositionCount());
-
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.hasNextChunk());
-
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(5, tsBlock.getPositionCount());
-    long expectedTime = 50;
-    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
-      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
-    }
-  }
-
-  @Test
-  public void testCannotSkipPage() throws IllegalPathException, IOException {
-    AlignedSeriesScanUtil seriesScanUtil = getAlignedSeriesScanUtil(5, 60);
-
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    TsBlock tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(0, tsBlock.getPositionCount());
-
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.hasNextChunk());
-
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(0, tsBlock.getPositionCount());
-
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.hasNextChunk());
-
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(0, tsBlock.getPositionCount());
-
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(5, tsBlock.getPositionCount());
-    long expectedTime = 60;
-    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
-      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
-    }
-  }
-
-  @Test
-  public void testSkipPoint() throws IllegalPathException, IOException {
-    AlignedSeriesScanUtil seriesScanUtil = getAlignedSeriesScanUtil(10, 75);
-
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    TsBlock tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(0, tsBlock.getPositionCount());
-
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.hasNextChunk());
-
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(0, tsBlock.getPositionCount());
-
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.hasNextChunk());
-
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(0, tsBlock.getPositionCount());
-
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(5, tsBlock.getPositionCount());
-    long expectedTime = 75;
-    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
-      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
-    }
-
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(5, tsBlock.getPositionCount());
-    expectedTime = 80;
-    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
-      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
-    }
-  }
-}
+/// *
+// * Licensed to the Apache Software Foundation (ASF) under one
+// * or more contributor license agreements.  See the NOTICE file
+// * distributed with this work for additional information
+// * regarding copyright ownership.  The ASF licenses this file
+// * to you under the Apache License, Version 2.0 (the
+// * "License"); you may not use this file except in compliance
+// * with the License.  You may obtain a copy of the License at
+// *
+// *     http://www.apache.org/licenses/LICENSE-2.0
+// *
+// * Unless required by applicable law or agreed to in writing,
+// * software distributed under the License is distributed on an
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// * KIND, either express or implied.  See the License for the
+// * specific language governing permissions and limitations
+// * under the License.
+// */
+//
+// package org.apache.iotdb.db.storageengine.dataregion.read.reader.series;
+//
+// import org.apache.iotdb.commons.exception.IllegalPathException;
+// import org.apache.iotdb.commons.path.AlignedFullPath;
+// import 
org.apache.iotdb.db.queryengine.execution.operator.source.AlignedSeriesScanUtil;
+// import 
org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.SeriesScanOptions;
+// import org.apache.iotdb.db.queryengine.plan.statement.component.Ordering;
+// import org.apache.iotdb.db.storageengine.dataregion.read.QueryDataSource;
+// import org.apache.iotdb.db.utils.EnvironmentUtils;
+//
+// import org.apache.tsfile.enums.TSDataType;
+// import org.apache.tsfile.read.common.block.TsBlock;
+// import org.apache.tsfile.write.schema.MeasurementSchema;
+// import org.junit.Assert;
+// import org.junit.Test;
+//
+// import java.io.IOException;
+// import java.util.Arrays;
+// import java.util.HashSet;
+//
+// public class AlignedSeriesScanLimitOffsetPushDownTest extends 
AbstractAlignedSeriesScanTest {
+//
+//  private AlignedSeriesScanUtil getAlignedSeriesScanUtil(long limit, long 
offset)
+//      throws IllegalPathException {
+//    AlignedFullPath scanPath =
+//        new AlignedFullPath(
+//            TEST_DEVICE,
+//            Arrays.asList("s1", "s2"),
+//            Arrays.asList(
+//                new MeasurementSchema("s1", TSDataType.INT32),
+//                new MeasurementSchema("s2", TSDataType.INT32)));
+//
+//    SeriesScanOptions.Builder scanOptionsBuilder = new 
SeriesScanOptions.Builder();
+//    scanOptionsBuilder.withAllSensors(new 
HashSet<>(scanPath.getMeasurementList()));
+//    scanOptionsBuilder.withPushDownLimit(limit);
+//    scanOptionsBuilder.withPushDownOffset(offset);
+//    AlignedSeriesScanUtil seriesScanUtil =
+//        new AlignedSeriesScanUtil(
+//            scanPath,
+//            Ordering.ASC,
+//            scanOptionsBuilder.build(),
+//            EnvironmentUtils.TEST_QUERY_FI_CONTEXT);
+//    seriesScanUtil.initQueryDataSource(new QueryDataSource(seqResources, 
unSeqResources));
+//    return seriesScanUtil;
+//  }
+//
+//  @Test
+//  public void testSkipFile() throws IllegalPathException, IOException {
+//    AlignedSeriesScanUtil seriesScanUtil = getAlignedSeriesScanUtil(5, 10);
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    TsBlock tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(5, tsBlock.getPositionCount());
+//    long expectedTime = 10;
+//    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
+//      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
+//    }
+//
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.hasNextChunk());
+//    Assert.assertFalse(seriesScanUtil.hasNextFile());
+//  }
+//
+//  @Test
+//  public void testCannotSkipFile() throws IllegalPathException, IOException {
+//    AlignedSeriesScanUtil seriesScanUtil = getAlignedSeriesScanUtil(5, 20);
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    TsBlock tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(0, tsBlock.getPositionCount());
+//
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.hasNextChunk());
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(5, tsBlock.getPositionCount());
+//    long expectedTime = 20;
+//    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
+//      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
+//    }
+//  }
+//
+//  @Test
+//  public void testSkipChunk() throws IllegalPathException, IOException {
+//    AlignedSeriesScanUtil seriesScanUtil = getAlignedSeriesScanUtil(5, 30);
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    TsBlock tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(0, tsBlock.getPositionCount());
+//
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.hasNextChunk());
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(5, tsBlock.getPositionCount());
+//    long expectedTime = 30;
+//    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
+//      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
+//    }
+//  }
+//
+//  @Test
+//  public void testCannotSkipChunk() throws IllegalPathException, IOException 
{
+//    AlignedSeriesScanUtil seriesScanUtil = getAlignedSeriesScanUtil(5, 40);
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    TsBlock tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(0, tsBlock.getPositionCount());
+//
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.hasNextChunk());
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(0, tsBlock.getPositionCount());
+//
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.hasNextChunk());
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(5, tsBlock.getPositionCount());
+//    long expectedTime = 40;
+//    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
+//      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
+//    }
+//  }
+//
+//  @Test
+//  public void testSkipPage() throws IllegalPathException, IOException {
+//    AlignedSeriesScanUtil seriesScanUtil = getAlignedSeriesScanUtil(5, 50);
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    TsBlock tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(0, tsBlock.getPositionCount());
+//
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.hasNextChunk());
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(0, tsBlock.getPositionCount());
+//
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.hasNextChunk());
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(5, tsBlock.getPositionCount());
+//    long expectedTime = 50;
+//    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
+//      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
+//    }
+//  }
+//
+//  @Test
+//  public void testCannotSkipPage() throws IllegalPathException, IOException {
+//    AlignedSeriesScanUtil seriesScanUtil = getAlignedSeriesScanUtil(5, 60);
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    TsBlock tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(0, tsBlock.getPositionCount());
+//
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.hasNextChunk());
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(0, tsBlock.getPositionCount());
+//
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.hasNextChunk());
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(0, tsBlock.getPositionCount());
+//
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(5, tsBlock.getPositionCount());
+//    long expectedTime = 60;
+//    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
+//      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
+//    }
+//  }
+//
+//  @Test
+//  public void testSkipPoint() throws IllegalPathException, IOException {
+//    AlignedSeriesScanUtil seriesScanUtil = getAlignedSeriesScanUtil(10, 75);
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    TsBlock tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(0, tsBlock.getPositionCount());
+//
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.hasNextChunk());
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(0, tsBlock.getPositionCount());
+//
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.hasNextChunk());
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(0, tsBlock.getPositionCount());
+//
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(5, tsBlock.getPositionCount());
+//    long expectedTime = 75;
+//    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
+//      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
+//    }
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(5, tsBlock.getPositionCount());
+//    expectedTime = 80;
+//    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
+//      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
+//    }
+//  }
+// }
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/AlignedSeriesScanPredicatePushDownTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/AlignedSeriesScanPredicatePushDownTest.java
index 9a735ab7bec..9e71b24f7d3 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/AlignedSeriesScanPredicatePushDownTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/AlignedSeriesScanPredicatePushDownTest.java
@@ -1,232 +1,233 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.iotdb.db.storageengine.dataregion.read.reader.series;
-
-import org.apache.iotdb.commons.exception.IllegalPathException;
-import org.apache.iotdb.commons.path.AlignedFullPath;
-import 
org.apache.iotdb.db.queryengine.execution.operator.source.AlignedSeriesScanUtil;
-import 
org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.SeriesScanOptions;
-import org.apache.iotdb.db.queryengine.plan.statement.component.Ordering;
-import org.apache.iotdb.db.storageengine.dataregion.read.QueryDataSource;
-import org.apache.iotdb.db.utils.EnvironmentUtils;
-
-import org.apache.tsfile.enums.TSDataType;
-import org.apache.tsfile.read.common.block.TsBlock;
-import org.apache.tsfile.read.filter.basic.Filter;
-import org.apache.tsfile.read.filter.factory.FilterFactory;
-import org.apache.tsfile.read.filter.factory.TimeFilterApi;
-import org.apache.tsfile.read.filter.factory.ValueFilterApi;
-import org.apache.tsfile.write.schema.MeasurementSchema;
-import org.junit.Assert;
-import org.junit.Test;
-
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.HashSet;
-
-public class AlignedSeriesScanPredicatePushDownTest extends 
AbstractAlignedSeriesScanTest {
-
-  private AlignedSeriesScanUtil getAlignedSeriesScanUtil(
-      Filter globalTimeFilter, Filter pushDownFilter) throws 
IllegalPathException {
-    AlignedFullPath scanPath =
-        new AlignedFullPath(
-            TEST_DEVICE,
-            Arrays.asList("s1", "s2"),
-            Arrays.asList(
-                new MeasurementSchema("s1", TSDataType.INT32),
-                new MeasurementSchema("s2", TSDataType.INT32)));
-
-    SeriesScanOptions.Builder scanOptionsBuilder = new 
SeriesScanOptions.Builder();
-    scanOptionsBuilder.withAllSensors(new 
HashSet<>(scanPath.getMeasurementList()));
-    scanOptionsBuilder.withGlobalTimeFilter(globalTimeFilter);
-    scanOptionsBuilder.withPushDownFilter(pushDownFilter);
-    AlignedSeriesScanUtil seriesScanUtil =
-        new AlignedSeriesScanUtil(
-            scanPath,
-            Ordering.ASC,
-            scanOptionsBuilder.build(),
-            EnvironmentUtils.TEST_QUERY_FI_CONTEXT);
-    seriesScanUtil.initQueryDataSource(new QueryDataSource(seqResources, 
unSeqResources));
-    return seriesScanUtil;
-  }
-
-  @Test
-  @SuppressWarnings("squid:S5961") // Suppress "Test methods should not 
contain too many assertions"
-  public void testNoFilter() throws IllegalPathException, IOException {
-    AlignedSeriesScanUtil seriesScanUtil = getAlignedSeriesScanUtil(null, 
null);
-
-    // File 1
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentFileStatistics());
-
-    // File 1 - Chunk 1
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics());
-
-    // File 1 - Chunk 1 - Page 1
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
-    TsBlock tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(10, tsBlock.getPositionCount());
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.hasNextChunk());
-
-    // File 2
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentFileStatistics());
-
-    // File 2 - Chunk 1
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics());
-
-    // File 2 - Chunk 1 - Page 1
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(10, tsBlock.getPositionCount());
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.hasNextChunk());
-
-    // File 3
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentFileStatistics());
-
-    // File 3 - Chunk 1
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics());
-
-    // File 3 - Chunk 1 - Page 1
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(10, tsBlock.getPositionCount());
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-
-    // File 3 - Chunk 2
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics());
-
-    // File 3 - Chunk 2 - Page 1
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(10, tsBlock.getPositionCount());
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.hasNextChunk());
-
-    // File 4
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertFalse(seriesScanUtil.canUseCurrentFileStatistics());
-
-    // File 4 - Chunk 1
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics());
-
-    // File 4 - Chunk 1 - Page 1 (chunk actually)
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(10, tsBlock.getPositionCount());
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-
-    // File 4 - Chunk 1 - Page 2 (chunk actually)
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(10, tsBlock.getPositionCount());
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-
-    // File 4 - Chunk 1 - Page 3 (chunk actually)
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(10, tsBlock.getPositionCount());
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-
-    // (File 4 - Chunk 2) merge (File 5 - Chunk 1)
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertFalse(seriesScanUtil.canUseCurrentChunkStatistics());
-
-    // (File 4 - Chunk 2 - Page 1) merge (File 5 - Chunk 1 - Page 1)
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.canUseCurrentPageStatistics());
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(10, tsBlock.getPositionCount());
-
-    // File 5 - Chunk 1 - Page 2
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(10, tsBlock.getPositionCount());
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.hasNextChunk());
-    Assert.assertFalse(seriesScanUtil.hasNextFile());
-  }
-
-  @Test
-  public void testSkipWithFilter() throws IllegalPathException, IOException {
-    AlignedSeriesScanUtil seriesScanUtil =
-        getAlignedSeriesScanUtil(
-            TimeFilterApi.gt(10),
-            FilterFactory.and(
-                ValueFilterApi.gtEq(0, 20, TSDataType.INT32),
-                ValueFilterApi.lt(1, 30, TSDataType.INT32)));
-
-    // File 1 skipped
-    // File 2 skipped
-    // File 3
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertFalse(seriesScanUtil.canUseCurrentFileStatistics());
-
-    // File 3 - Chunk 1
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics());
-
-    // File 3 - Chunk 1 - Page 1
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
-    TsBlock tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(10, tsBlock.getPositionCount());
-    Assert.assertEquals(20, tsBlock.getTimeByIndex(0));
-
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-
-    // File 3 - Chunk 2 skipped
-    // File 4 - Chunk 1 skipped
-    // (File 4 - Chunk 2) merge (File 5 - Chunk 1)
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertFalse(seriesScanUtil.canUseCurrentChunkStatistics());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.canUseCurrentPageStatistics());
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertTrue(tsBlock == null || tsBlock.isEmpty());
-
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.canUseCurrentPageStatistics());
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertTrue(tsBlock == null || tsBlock.isEmpty());
-
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.hasNextChunk());
-    Assert.assertFalse(seriesScanUtil.hasNextFile());
-  }
-}
+/// *
+// * Licensed to the Apache Software Foundation (ASF) under one
+// * or more contributor license agreements.  See the NOTICE file
+// * distributed with this work for additional information
+// * regarding copyright ownership.  The ASF licenses this file
+// * to you under the Apache License, Version 2.0 (the
+// * "License"); you may not use this file except in compliance
+// * with the License.  You may obtain a copy of the License at
+// *
+// *     http://www.apache.org/licenses/LICENSE-2.0
+// *
+// * Unless required by applicable law or agreed to in writing,
+// * software distributed under the License is distributed on an
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// * KIND, either express or implied.  See the License for the
+// * specific language governing permissions and limitations
+// * under the License.
+// */
+//
+// package org.apache.iotdb.db.storageengine.dataregion.read.reader.series;
+//
+// import org.apache.iotdb.commons.exception.IllegalPathException;
+// import org.apache.iotdb.commons.path.AlignedFullPath;
+// import 
org.apache.iotdb.db.queryengine.execution.operator.source.AlignedSeriesScanUtil;
+// import 
org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.SeriesScanOptions;
+// import org.apache.iotdb.db.queryengine.plan.statement.component.Ordering;
+// import org.apache.iotdb.db.storageengine.dataregion.read.QueryDataSource;
+// import org.apache.iotdb.db.utils.EnvironmentUtils;
+//
+// import org.apache.tsfile.enums.TSDataType;
+// import org.apache.tsfile.read.common.block.TsBlock;
+// import org.apache.tsfile.read.filter.basic.Filter;
+// import org.apache.tsfile.read.filter.factory.FilterFactory;
+// import org.apache.tsfile.read.filter.factory.TimeFilterApi;
+// import org.apache.tsfile.read.filter.factory.ValueFilterApi;
+// import org.apache.tsfile.write.schema.MeasurementSchema;
+// import org.junit.Assert;
+// import org.junit.Test;
+//
+// import java.io.IOException;
+// import java.util.Arrays;
+// import java.util.HashSet;
+//
+// public class AlignedSeriesScanPredicatePushDownTest extends 
AbstractAlignedSeriesScanTest {
+//
+//  private AlignedSeriesScanUtil getAlignedSeriesScanUtil(
+//      Filter globalTimeFilter, Filter pushDownFilter) throws 
IllegalPathException {
+//    AlignedFullPath scanPath =
+//        new AlignedFullPath(
+//            TEST_DEVICE,
+//            Arrays.asList("s1", "s2"),
+//            Arrays.asList(
+//                new MeasurementSchema("s1", TSDataType.INT32),
+//                new MeasurementSchema("s2", TSDataType.INT32)));
+//
+//    SeriesScanOptions.Builder scanOptionsBuilder = new 
SeriesScanOptions.Builder();
+//    scanOptionsBuilder.withAllSensors(new 
HashSet<>(scanPath.getMeasurementList()));
+//    scanOptionsBuilder.withGlobalTimeFilter(globalTimeFilter);
+//    scanOptionsBuilder.withPushDownFilter(pushDownFilter);
+//    AlignedSeriesScanUtil seriesScanUtil =
+//        new AlignedSeriesScanUtil(
+//            scanPath,
+//            Ordering.ASC,
+//            scanOptionsBuilder.build(),
+//            EnvironmentUtils.TEST_QUERY_FI_CONTEXT);
+//    seriesScanUtil.initQueryDataSource(new QueryDataSource(seqResources, 
unSeqResources));
+//    return seriesScanUtil;
+//  }
+//
+//  @Test
+//  @SuppressWarnings("squid:S5961") // Suppress "Test methods should not 
contain too many
+// assertions"
+//  public void testNoFilter() throws IllegalPathException, IOException {
+//    AlignedSeriesScanUtil seriesScanUtil = getAlignedSeriesScanUtil(null, 
null);
+//
+//    // File 1
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentFileStatistics());
+//
+//    // File 1 - Chunk 1
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics());
+//
+//    // File 1 - Chunk 1 - Page 1
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
+//    TsBlock tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(10, tsBlock.getPositionCount());
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.hasNextChunk());
+//
+//    // File 2
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentFileStatistics());
+//
+//    // File 2 - Chunk 1
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics());
+//
+//    // File 2 - Chunk 1 - Page 1
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(10, tsBlock.getPositionCount());
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.hasNextChunk());
+//
+//    // File 3
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentFileStatistics());
+//
+//    // File 3 - Chunk 1
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics());
+//
+//    // File 3 - Chunk 1 - Page 1
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(10, tsBlock.getPositionCount());
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//
+//    // File 3 - Chunk 2
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics());
+//
+//    // File 3 - Chunk 2 - Page 1
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(10, tsBlock.getPositionCount());
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.hasNextChunk());
+//
+//    // File 4
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertFalse(seriesScanUtil.canUseCurrentFileStatistics());
+//
+//    // File 4 - Chunk 1
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics());
+//
+//    // File 4 - Chunk 1 - Page 1 (chunk actually)
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(10, tsBlock.getPositionCount());
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//
+//    // File 4 - Chunk 1 - Page 2 (chunk actually)
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(10, tsBlock.getPositionCount());
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//
+//    // File 4 - Chunk 1 - Page 3 (chunk actually)
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(10, tsBlock.getPositionCount());
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//
+//    // (File 4 - Chunk 2) merge (File 5 - Chunk 1)
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertFalse(seriesScanUtil.canUseCurrentChunkStatistics());
+//
+//    // (File 4 - Chunk 2 - Page 1) merge (File 5 - Chunk 1 - Page 1)
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.canUseCurrentPageStatistics());
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(10, tsBlock.getPositionCount());
+//
+//    // File 5 - Chunk 1 - Page 2
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(10, tsBlock.getPositionCount());
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.hasNextChunk());
+//    Assert.assertFalse(seriesScanUtil.hasNextFile());
+//  }
+//
+//  @Test
+//  public void testSkipWithFilter() throws IllegalPathException, IOException {
+//    AlignedSeriesScanUtil seriesScanUtil =
+//        getAlignedSeriesScanUtil(
+//            TimeFilterApi.gt(10),
+//            FilterFactory.and(
+//                ValueFilterApi.gtEq(0, 20, TSDataType.INT32),
+//                ValueFilterApi.lt(1, 30, TSDataType.INT32)));
+//
+//    // File 1 skipped
+//    // File 2 skipped
+//    // File 3
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertFalse(seriesScanUtil.canUseCurrentFileStatistics());
+//
+//    // File 3 - Chunk 1
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics());
+//
+//    // File 3 - Chunk 1 - Page 1
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
+//    TsBlock tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(10, tsBlock.getPositionCount());
+//    Assert.assertEquals(20, tsBlock.getTimeByIndex(0));
+//
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//
+//    // File 3 - Chunk 2 skipped
+//    // File 4 - Chunk 1 skipped
+//    // (File 4 - Chunk 2) merge (File 5 - Chunk 1)
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertFalse(seriesScanUtil.canUseCurrentChunkStatistics());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.canUseCurrentPageStatistics());
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertTrue(tsBlock == null || tsBlock.isEmpty());
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.canUseCurrentPageStatistics());
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertTrue(tsBlock == null || tsBlock.isEmpty());
+//
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.hasNextChunk());
+//    Assert.assertFalse(seriesScanUtil.hasNextFile());
+//  }
+// }
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/AlignedSingleColumnSeriesScanLimitOffsetPushDownTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/AlignedSingleColumnSeriesScanLimitOffsetPushDownTest.java
index 821281a77be..159745dc074 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/AlignedSingleColumnSeriesScanLimitOffsetPushDownTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/AlignedSingleColumnSeriesScanLimitOffsetPushDownTest.java
@@ -1,201 +1,201 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.iotdb.db.storageengine.dataregion.read.reader.series;
-
-import org.apache.iotdb.commons.exception.IllegalPathException;
-import org.apache.iotdb.commons.path.AlignedFullPath;
-import 
org.apache.iotdb.db.queryengine.execution.operator.source.AlignedSeriesScanUtil;
-import 
org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.SeriesScanOptions;
-import org.apache.iotdb.db.queryengine.plan.statement.component.Ordering;
-import org.apache.iotdb.db.storageengine.dataregion.read.QueryDataSource;
-import org.apache.iotdb.db.utils.EnvironmentUtils;
-
-import org.apache.tsfile.enums.TSDataType;
-import org.apache.tsfile.read.common.block.TsBlock;
-import org.apache.tsfile.write.schema.MeasurementSchema;
-import org.junit.Assert;
-import org.junit.Test;
-
-import java.io.IOException;
-import java.util.Collections;
-import java.util.HashSet;
-
-public class AlignedSingleColumnSeriesScanLimitOffsetPushDownTest
-    extends AbstractAlignedSeriesScanTest {
-
-  private static final int TEST_LIMIT = 5;
-
-  private AlignedSeriesScanUtil getAlignedSingleColumnSeriesScanUtil(long 
offset)
-      throws IllegalPathException {
-    AlignedFullPath scanPath =
-        new AlignedFullPath(
-            TEST_DEVICE,
-            Collections.singletonList("s1"),
-            Collections.singletonList(new MeasurementSchema("s1", 
TSDataType.INT32)));
-
-    SeriesScanOptions.Builder scanOptionsBuilder = new 
SeriesScanOptions.Builder();
-    scanOptionsBuilder.withAllSensors(new 
HashSet<>(scanPath.getMeasurementList()));
-    scanOptionsBuilder.withPushDownLimit(TEST_LIMIT);
-    scanOptionsBuilder.withPushDownOffset(offset);
-    AlignedSeriesScanUtil seriesScanUtil =
-        new AlignedSeriesScanUtil(
-            scanPath,
-            Ordering.ASC,
-            scanOptionsBuilder.build(),
-            EnvironmentUtils.TEST_QUERY_FI_CONTEXT);
-    seriesScanUtil.initQueryDataSource(new QueryDataSource(seqResources, 
unSeqResources));
-    return seriesScanUtil;
-  }
-
-  @Test
-  public void testSkipFile() throws IllegalPathException, IOException {
-    AlignedSeriesScanUtil seriesScanUtil = 
getAlignedSingleColumnSeriesScanUtil(20);
-
-    // File 1 skipped
-    // File 2
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    TsBlock tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(0, tsBlock.getPositionCount());
-
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.hasNextChunk());
-
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(5, tsBlock.getPositionCount());
-    long expectedTime = 24;
-    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
-      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
-    }
-  }
-
-  @Test
-  public void testSkipChunk() throws IllegalPathException, IOException {
-    AlignedSeriesScanUtil seriesScanUtil = 
getAlignedSingleColumnSeriesScanUtil(30);
-
-    // File 1 skipped (10 points)
-    // File 2 skipped (6 points)
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    TsBlock tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(0, tsBlock.getPositionCount());
-
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.hasNextChunk());
-
-    // File 3
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    // File 3 Chunk 1 skipped (10 points)
-    // File 3 Chunk 2 (6 points should skip 4 points)
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(2, tsBlock.getPositionCount());
-    long expectedTime = 34;
-    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
-      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
-    }
-    // remaining 3 points selected
-
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.hasNextChunk());
-
-    // File 3
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(3, tsBlock.getPositionCount());
-    expectedTime = 40;
-    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
-      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
-    }
-
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.hasNextChunk());
-    Assert.assertFalse(seriesScanUtil.hasNextFile());
-  }
-
-  @Test
-  public void testSkipPage() throws IllegalPathException, IOException {
-    AlignedSeriesScanUtil seriesScanUtil = 
getAlignedSingleColumnSeriesScanUtil(45);
-
-    // File 1 skipped (10 points)
-    // File 2 skipped (6 points)
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    TsBlock tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(0, tsBlock.getPositionCount());
-
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.hasNextChunk());
-
-    // File 3
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-
-    // File 3 - Chunk 1 skipped (10 points)
-    // File 3 - Chunk 2 skipped (6 points)
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(0, tsBlock.getPositionCount());
-
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.hasNextChunk());
-
-    // File 4
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-
-    // File 4 - Chunk 1 - Page 1 skipped (10 points)
-    // File 4 - Chunk 1 - Page 2  (6 points should skip 3 points)
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(3, tsBlock.getPositionCount());
-    long expectedTime = 53;
-    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
-      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
-    }
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-
-    // File 4 - Chunk 1 - Page 2 (remaining 2 points)
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(2, tsBlock.getPositionCount());
-    expectedTime = 60;
-    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
-      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
-    }
-  }
-}
+/// *
+// * Licensed to the Apache Software Foundation (ASF) under one
+// * or more contributor license agreements.  See the NOTICE file
+// * distributed with this work for additional information
+// * regarding copyright ownership.  The ASF licenses this file
+// * to you under the Apache License, Version 2.0 (the
+// * "License"); you may not use this file except in compliance
+// * with the License.  You may obtain a copy of the License at
+// *
+// *     http://www.apache.org/licenses/LICENSE-2.0
+// *
+// * Unless required by applicable law or agreed to in writing,
+// * software distributed under the License is distributed on an
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// * KIND, either express or implied.  See the License for the
+// * specific language governing permissions and limitations
+// * under the License.
+// */
+//
+// package org.apache.iotdb.db.storageengine.dataregion.read.reader.series;
+//
+// import org.apache.iotdb.commons.exception.IllegalPathException;
+// import org.apache.iotdb.commons.path.AlignedFullPath;
+// import 
org.apache.iotdb.db.queryengine.execution.operator.source.AlignedSeriesScanUtil;
+// import 
org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.SeriesScanOptions;
+// import org.apache.iotdb.db.queryengine.plan.statement.component.Ordering;
+// import org.apache.iotdb.db.storageengine.dataregion.read.QueryDataSource;
+// import org.apache.iotdb.db.utils.EnvironmentUtils;
+//
+// import org.apache.tsfile.enums.TSDataType;
+// import org.apache.tsfile.read.common.block.TsBlock;
+// import org.apache.tsfile.write.schema.MeasurementSchema;
+// import org.junit.Assert;
+// import org.junit.Test;
+//
+// import java.io.IOException;
+// import java.util.Collections;
+// import java.util.HashSet;
+//
+// public class AlignedSingleColumnSeriesScanLimitOffsetPushDownTest
+//    extends AbstractAlignedSeriesScanTest {
+//
+//  private static final int TEST_LIMIT = 5;
+//
+//  private AlignedSeriesScanUtil getAlignedSingleColumnSeriesScanUtil(long 
offset)
+//      throws IllegalPathException {
+//    AlignedFullPath scanPath =
+//        new AlignedFullPath(
+//            TEST_DEVICE,
+//            Collections.singletonList("s1"),
+//            Collections.singletonList(new MeasurementSchema("s1", 
TSDataType.INT32)));
+//
+//    SeriesScanOptions.Builder scanOptionsBuilder = new 
SeriesScanOptions.Builder();
+//    scanOptionsBuilder.withAllSensors(new 
HashSet<>(scanPath.getMeasurementList()));
+//    scanOptionsBuilder.withPushDownLimit(TEST_LIMIT);
+//    scanOptionsBuilder.withPushDownOffset(offset);
+//    AlignedSeriesScanUtil seriesScanUtil =
+//        new AlignedSeriesScanUtil(
+//            scanPath,
+//            Ordering.ASC,
+//            scanOptionsBuilder.build(),
+//            EnvironmentUtils.TEST_QUERY_FI_CONTEXT);
+//    seriesScanUtil.initQueryDataSource(new QueryDataSource(seqResources, 
unSeqResources));
+//    return seriesScanUtil;
+//  }
+//
+//  @Test
+//  public void testSkipFile() throws IllegalPathException, IOException {
+//    AlignedSeriesScanUtil seriesScanUtil = 
getAlignedSingleColumnSeriesScanUtil(20);
+//
+//    // File 1 skipped
+//    // File 2
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    TsBlock tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(0, tsBlock.getPositionCount());
+//
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.hasNextChunk());
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(5, tsBlock.getPositionCount());
+//    long expectedTime = 24;
+//    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
+//      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
+//    }
+//  }
+//
+//  @Test
+//  public void testSkipChunk() throws IllegalPathException, IOException {
+//    AlignedSeriesScanUtil seriesScanUtil = 
getAlignedSingleColumnSeriesScanUtil(30);
+//
+//    // File 1 skipped (10 points)
+//    // File 2 skipped (6 points)
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    TsBlock tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(0, tsBlock.getPositionCount());
+//
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.hasNextChunk());
+//
+//    // File 3
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    // File 3 Chunk 1 skipped (10 points)
+//    // File 3 Chunk 2 (6 points should skip 4 points)
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(2, tsBlock.getPositionCount());
+//    long expectedTime = 34;
+//    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
+//      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
+//    }
+//    // remaining 3 points selected
+//
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.hasNextChunk());
+//
+//    // File 3
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(3, tsBlock.getPositionCount());
+//    expectedTime = 40;
+//    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
+//      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
+//    }
+//
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.hasNextChunk());
+//    Assert.assertFalse(seriesScanUtil.hasNextFile());
+//  }
+//
+//  @Test
+//  public void testSkipPage() throws IllegalPathException, IOException {
+//    AlignedSeriesScanUtil seriesScanUtil = 
getAlignedSingleColumnSeriesScanUtil(45);
+//
+//    // File 1 skipped (10 points)
+//    // File 2 skipped (6 points)
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    TsBlock tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(0, tsBlock.getPositionCount());
+//
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.hasNextChunk());
+//
+//    // File 3
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//
+//    // File 3 - Chunk 1 skipped (10 points)
+//    // File 3 - Chunk 2 skipped (6 points)
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(0, tsBlock.getPositionCount());
+//
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.hasNextChunk());
+//
+//    // File 4
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//
+//    // File 4 - Chunk 1 - Page 1 skipped (10 points)
+//    // File 4 - Chunk 1 - Page 2  (6 points should skip 3 points)
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(3, tsBlock.getPositionCount());
+//    long expectedTime = 53;
+//    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
+//      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
+//    }
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//
+//    // File 4 - Chunk 1 - Page 2 (remaining 2 points)
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(2, tsBlock.getPositionCount());
+//    expectedTime = 60;
+//    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
+//      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
+//    }
+//  }
+// }
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/SeriesScanLimitOffsetPushDownTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/SeriesScanLimitOffsetPushDownTest.java
index 7eb8402e930..14c14b73a51 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/SeriesScanLimitOffsetPushDownTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/SeriesScanLimitOffsetPushDownTest.java
@@ -1,250 +1,250 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.iotdb.db.storageengine.dataregion.read.reader.series;
-
-import org.apache.iotdb.commons.exception.IllegalPathException;
-import org.apache.iotdb.commons.path.IFullPath;
-import org.apache.iotdb.commons.path.MeasurementPath;
-import 
org.apache.iotdb.db.queryengine.execution.operator.source.SeriesScanUtil;
-import 
org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.SeriesScanOptions;
-import org.apache.iotdb.db.queryengine.plan.statement.component.Ordering;
-import org.apache.iotdb.db.storageengine.dataregion.read.QueryDataSource;
-import org.apache.iotdb.db.utils.EnvironmentUtils;
-
-import org.apache.tsfile.enums.TSDataType;
-import org.apache.tsfile.read.common.block.TsBlock;
-import org.junit.Assert;
-import org.junit.Test;
-
-import java.io.IOException;
-import java.util.Collections;
-
-public class SeriesScanLimitOffsetPushDownTest extends AbstractSeriesScanTest {
-
-  private SeriesScanUtil getSeriesScanUtil(long limit, long offset, Ordering 
scanOrder)
-      throws IllegalPathException {
-    MeasurementPath scanPath = new MeasurementPath(TEST_PATH, 
TSDataType.INT32);
-
-    SeriesScanOptions.Builder scanOptionsBuilder = new 
SeriesScanOptions.Builder();
-    
scanOptionsBuilder.withAllSensors(Collections.singleton(scanPath.getMeasurement()));
-    scanOptionsBuilder.withPushDownLimit(limit);
-    scanOptionsBuilder.withPushDownOffset(offset);
-    SeriesScanUtil seriesScanUtil =
-        new SeriesScanUtil(
-            IFullPath.convertToIFullPath(scanPath),
-            scanOrder,
-            scanOptionsBuilder.build(),
-            EnvironmentUtils.TEST_QUERY_FI_CONTEXT);
-    seriesScanUtil.initQueryDataSource(new QueryDataSource(seqResources, 
unSeqResources));
-    return seriesScanUtil;
-  }
-
-  @Test
-  public void testSkipFile() throws IllegalPathException, IOException {
-    SeriesScanUtil seriesScanUtil = getSeriesScanUtil(5, 10, Ordering.ASC);
-
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    TsBlock tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(5, tsBlock.getPositionCount());
-    long expectedTime = 10;
-    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
-      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
-    }
-
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.hasNextChunk());
-    Assert.assertFalse(seriesScanUtil.hasNextFile());
-  }
-
-  @Test
-  public void testSkipChunk() throws IllegalPathException, IOException {
-    SeriesScanUtil seriesScanUtil = getSeriesScanUtil(5, 20, Ordering.ASC);
-
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    TsBlock tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(5, tsBlock.getPositionCount());
-    long expectedTime = 20;
-    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
-      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
-    }
-
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.hasNextChunk());
-    Assert.assertFalse(seriesScanUtil.hasNextFile());
-  }
-
-  @Test
-  public void testSkipPage() throws IllegalPathException, IOException {
-    SeriesScanUtil seriesScanUtil = getSeriesScanUtil(5, 30, Ordering.ASC);
-
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    TsBlock tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(5, tsBlock.getPositionCount());
-    long expectedTime = 30;
-    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
-      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
-    }
-
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.hasNextChunk());
-    Assert.assertFalse(seriesScanUtil.hasNextFile());
-  }
-
-  @Test
-  public void testSkipPoint1() throws IllegalPathException, IOException {
-    SeriesScanUtil seriesScanUtil = getSeriesScanUtil(10, 45, Ordering.ASC);
-
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    TsBlock tsBlock = seriesScanUtil.nextPage();
-    Assert.assertTrue(tsBlock == null || tsBlock.isEmpty());
-
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(5, tsBlock.getPositionCount());
-    long expectedTime = 45;
-    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
-      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
-    }
-
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(5, tsBlock.getPositionCount());
-    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
-      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
-    }
-
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.hasNextChunk());
-    Assert.assertFalse(seriesScanUtil.hasNextFile());
-  }
-
-  @Test
-  public void testSkipPoint2() throws IllegalPathException, IOException {
-    SeriesScanUtil seriesScanUtil = getSeriesScanUtil(10, 55, Ordering.ASC);
-
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    TsBlock tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(5, tsBlock.getPositionCount());
-    long expectedTime = 55;
-    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
-      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
-    }
-
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(5, tsBlock.getPositionCount());
-    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
-      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
-    }
-
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.hasNextChunk());
-    Assert.assertFalse(seriesScanUtil.hasNextFile());
-  }
-
-  @Test
-  public void testSkipPointDesc1() throws IllegalPathException, IOException {
-    SeriesScanUtil seriesScanUtil = getSeriesScanUtil(10, 5, Ordering.DESC);
-
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    TsBlock tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(5, tsBlock.getPositionCount());
-
-    long expectedTime = 64;
-    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
-      Assert.assertEquals(expectedTime--, tsBlock.getTimeByIndex(i));
-    }
-
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(5, tsBlock.getPositionCount());
-
-    expectedTime = 59;
-    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
-      Assert.assertEquals(expectedTime--, tsBlock.getTimeByIndex(i));
-    }
-
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.hasNextChunk());
-    Assert.assertFalse(seriesScanUtil.hasNextFile());
-  }
-
-  @Test
-  public void testSkipPointDesc2() throws IllegalPathException, IOException {
-    SeriesScanUtil seriesScanUtil = getSeriesScanUtil(10, 25, Ordering.DESC);
-
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    TsBlock tsBlock = seriesScanUtil.nextPage();
-    Assert.assertTrue(tsBlock == null || tsBlock.isEmpty());
-
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertTrue(tsBlock == null || tsBlock.isEmpty());
-
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(5, tsBlock.getPositionCount());
-
-    long expectedTime = 44;
-    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
-      Assert.assertEquals(expectedTime--, tsBlock.getTimeByIndex(i));
-    }
-
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(5, tsBlock.getPositionCount());
-
-    expectedTime = 39;
-    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
-      Assert.assertEquals(expectedTime--, tsBlock.getTimeByIndex(i));
-    }
-
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.hasNextChunk());
-    Assert.assertFalse(seriesScanUtil.hasNextFile());
-  }
-}
+/// *
+// * Licensed to the Apache Software Foundation (ASF) under one
+// * or more contributor license agreements.  See the NOTICE file
+// * distributed with this work for additional information
+// * regarding copyright ownership.  The ASF licenses this file
+// * to you under the Apache License, Version 2.0 (the
+// * "License"); you may not use this file except in compliance
+// * with the License.  You may obtain a copy of the License at
+// *
+// *     http://www.apache.org/licenses/LICENSE-2.0
+// *
+// * Unless required by applicable law or agreed to in writing,
+// * software distributed under the License is distributed on an
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// * KIND, either express or implied.  See the License for the
+// * specific language governing permissions and limitations
+// * under the License.
+// */
+//
+// package org.apache.iotdb.db.storageengine.dataregion.read.reader.series;
+//
+// import org.apache.iotdb.commons.exception.IllegalPathException;
+// import org.apache.iotdb.commons.path.IFullPath;
+// import org.apache.iotdb.commons.path.MeasurementPath;
+// import 
org.apache.iotdb.db.queryengine.execution.operator.source.SeriesScanUtil;
+// import 
org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.SeriesScanOptions;
+// import org.apache.iotdb.db.queryengine.plan.statement.component.Ordering;
+// import org.apache.iotdb.db.storageengine.dataregion.read.QueryDataSource;
+// import org.apache.iotdb.db.utils.EnvironmentUtils;
+//
+// import org.apache.tsfile.enums.TSDataType;
+// import org.apache.tsfile.read.common.block.TsBlock;
+// import org.junit.Assert;
+// import org.junit.Test;
+//
+// import java.io.IOException;
+// import java.util.Collections;
+//
+// public class SeriesScanLimitOffsetPushDownTest extends 
AbstractSeriesScanTest {
+//
+//  private SeriesScanUtil getSeriesScanUtil(long limit, long offset, Ordering 
scanOrder)
+//      throws IllegalPathException {
+//    MeasurementPath scanPath = new MeasurementPath(TEST_PATH, 
TSDataType.INT32);
+//
+//    SeriesScanOptions.Builder scanOptionsBuilder = new 
SeriesScanOptions.Builder();
+//    
scanOptionsBuilder.withAllSensors(Collections.singleton(scanPath.getMeasurement()));
+//    scanOptionsBuilder.withPushDownLimit(limit);
+//    scanOptionsBuilder.withPushDownOffset(offset);
+//    SeriesScanUtil seriesScanUtil =
+//        new SeriesScanUtil(
+//            IFullPath.convertToIFullPath(scanPath),
+//            scanOrder,
+//            scanOptionsBuilder.build(),
+//            EnvironmentUtils.TEST_QUERY_FI_CONTEXT);
+//    seriesScanUtil.initQueryDataSource(new QueryDataSource(seqResources, 
unSeqResources));
+//    return seriesScanUtil;
+//  }
+//
+//  @Test
+//  public void testSkipFile() throws IllegalPathException, IOException {
+//    SeriesScanUtil seriesScanUtil = getSeriesScanUtil(5, 10, Ordering.ASC);
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    TsBlock tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(5, tsBlock.getPositionCount());
+//    long expectedTime = 10;
+//    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
+//      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
+//    }
+//
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.hasNextChunk());
+//    Assert.assertFalse(seriesScanUtil.hasNextFile());
+//  }
+//
+//  @Test
+//  public void testSkipChunk() throws IllegalPathException, IOException {
+//    SeriesScanUtil seriesScanUtil = getSeriesScanUtil(5, 20, Ordering.ASC);
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    TsBlock tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(5, tsBlock.getPositionCount());
+//    long expectedTime = 20;
+//    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
+//      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
+//    }
+//
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.hasNextChunk());
+//    Assert.assertFalse(seriesScanUtil.hasNextFile());
+//  }
+//
+//  @Test
+//  public void testSkipPage() throws IllegalPathException, IOException {
+//    SeriesScanUtil seriesScanUtil = getSeriesScanUtil(5, 30, Ordering.ASC);
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    TsBlock tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(5, tsBlock.getPositionCount());
+//    long expectedTime = 30;
+//    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
+//      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
+//    }
+//
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.hasNextChunk());
+//    Assert.assertFalse(seriesScanUtil.hasNextFile());
+//  }
+//
+//  @Test
+//  public void testSkipPoint1() throws IllegalPathException, IOException {
+//    SeriesScanUtil seriesScanUtil = getSeriesScanUtil(10, 45, Ordering.ASC);
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    TsBlock tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertTrue(tsBlock == null || tsBlock.isEmpty());
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(5, tsBlock.getPositionCount());
+//    long expectedTime = 45;
+//    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
+//      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
+//    }
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(5, tsBlock.getPositionCount());
+//    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
+//      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
+//    }
+//
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.hasNextChunk());
+//    Assert.assertFalse(seriesScanUtil.hasNextFile());
+//  }
+//
+//  @Test
+//  public void testSkipPoint2() throws IllegalPathException, IOException {
+//    SeriesScanUtil seriesScanUtil = getSeriesScanUtil(10, 55, Ordering.ASC);
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    TsBlock tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(5, tsBlock.getPositionCount());
+//    long expectedTime = 55;
+//    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
+//      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
+//    }
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(5, tsBlock.getPositionCount());
+//    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
+//      Assert.assertEquals(expectedTime++, tsBlock.getTimeByIndex(i));
+//    }
+//
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.hasNextChunk());
+//    Assert.assertFalse(seriesScanUtil.hasNextFile());
+//  }
+//
+//  @Test
+//  public void testSkipPointDesc1() throws IllegalPathException, IOException {
+//    SeriesScanUtil seriesScanUtil = getSeriesScanUtil(10, 5, Ordering.DESC);
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    TsBlock tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(5, tsBlock.getPositionCount());
+//
+//    long expectedTime = 64;
+//    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
+//      Assert.assertEquals(expectedTime--, tsBlock.getTimeByIndex(i));
+//    }
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(5, tsBlock.getPositionCount());
+//
+//    expectedTime = 59;
+//    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
+//      Assert.assertEquals(expectedTime--, tsBlock.getTimeByIndex(i));
+//    }
+//
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.hasNextChunk());
+//    Assert.assertFalse(seriesScanUtil.hasNextFile());
+//  }
+//
+//  @Test
+//  public void testSkipPointDesc2() throws IllegalPathException, IOException {
+//    SeriesScanUtil seriesScanUtil = getSeriesScanUtil(10, 25, Ordering.DESC);
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    TsBlock tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertTrue(tsBlock == null || tsBlock.isEmpty());
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertTrue(tsBlock == null || tsBlock.isEmpty());
+//
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(5, tsBlock.getPositionCount());
+//
+//    long expectedTime = 44;
+//    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
+//      Assert.assertEquals(expectedTime--, tsBlock.getTimeByIndex(i));
+//    }
+//
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(5, tsBlock.getPositionCount());
+//
+//    expectedTime = 39;
+//    for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++) {
+//      Assert.assertEquals(expectedTime--, tsBlock.getTimeByIndex(i));
+//    }
+//
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.hasNextChunk());
+//    Assert.assertFalse(seriesScanUtil.hasNextFile());
+//  }
+// }
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/SeriesScanPredicatePushDownTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/SeriesScanPredicatePushDownTest.java
index 4b026873d8c..4c27244ecf1 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/SeriesScanPredicatePushDownTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/series/SeriesScanPredicatePushDownTest.java
@@ -1,345 +1,347 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.iotdb.db.storageengine.dataregion.read.reader.series;
-
-import org.apache.iotdb.commons.exception.IllegalPathException;
-import org.apache.iotdb.commons.path.IFullPath;
-import org.apache.iotdb.commons.path.MeasurementPath;
-import 
org.apache.iotdb.db.queryengine.execution.operator.source.SeriesScanUtil;
-import 
org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.SeriesScanOptions;
-import org.apache.iotdb.db.queryengine.plan.statement.component.Ordering;
-import org.apache.iotdb.db.storageengine.dataregion.read.QueryDataSource;
-import org.apache.iotdb.db.utils.EnvironmentUtils;
-
-import org.apache.tsfile.enums.TSDataType;
-import org.apache.tsfile.read.common.block.TsBlock;
-import org.apache.tsfile.read.filter.basic.Filter;
-import org.apache.tsfile.read.filter.factory.TimeFilterApi;
-import org.apache.tsfile.read.filter.factory.ValueFilterApi;
-import org.junit.Assert;
-import org.junit.Test;
-
-import java.io.IOException;
-import java.util.Collections;
-
-import static 
org.apache.tsfile.read.filter.factory.ValueFilterApi.DEFAULT_MEASUREMENT_INDEX;
-
-public class SeriesScanPredicatePushDownTest extends AbstractSeriesScanTest {
-
-  private SeriesScanUtil getSeriesScanUtil(Filter globalTimeFilter, Filter 
pushDownFilter)
-      throws IllegalPathException {
-    MeasurementPath scanPath = new MeasurementPath(TEST_PATH, 
TSDataType.INT32);
-
-    SeriesScanOptions.Builder scanOptionsBuilder = new 
SeriesScanOptions.Builder();
-    
scanOptionsBuilder.withAllSensors(Collections.singleton(scanPath.getMeasurement()));
-    scanOptionsBuilder.withGlobalTimeFilter(globalTimeFilter);
-    scanOptionsBuilder.withPushDownFilter(pushDownFilter);
-    SeriesScanUtil seriesScanUtil =
-        new SeriesScanUtil(
-            IFullPath.convertToIFullPath(scanPath),
-            Ordering.ASC,
-            scanOptionsBuilder.build(),
-            EnvironmentUtils.TEST_QUERY_FI_CONTEXT);
-    seriesScanUtil.initQueryDataSource(new QueryDataSource(seqResources, 
unSeqResources));
-    return seriesScanUtil;
-  }
-
-  @Test
-  @SuppressWarnings("squid:S5961") // Suppress "Test methods should not 
contain too many assertions"
-  public void testNoFilter() throws IllegalPathException, IOException {
-    SeriesScanUtil seriesScanUtil = getSeriesScanUtil(null, null);
-
-    // File 1
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentFileStatistics());
-
-    // File 1 - Chunk 1
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics());
-
-    // File 1 - Chunk 1 - Page 1
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
-    TsBlock tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(10, tsBlock.getPositionCount());
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.hasNextChunk());
-
-    // File 2
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentFileStatistics());
-
-    // File 2 - Chunk 1
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics());
-
-    // File 2 - Chunk 1 - Page 1
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(10, tsBlock.getPositionCount());
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-
-    // File 2 - Chunk 2
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics());
-
-    // File 2 - Chunk 2 - Page 1
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(10, tsBlock.getPositionCount());
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.hasNextChunk());
-
-    // File 3
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertFalse(seriesScanUtil.canUseCurrentFileStatistics());
-
-    // File 3 - Chunk 1
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics());
-
-    // File 3 - Chunk 1 - Page 1
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(10, tsBlock.getPositionCount());
-
-    // File 3 - Chunk 1 - Page 2
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(10, tsBlock.getPositionCount());
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-
-    // (File 3 - Chunk 2) merge (File 4 - Chunk 1)
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertFalse(seriesScanUtil.canUseCurrentChunkStatistics());
-
-    // (File 3 - Chunk 2 - Page 1) merge (File 4 - Chunk 1 - Page 1)
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.canUseCurrentPageStatistics());
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(10, tsBlock.getPositionCount());
-
-    // File 4 - Chunk 1 - Page 2
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(10, tsBlock.getPositionCount());
-    Assert.assertFalse(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.hasNextChunk());
-    Assert.assertFalse(seriesScanUtil.hasNextFile());
-  }
-
-  @Test
-  public void testSkipFileByGlobalTimeFilter() throws IllegalPathException, 
IOException {
-    SeriesScanUtil seriesScanUtil = getSeriesScanUtil(TimeFilterApi.gtEq(10), 
null);
-    checkFile1Skipped(seriesScanUtil);
-  }
-
-  @Test
-  public void testSkipFileByPushDownFilter() throws IllegalPathException, 
IOException {
-    SeriesScanUtil seriesScanUtil =
-        getSeriesScanUtil(
-            TimeFilterApi.gt(0),
-            ValueFilterApi.gtEq(DEFAULT_MEASUREMENT_INDEX, 10, 
TSDataType.INT32));
-    checkFile1Skipped(seriesScanUtil);
-  }
-
-  private void checkFile1Skipped(SeriesScanUtil seriesScanUtil) throws 
IOException {
-    // File 1
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentFileStatistics());
-
-    // File 1 - Chunk 1
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics());
-
-    // File 1 - Chunk 1 - Page 1
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
-    TsBlock tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(10, tsBlock.getPositionCount());
-    Assert.assertEquals(10, tsBlock.getTimeByIndex(0));
-  }
-
-  @Test
-  public void testSkipChunkByGlobalTimeFilter() throws IllegalPathException, 
IOException {
-    SeriesScanUtil seriesScanUtil = getSeriesScanUtil(TimeFilterApi.gtEq(20), 
null);
-    checkFile2Chunk1Skipped(seriesScanUtil);
-  }
-
-  @Test
-  public void testSkipChunkByPushDownFilter() throws IllegalPathException, 
IOException {
-    SeriesScanUtil seriesScanUtil =
-        getSeriesScanUtil(
-            TimeFilterApi.gt(0),
-            ValueFilterApi.gtEq(DEFAULT_MEASUREMENT_INDEX, 20, 
TSDataType.INT32));
-    checkFile2Chunk1Skipped(seriesScanUtil);
-  }
-
-  private void checkFile2Chunk1Skipped(SeriesScanUtil seriesScanUtil) throws 
IOException {
-    // File 1 skipped
-    // File 2
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertFalse(seriesScanUtil.canUseCurrentFileStatistics());
-
-    // File 2 - Chunk 1 skipped
-    // File 2 - Chunk 2
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics());
-
-    // File 2 - Chunk 2 - Page 1
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
-    TsBlock tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(10, tsBlock.getPositionCount());
-    Assert.assertEquals(20, tsBlock.getTimeByIndex(0));
-  }
-
-  @Test
-  public void testSkipPageByGlobalTimeFilter() throws IllegalPathException, 
IOException {
-    SeriesScanUtil seriesScanUtil = getSeriesScanUtil(TimeFilterApi.gtEq(40), 
null);
-    checkFile1AndFile2Skipped(seriesScanUtil);
-
-    // File 3 - Chunk 1 - Page 1 skipped
-    // File 3 - Chunk 1 - Page 2
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
-    TsBlock tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(10, tsBlock.getPositionCount());
-    Assert.assertEquals(40, tsBlock.getTimeByIndex(0));
-  }
-
-  @Test
-  public void testSkipPageByPushDownFilter() throws IllegalPathException, 
IOException {
-    SeriesScanUtil seriesScanUtil =
-        getSeriesScanUtil(
-            TimeFilterApi.gt(0),
-            ValueFilterApi.gtEq(DEFAULT_MEASUREMENT_INDEX, 40, 
TSDataType.INT32));
-    checkFile1AndFile2Skipped(seriesScanUtil);
-
-    // File 3 - Chunk 1 - Page 1 skipped
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.canUseCurrentPageStatistics());
-    TsBlock tsBlock = seriesScanUtil.nextPage();
-    Assert.assertNull(tsBlock);
-
-    // File 3 - Chunk 1 - Page 2
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(10, tsBlock.getPositionCount());
-    Assert.assertEquals(40, tsBlock.getTimeByIndex(0));
-  }
-
-  private void checkFile1AndFile2Skipped(SeriesScanUtil seriesScanUtil) throws 
IOException {
-    // File 1 skipped
-    // File 2 skipped
-    // File 3
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertFalse(seriesScanUtil.canUseCurrentFileStatistics());
-
-    // File 3 - Chunk 1
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertFalse(seriesScanUtil.canUseCurrentChunkStatistics());
-  }
-
-  @Test
-  public void testSkipMergeReaderPointByGlobalTimeFilter()
-      throws IllegalPathException, IOException {
-    SeriesScanUtil seriesScanUtil = getSeriesScanUtil(TimeFilterApi.gtEq(55), 
null);
-    checkFile1AndFile2AndMergeReaderPointSkipped(seriesScanUtil);
-  }
-
-  @Test
-  public void testSkipMergeReaderPointByPushDownFilter() throws 
IllegalPathException, IOException {
-    SeriesScanUtil seriesScanUtil =
-        getSeriesScanUtil(
-            TimeFilterApi.gt(0),
-            ValueFilterApi.gtEq(DEFAULT_MEASUREMENT_INDEX, 55, 
TSDataType.INT32));
-    checkFile1AndFile2AndMergeReaderPointSkipped(seriesScanUtil);
-  }
-
-  private void checkFile1AndFile2AndFile3Chunk1Skipped(SeriesScanUtil 
seriesScanUtil)
-      throws IOException {
-    // File 1 skipped
-    // File 2 skipped
-    // File 3
-    Assert.assertTrue(seriesScanUtil.hasNextFile());
-    Assert.assertFalse(seriesScanUtil.canUseCurrentFileStatistics());
-
-    // File 3 - Chunk 1 skipped
-    // File 3 - Chunk 2
-    Assert.assertTrue(seriesScanUtil.hasNextChunk());
-    Assert.assertFalse(seriesScanUtil.canUseCurrentChunkStatistics());
-  }
-
-  private void checkFile1AndFile2AndMergeReaderPointSkipped(SeriesScanUtil 
seriesScanUtil)
-      throws IOException {
-    checkFile1AndFile2AndFile3Chunk1Skipped(seriesScanUtil);
-
-    // (File 3 - Chunk 2) merge (File 4 - Chunk 1)
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.canUseCurrentPageStatistics());
-    TsBlock tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(5, tsBlock.getPositionCount());
-    Assert.assertEquals(55, tsBlock.getTimeByIndex(0));
-  }
-
-  @Test
-  public void testSkipMergeReaderByGlobalTimeFilter() throws 
IllegalPathException, IOException {
-    SeriesScanUtil seriesScanUtil = getSeriesScanUtil(TimeFilterApi.gtEq(60), 
null);
-    checkFile1AndFile2AndFile3Chunk1Skipped(seriesScanUtil);
-
-    // (File 3 - Chunk 1) merge (File 4 - Chunk 1) skipped
-    // File 4 - Chunk 2
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
-    TsBlock tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(10, tsBlock.getPositionCount());
-    Assert.assertEquals(60, tsBlock.getTimeByIndex(0));
-  }
-
-  @Test
-  public void testSkipMergeReaderByPushDownFilter() throws 
IllegalPathException, IOException {
-    SeriesScanUtil seriesScanUtil =
-        getSeriesScanUtil(
-            TimeFilterApi.gt(0),
-            ValueFilterApi.gtEq(DEFAULT_MEASUREMENT_INDEX, 60, 
TSDataType.INT32));
-
-    checkFile1AndFile2AndFile3Chunk1Skipped(seriesScanUtil);
-
-    // (File 3 - Chunk 1) merge (File 4 - Chunk 1)
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    Assert.assertFalse(seriesScanUtil.canUseCurrentPageStatistics());
-    TsBlock tsBlock = seriesScanUtil.nextPage();
-    Assert.assertTrue(tsBlock == null || tsBlock.isEmpty());
-
-    // File 4 - Chunk 2
-    Assert.assertTrue(seriesScanUtil.hasNextPage());
-    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
-    tsBlock = seriesScanUtil.nextPage();
-    Assert.assertEquals(10, tsBlock.getPositionCount());
-    Assert.assertEquals(60, tsBlock.getTimeByIndex(0));
-  }
-}
+/// *
+// * Licensed to the Apache Software Foundation (ASF) under one
+// * or more contributor license agreements.  See the NOTICE file
+// * distributed with this work for additional information
+// * regarding copyright ownership.  The ASF licenses this file
+// * to you under the Apache License, Version 2.0 (the
+// * "License"); you may not use this file except in compliance
+// * with the License.  You may obtain a copy of the License at
+// *
+// *     http://www.apache.org/licenses/LICENSE-2.0
+// *
+// * Unless required by applicable law or agreed to in writing,
+// * software distributed under the License is distributed on an
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// * KIND, either express or implied.  See the License for the
+// * specific language governing permissions and limitations
+// * under the License.
+// */
+//
+// package org.apache.iotdb.db.storageengine.dataregion.read.reader.series;
+//
+// import org.apache.iotdb.commons.exception.IllegalPathException;
+// import org.apache.iotdb.commons.path.IFullPath;
+// import org.apache.iotdb.commons.path.MeasurementPath;
+// import 
org.apache.iotdb.db.queryengine.execution.operator.source.SeriesScanUtil;
+// import 
org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.SeriesScanOptions;
+// import org.apache.iotdb.db.queryengine.plan.statement.component.Ordering;
+// import org.apache.iotdb.db.storageengine.dataregion.read.QueryDataSource;
+// import org.apache.iotdb.db.utils.EnvironmentUtils;
+//
+// import org.apache.tsfile.enums.TSDataType;
+// import org.apache.tsfile.read.common.block.TsBlock;
+// import org.apache.tsfile.read.filter.basic.Filter;
+// import org.apache.tsfile.read.filter.factory.TimeFilterApi;
+// import org.apache.tsfile.read.filter.factory.ValueFilterApi;
+// import org.junit.Assert;
+// import org.junit.Test;
+//
+// import java.io.IOException;
+// import java.util.Collections;
+//
+// import static 
org.apache.tsfile.read.filter.factory.ValueFilterApi.DEFAULT_MEASUREMENT_INDEX;
+//
+// public class SeriesScanPredicatePushDownTest extends AbstractSeriesScanTest 
{
+//
+//  private SeriesScanUtil getSeriesScanUtil(Filter globalTimeFilter, Filter 
pushDownFilter)
+//      throws IllegalPathException {
+//    MeasurementPath scanPath = new MeasurementPath(TEST_PATH, 
TSDataType.INT32);
+//
+//    SeriesScanOptions.Builder scanOptionsBuilder = new 
SeriesScanOptions.Builder();
+//    
scanOptionsBuilder.withAllSensors(Collections.singleton(scanPath.getMeasurement()));
+//    scanOptionsBuilder.withGlobalTimeFilter(globalTimeFilter);
+//    scanOptionsBuilder.withPushDownFilter(pushDownFilter);
+//    SeriesScanUtil seriesScanUtil =
+//        new SeriesScanUtil(
+//            IFullPath.convertToIFullPath(scanPath),
+//            Ordering.ASC,
+//            scanOptionsBuilder.build(),
+//            EnvironmentUtils.TEST_QUERY_FI_CONTEXT);
+//    seriesScanUtil.initQueryDataSource(new QueryDataSource(seqResources, 
unSeqResources));
+//    return seriesScanUtil;
+//  }
+//
+//  @Test
+//  @SuppressWarnings("squid:S5961") // Suppress "Test methods should not 
contain too many
+// assertions"
+//  public void testNoFilter() throws IllegalPathException, IOException {
+//    SeriesScanUtil seriesScanUtil = getSeriesScanUtil(null, null);
+//
+//    // File 1
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentFileStatistics());
+//
+//    // File 1 - Chunk 1
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics());
+//
+//    // File 1 - Chunk 1 - Page 1
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
+//    TsBlock tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(10, tsBlock.getPositionCount());
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.hasNextChunk());
+//
+//    // File 2
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentFileStatistics());
+//
+//    // File 2 - Chunk 1
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics());
+//
+//    // File 2 - Chunk 1 - Page 1
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(10, tsBlock.getPositionCount());
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//
+//    // File 2 - Chunk 2
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics());
+//
+//    // File 2 - Chunk 2 - Page 1
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(10, tsBlock.getPositionCount());
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.hasNextChunk());
+//
+//    // File 3
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertFalse(seriesScanUtil.canUseCurrentFileStatistics());
+//
+//    // File 3 - Chunk 1
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics());
+//
+//    // File 3 - Chunk 1 - Page 1
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(10, tsBlock.getPositionCount());
+//
+//    // File 3 - Chunk 1 - Page 2
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(10, tsBlock.getPositionCount());
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//
+//    // (File 3 - Chunk 2) merge (File 4 - Chunk 1)
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertFalse(seriesScanUtil.canUseCurrentChunkStatistics());
+//
+//    // (File 3 - Chunk 2 - Page 1) merge (File 4 - Chunk 1 - Page 1)
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.canUseCurrentPageStatistics());
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(10, tsBlock.getPositionCount());
+//
+//    // File 4 - Chunk 1 - Page 2
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(10, tsBlock.getPositionCount());
+//    Assert.assertFalse(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.hasNextChunk());
+//    Assert.assertFalse(seriesScanUtil.hasNextFile());
+//  }
+//
+//  @Test
+//  public void testSkipFileByGlobalTimeFilter() throws IllegalPathException, 
IOException {
+//    SeriesScanUtil seriesScanUtil = 
getSeriesScanUtil(TimeFilterApi.gtEq(10), null);
+//    checkFile1Skipped(seriesScanUtil);
+//  }
+//
+//  @Test
+//  public void testSkipFileByPushDownFilter() throws IllegalPathException, 
IOException {
+//    SeriesScanUtil seriesScanUtil =
+//        getSeriesScanUtil(
+//            TimeFilterApi.gt(0),
+//            ValueFilterApi.gtEq(DEFAULT_MEASUREMENT_INDEX, 10, 
TSDataType.INT32));
+//    checkFile1Skipped(seriesScanUtil);
+//  }
+//
+//  private void checkFile1Skipped(SeriesScanUtil seriesScanUtil) throws 
IOException {
+//    // File 1
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentFileStatistics());
+//
+//    // File 1 - Chunk 1
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics());
+//
+//    // File 1 - Chunk 1 - Page 1
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
+//    TsBlock tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(10, tsBlock.getPositionCount());
+//    Assert.assertEquals(10, tsBlock.getTimeByIndex(0));
+//  }
+//
+//  @Test
+//  public void testSkipChunkByGlobalTimeFilter() throws IllegalPathException, 
IOException {
+//    SeriesScanUtil seriesScanUtil = 
getSeriesScanUtil(TimeFilterApi.gtEq(20), null);
+//    checkFile2Chunk1Skipped(seriesScanUtil);
+//  }
+//
+//  @Test
+//  public void testSkipChunkByPushDownFilter() throws IllegalPathException, 
IOException {
+//    SeriesScanUtil seriesScanUtil =
+//        getSeriesScanUtil(
+//            TimeFilterApi.gt(0),
+//            ValueFilterApi.gtEq(DEFAULT_MEASUREMENT_INDEX, 20, 
TSDataType.INT32));
+//    checkFile2Chunk1Skipped(seriesScanUtil);
+//  }
+//
+//  private void checkFile2Chunk1Skipped(SeriesScanUtil seriesScanUtil) throws 
IOException {
+//    // File 1 skipped
+//    // File 2
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertFalse(seriesScanUtil.canUseCurrentFileStatistics());
+//
+//    // File 2 - Chunk 1 skipped
+//    // File 2 - Chunk 2
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentChunkStatistics());
+//
+//    // File 2 - Chunk 2 - Page 1
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
+//    TsBlock tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(10, tsBlock.getPositionCount());
+//    Assert.assertEquals(20, tsBlock.getTimeByIndex(0));
+//  }
+//
+//  @Test
+//  public void testSkipPageByGlobalTimeFilter() throws IllegalPathException, 
IOException {
+//    SeriesScanUtil seriesScanUtil = 
getSeriesScanUtil(TimeFilterApi.gtEq(40), null);
+//    checkFile1AndFile2Skipped(seriesScanUtil);
+//
+//    // File 3 - Chunk 1 - Page 1 skipped
+//    // File 3 - Chunk 1 - Page 2
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
+//    TsBlock tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(10, tsBlock.getPositionCount());
+//    Assert.assertEquals(40, tsBlock.getTimeByIndex(0));
+//  }
+//
+//  @Test
+//  public void testSkipPageByPushDownFilter() throws IllegalPathException, 
IOException {
+//    SeriesScanUtil seriesScanUtil =
+//        getSeriesScanUtil(
+//            TimeFilterApi.gt(0),
+//            ValueFilterApi.gtEq(DEFAULT_MEASUREMENT_INDEX, 40, 
TSDataType.INT32));
+//    checkFile1AndFile2Skipped(seriesScanUtil);
+//
+//    // File 3 - Chunk 1 - Page 1 skipped
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.canUseCurrentPageStatistics());
+//    TsBlock tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertNull(tsBlock);
+//
+//    // File 3 - Chunk 1 - Page 2
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(10, tsBlock.getPositionCount());
+//    Assert.assertEquals(40, tsBlock.getTimeByIndex(0));
+//  }
+//
+//  private void checkFile1AndFile2Skipped(SeriesScanUtil seriesScanUtil) 
throws IOException {
+//    // File 1 skipped
+//    // File 2 skipped
+//    // File 3
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertFalse(seriesScanUtil.canUseCurrentFileStatistics());
+//
+//    // File 3 - Chunk 1
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertFalse(seriesScanUtil.canUseCurrentChunkStatistics());
+//  }
+//
+//  @Test
+//  public void testSkipMergeReaderPointByGlobalTimeFilter()
+//      throws IllegalPathException, IOException {
+//    SeriesScanUtil seriesScanUtil = 
getSeriesScanUtil(TimeFilterApi.gtEq(55), null);
+//    checkFile1AndFile2AndMergeReaderPointSkipped(seriesScanUtil);
+//  }
+//
+//  @Test
+//  public void testSkipMergeReaderPointByPushDownFilter() throws 
IllegalPathException, IOException
+// {
+//    SeriesScanUtil seriesScanUtil =
+//        getSeriesScanUtil(
+//            TimeFilterApi.gt(0),
+//            ValueFilterApi.gtEq(DEFAULT_MEASUREMENT_INDEX, 55, 
TSDataType.INT32));
+//    checkFile1AndFile2AndMergeReaderPointSkipped(seriesScanUtil);
+//  }
+//
+//  private void checkFile1AndFile2AndFile3Chunk1Skipped(SeriesScanUtil 
seriesScanUtil)
+//      throws IOException {
+//    // File 1 skipped
+//    // File 2 skipped
+//    // File 3
+//    Assert.assertTrue(seriesScanUtil.hasNextFile());
+//    Assert.assertFalse(seriesScanUtil.canUseCurrentFileStatistics());
+//
+//    // File 3 - Chunk 1 skipped
+//    // File 3 - Chunk 2
+//    Assert.assertTrue(seriesScanUtil.hasNextChunk());
+//    Assert.assertFalse(seriesScanUtil.canUseCurrentChunkStatistics());
+//  }
+//
+//  private void checkFile1AndFile2AndMergeReaderPointSkipped(SeriesScanUtil 
seriesScanUtil)
+//      throws IOException {
+//    checkFile1AndFile2AndFile3Chunk1Skipped(seriesScanUtil);
+//
+//    // (File 3 - Chunk 2) merge (File 4 - Chunk 1)
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.canUseCurrentPageStatistics());
+//    TsBlock tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(5, tsBlock.getPositionCount());
+//    Assert.assertEquals(55, tsBlock.getTimeByIndex(0));
+//  }
+//
+//  @Test
+//  public void testSkipMergeReaderByGlobalTimeFilter() throws 
IllegalPathException, IOException {
+//    SeriesScanUtil seriesScanUtil = 
getSeriesScanUtil(TimeFilterApi.gtEq(60), null);
+//    checkFile1AndFile2AndFile3Chunk1Skipped(seriesScanUtil);
+//
+//    // (File 3 - Chunk 1) merge (File 4 - Chunk 1) skipped
+//    // File 4 - Chunk 2
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
+//    TsBlock tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(10, tsBlock.getPositionCount());
+//    Assert.assertEquals(60, tsBlock.getTimeByIndex(0));
+//  }
+//
+//  @Test
+//  public void testSkipMergeReaderByPushDownFilter() throws 
IllegalPathException, IOException {
+//    SeriesScanUtil seriesScanUtil =
+//        getSeriesScanUtil(
+//            TimeFilterApi.gt(0),
+//            ValueFilterApi.gtEq(DEFAULT_MEASUREMENT_INDEX, 60, 
TSDataType.INT32));
+//
+//    checkFile1AndFile2AndFile3Chunk1Skipped(seriesScanUtil);
+//
+//    // (File 3 - Chunk 1) merge (File 4 - Chunk 1)
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    Assert.assertFalse(seriesScanUtil.canUseCurrentPageStatistics());
+//    TsBlock tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertTrue(tsBlock == null || tsBlock.isEmpty());
+//
+//    // File 4 - Chunk 2
+//    Assert.assertTrue(seriesScanUtil.hasNextPage());
+//    Assert.assertTrue(seriesScanUtil.canUseCurrentPageStatistics());
+//    tsBlock = seriesScanUtil.nextPage();
+//    Assert.assertEquals(10, tsBlock.getPositionCount());
+//    Assert.assertEquals(60, tsBlock.getTimeByIndex(0));
+//  }
+// }


Reply via email to