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

jackietien pushed a commit to branch IOTDB-6115
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/IOTDB-6115 by this push:
     new 387f8eaa94b opt
387f8eaa94b is described below

commit 387f8eaa94bd26ac3b62cec22bf809291938efc3
Author: JackieTien97 <[email protected]>
AuthorDate: Wed Aug 16 20:00:29 2023 +0800

    opt
---
 .../operator/source/AlignedSeriesScanUtil.java     |  4 ++--
 .../memtable/AlignedReadOnlyMemChunk.java          | 12 +++++++++++-
 .../read/reader/chunk/DiskAlignedChunkLoader.java  | 13 +++++++++++--
 .../read/reader/chunk/MemAlignedChunkLoader.java   | 11 +++++++++--
 .../read/reader/chunk/MemAlignedChunkReader.java   |  8 +++++---
 .../read/reader/chunk/MemAlignedPageReader.java    | 22 ++++++++++++++++------
 .../metadata/DiskAlignedChunkMetadataLoader.java   | 16 ++++++++++++++--
 .../metadata/MemAlignedChunkMetadataLoader.java    | 19 ++++++++++++++++---
 .../org/apache/iotdb/db/utils/FileLoaderUtils.java | 21 ++++++++++++++++-----
 .../reader/chunk/MemAlignedChunkLoaderTest.java    |  2 +-
 .../read/TsFileAlignedSeriesReaderIterator.java    |  2 +-
 .../read/reader/chunk/AlignedChunkReader.java      | 16 ++++++++++------
 .../tsfile/read/reader/page/AlignedPageReader.java | 22 ++++++++++++++++------
 .../read/reader/series/FileSeriesReader.java       |  2 +-
 .../tsfile/write/TsFileIntegrityCheckingTool.java  |  3 ++-
 15 files changed, 131 insertions(+), 42 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/AlignedSeriesScanUtil.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/AlignedSeriesScanUtil.java
index 7e20a1e4e82..300412081f4 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/AlignedSeriesScanUtil.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/AlignedSeriesScanUtil.java
@@ -53,7 +53,7 @@ public class AlignedSeriesScanUtil extends SeriesScanUtil {
   // device, we
   // can use statistics to skip.
   // it's only exact while using limit & offset push down
-  private boolean queryAllSensors = false;
+  private final boolean queryAllSensors;
 
   public AlignedSeriesScanUtil(
       PartialPath seriesPath,
@@ -138,7 +138,7 @@ public class AlignedSeriesScanUtil extends SeriesScanUtil {
       Set<String> allSensors)
       throws IOException {
     return FileLoaderUtils.loadTimeSeriesMetadata(
-        resource, (AlignedPath) seriesPath, context, filter);
+        resource, (AlignedPath) seriesPath, context, filter, queryAllSensors);
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AlignedReadOnlyMemChunk.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AlignedReadOnlyMemChunk.java
index 04d9a2b367b..cf899441d49 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AlignedReadOnlyMemChunk.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AlignedReadOnlyMemChunk.java
@@ -45,6 +45,12 @@ public class AlignedReadOnlyMemChunk extends 
ReadOnlyMemChunk {
 
   private final List<TSDataType> dataTypes;
 
+  // only used for limit and offset push down optimizer, if we select all 
columns from aligned
+  // device, we
+  // can use statistics to skip.
+  // it's only exact while using limit & offset push down
+  private boolean queryAllSensors;
+
   /**
    * The constructor for Aligned type.
    *
@@ -146,7 +152,7 @@ public class AlignedReadOnlyMemChunk extends 
ReadOnlyMemChunk {
     }
     IChunkMetadata alignedChunkMetadata =
         new AlignedChunkMetadata(timeChunkMetadata, valueChunkMetadataList);
-    alignedChunkMetadata.setChunkLoader(new MemAlignedChunkLoader(this));
+    alignedChunkMetadata.setChunkLoader(new MemAlignedChunkLoader(this, 
queryAllSensors));
     alignedChunkMetadata.setVersion(Long.MAX_VALUE);
     cachedMetaData = alignedChunkMetadata;
   }
@@ -160,4 +166,8 @@ public class AlignedReadOnlyMemChunk extends 
ReadOnlyMemChunk {
   public IPointReader getPointReader() {
     return tsBlock.getTsBlockAlignedRowIterator();
   }
+
+  public void setQueryAllSensors(boolean queryAllSensors) {
+    this.queryAllSensors = queryAllSensors;
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/DiskAlignedChunkLoader.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/DiskAlignedChunkLoader.java
index 18907c22b3e..5b0165b2f7c 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/DiskAlignedChunkLoader.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/DiskAlignedChunkLoader.java
@@ -40,11 +40,19 @@ import static 
org.apache.iotdb.db.queryengine.metric.SeriesScanCostMetricSet.INI
 public class DiskAlignedChunkLoader implements IChunkLoader {
 
   private final boolean debug;
+
+  // only used for limit and offset push down optimizer, if we select all 
columns from aligned
+  // device, we
+  // can use statistics to skip.
+  // it's only exact while using limit & offset push down
+  private final boolean queryAllSensors;
+
   private static final SeriesScanCostMetricSet SERIES_SCAN_COST_METRIC_SET =
       SeriesScanCostMetricSet.getInstance();
 
-  public DiskAlignedChunkLoader(boolean debug) {
+  public DiskAlignedChunkLoader(boolean debug, boolean queryAllSensors) {
     this.debug = debug;
+    this.queryAllSensors = queryAllSensors;
   }
 
   @Override
@@ -75,7 +83,8 @@ public class DiskAlignedChunkLoader implements IChunkLoader {
       }
 
       long t2 = System.nanoTime();
-      IChunkReader chunkReader = new AlignedChunkReader(timeChunk, 
valueChunkList, timeFilter);
+      IChunkReader chunkReader =
+          new AlignedChunkReader(timeChunk, valueChunkList, timeFilter, 
queryAllSensors);
       SERIES_SCAN_COST_METRIC_SET.recordSeriesScanCost(
           INIT_CHUNK_READER_ALIGNED_DISK, System.nanoTime() - t2);
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedChunkLoader.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedChunkLoader.java
index a93a25bb7b1..63feb2220f1 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedChunkLoader.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedChunkLoader.java
@@ -36,11 +36,18 @@ public class MemAlignedChunkLoader implements IChunkLoader {
 
   private final AlignedReadOnlyMemChunk chunk;
 
+  // only used for limit and offset push down optimizer, if we select all 
columns from aligned
+  // device, we
+  // can use statistics to skip.
+  // it's only exact while using limit & offset push down
+  private final boolean queryAllSensors;
+
   private static final SeriesScanCostMetricSet SERIES_SCAN_COST_METRIC_SET =
       SeriesScanCostMetricSet.getInstance();
 
-  public MemAlignedChunkLoader(AlignedReadOnlyMemChunk chunk) {
+  public MemAlignedChunkLoader(AlignedReadOnlyMemChunk chunk, boolean 
queryAllSensors) {
     this.chunk = chunk;
+    this.queryAllSensors = queryAllSensors;
   }
 
   @Override
@@ -57,7 +64,7 @@ public class MemAlignedChunkLoader implements IChunkLoader {
   public IChunkReader getChunkReader(IChunkMetadata chunkMetaData, Filter 
timeFilter) {
     long startTime = System.nanoTime();
     try {
-      return new MemAlignedChunkReader(chunk, timeFilter);
+      return new MemAlignedChunkReader(chunk, timeFilter, queryAllSensors);
     } finally {
       long duration = System.nanoTime() - startTime;
       SERIES_SCAN_COST_METRIC_SET.recordSeriesScanCost(
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedChunkReader.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedChunkReader.java
index b7ff4cc89ed..66f36fea0b2 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedChunkReader.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedChunkReader.java
@@ -33,16 +33,18 @@ import java.util.List;
 /** To read aligned chunk data in memory. */
 public class MemAlignedChunkReader implements IChunkReader {
 
-  private List<IPageReader> pageReaderList;
+  private final List<IPageReader> pageReaderList;
 
-  public MemAlignedChunkReader(AlignedReadOnlyMemChunk readableChunk, Filter 
filter) {
+  public MemAlignedChunkReader(
+      AlignedReadOnlyMemChunk readableChunk, Filter filter, boolean 
queryAllSensors) {
     // we treat one ReadOnlyMemChunk as one Page
     this.pageReaderList =
         Collections.singletonList(
             new MemAlignedPageReader(
                 readableChunk.getTsBlock(),
                 (AlignedChunkMetadata) readableChunk.getChunkMetaData(),
-                filter));
+                filter,
+                queryAllSensors));
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedPageReader.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedPageReader.java
index 2f08be13c84..3f305da610d 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedPageReader.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedPageReader.java
@@ -46,15 +46,23 @@ public class MemAlignedPageReader implements IPageReader, 
IAlignedPageReader {
   private final TsBlock tsBlock;
   private final AlignedChunkMetadata chunkMetadata;
 
+  // only used for limit and offset push down optimizer, if we select all 
columns from aligned
+  // device, we
+  // can use statistics to skip.
+  // it's only exact while using limit & offset push down
+  private final boolean queryAllSensors;
+
   private Filter valueFilter;
   private PaginationController paginationController = 
UNLIMITED_PAGINATION_CONTROLLER;
 
   private TsBlockBuilder builder;
 
-  public MemAlignedPageReader(TsBlock tsBlock, AlignedChunkMetadata 
chunkMetadata, Filter filter) {
+  public MemAlignedPageReader(
+      TsBlock tsBlock, AlignedChunkMetadata chunkMetadata, Filter filter, 
boolean queryAllSensors) {
     this.tsBlock = tsBlock;
     this.chunkMetadata = chunkMetadata;
     this.valueFilter = filter;
+    this.queryAllSensors = queryAllSensors;
   }
 
   @Override
@@ -107,11 +115,13 @@ public class MemAlignedPageReader implements IPageReader, 
IAlignedPageReader {
       // NOTE: if we change the query semantic in the future for aligned 
series, we need to remove
       // this check here.
       long rowCount = getTimeStatistics().getCount();
-      boolean canUse = getValueStatisticsList().isEmpty();
-      for (Statistics<? extends Serializable> vStatistics : 
getValueStatisticsList()) {
-        if (vStatistics != null && !vStatistics.hasNullValue(rowCount)) {
-          canUse = true;
-          break;
+      boolean canUse = queryAllSensors || getValueStatisticsList().isEmpty();
+      if (!canUse) {
+        for (Statistics<? extends Serializable> vStatistics : 
getValueStatisticsList()) {
+          if (vStatistics != null && !vStatistics.hasNullValue(rowCount)) {
+            canUse = true;
+            break;
+          }
         }
       }
       if (!canUse) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/metadata/DiskAlignedChunkMetadataLoader.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/metadata/DiskAlignedChunkMetadataLoader.java
index 96326fb9443..95dbfd6e4e2 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/metadata/DiskAlignedChunkMetadataLoader.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/metadata/DiskAlignedChunkMetadataLoader.java
@@ -51,16 +51,27 @@ public class DiskAlignedChunkMetadataLoader implements 
IChunkMetadataLoader {
   // time filter or value filter, only used to check time range
   private final Filter filter;
 
+  // only used for limit and offset push down optimizer, if we select all 
columns from aligned
+  // device, we
+  // can use statistics to skip.
+  // it's only exact while using limit & offset push down
+  private final boolean queryAllSensors;
+
   private static final Logger DEBUG_LOGGER = 
LoggerFactory.getLogger("QUERY_DEBUG");
   private static final SeriesScanCostMetricSet SERIES_SCAN_COST_METRIC_SET =
       SeriesScanCostMetricSet.getInstance();
 
   public DiskAlignedChunkMetadataLoader(
-      TsFileResource resource, AlignedPath seriesPath, QueryContext context, 
Filter filter) {
+      TsFileResource resource,
+      AlignedPath seriesPath,
+      QueryContext context,
+      Filter filter,
+      boolean queryAllSensors) {
     this.resource = resource;
     this.seriesPath = seriesPath;
     this.context = context;
     this.filter = filter;
+    this.queryAllSensors = queryAllSensors;
   }
 
   @Override
@@ -111,7 +122,8 @@ public class DiskAlignedChunkMetadataLoader implements 
IChunkMetadataLoader {
             if (chunkMetadata.needSetChunkLoader()) {
               chunkMetadata.setFilePath(resource.getTsFilePath());
               chunkMetadata.setClosed(resource.isClosed());
-              chunkMetadata.setChunkLoader(new 
DiskAlignedChunkLoader(context.isDebug()));
+              chunkMetadata.setChunkLoader(
+                  new DiskAlignedChunkLoader(context.isDebug(), 
queryAllSensors));
             }
           });
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/metadata/MemAlignedChunkMetadataLoader.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/metadata/MemAlignedChunkMetadataLoader.java
index 90bbc3136ad..17bd551c7ab 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/metadata/MemAlignedChunkMetadataLoader.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/metadata/MemAlignedChunkMetadataLoader.java
@@ -22,6 +22,7 @@ package 
org.apache.iotdb.db.storageengine.dataregion.read.reader.chunk.metadata;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.queryengine.execution.fragment.QueryContext;
 import org.apache.iotdb.db.queryengine.metric.SeriesScanCostMetricSet;
+import 
org.apache.iotdb.db.storageengine.dataregion.memtable.AlignedReadOnlyMemChunk;
 import org.apache.iotdb.db.storageengine.dataregion.memtable.ReadOnlyMemChunk;
 import 
org.apache.iotdb.db.storageengine.dataregion.read.reader.chunk.DiskAlignedChunkLoader;
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
@@ -41,16 +42,26 @@ public class MemAlignedChunkMetadataLoader implements 
IChunkMetadataLoader {
   private final PartialPath seriesPath;
   private final QueryContext context;
   private final Filter timeFilter;
+  // only used for limit and offset push down optimizer, if we select all 
columns from aligned
+  // device, we
+  // can use statistics to skip.
+  // it's only exact while using limit & offset push down
+  private final boolean queryAllSensors;
 
   private static final SeriesScanCostMetricSet SERIES_SCAN_COST_METRIC_SET =
       SeriesScanCostMetricSet.getInstance();
 
   public MemAlignedChunkMetadataLoader(
-      TsFileResource resource, PartialPath seriesPath, QueryContext context, 
Filter timeFilter) {
+      TsFileResource resource,
+      PartialPath seriesPath,
+      QueryContext context,
+      Filter timeFilter,
+      boolean queryAllSensors) {
     this.resource = resource;
     this.seriesPath = seriesPath;
     this.context = context;
     this.timeFilter = timeFilter;
+    this.queryAllSensors = queryAllSensors;
   }
 
   @Override
@@ -66,7 +77,8 @@ public class MemAlignedChunkMetadataLoader implements 
IChunkMetadataLoader {
             if (chunkMetadata.needSetChunkLoader()) {
               chunkMetadata.setFilePath(resource.getTsFilePath());
               chunkMetadata.setClosed(resource.isClosed());
-              chunkMetadata.setChunkLoader(new 
DiskAlignedChunkLoader(context.isDebug()));
+              chunkMetadata.setChunkLoader(
+                  new DiskAlignedChunkLoader(context.isDebug(), 
queryAllSensors));
             }
           });
 
@@ -76,7 +88,8 @@ public class MemAlignedChunkMetadataLoader implements 
IChunkMetadataLoader {
       List<ReadOnlyMemChunk> memChunks = 
resource.getReadOnlyMemChunk(seriesPath);
       if (memChunks != null) {
         for (ReadOnlyMemChunk readOnlyMemChunk : memChunks) {
-          if (!memChunks.isEmpty()) {
+          if (!readOnlyMemChunk.isEmpty()) {
+            ((AlignedReadOnlyMemChunk) 
readOnlyMemChunk).setQueryAllSensors(queryAllSensors);
             chunkMetadataList.add(readOnlyMemChunk.getChunkMetaData());
           }
         }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/FileLoaderUtils.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/FileLoaderUtils.java
index 2f243b2b508..55d9f04e30e 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/FileLoaderUtils.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/FileLoaderUtils.java
@@ -201,7 +201,11 @@ public class FileLoaderUtils {
    * @throws IOException IOException may be thrown while reading it from disk.
    */
   public static AlignedTimeSeriesMetadata loadTimeSeriesMetadata(
-      TsFileResource resource, AlignedPath alignedPath, QueryContext context, 
Filter filter)
+      TsFileResource resource,
+      AlignedPath alignedPath,
+      QueryContext context,
+      Filter filter,
+      boolean queryAllSensors)
       throws IOException {
     final long t1 = System.nanoTime();
     boolean loadFromMem = false;
@@ -209,14 +213,16 @@ public class FileLoaderUtils {
       AlignedTimeSeriesMetadata alignedTimeSeriesMetadata;
       // If the tsfile is closed, we need to load from tsfile
       if (resource.isClosed()) {
-        alignedTimeSeriesMetadata = loadFromDisk(resource, alignedPath, 
context, filter);
+        alignedTimeSeriesMetadata =
+            loadFromDisk(resource, alignedPath, context, filter, 
queryAllSensors);
       } else { // if the tsfile is unclosed, we just get it directly from 
TsFileResource
         loadFromMem = true;
         alignedTimeSeriesMetadata =
             (AlignedTimeSeriesMetadata) 
resource.getTimeSeriesMetadata(alignedPath);
         if (alignedTimeSeriesMetadata != null) {
           alignedTimeSeriesMetadata.setChunkMetadataLoader(
-              new MemAlignedChunkMetadataLoader(resource, alignedPath, 
context, filter));
+              new MemAlignedChunkMetadataLoader(
+                  resource, alignedPath, context, filter, queryAllSensors));
         }
       }
 
@@ -252,7 +258,11 @@ public class FileLoaderUtils {
   }
 
   private static AlignedTimeSeriesMetadata loadFromDisk(
-      TsFileResource resource, AlignedPath alignedPath, QueryContext context, 
Filter filter)
+      TsFileResource resource,
+      AlignedPath alignedPath,
+      QueryContext context,
+      Filter filter,
+      boolean queryAllSensors)
       throws IOException {
     AlignedTimeSeriesMetadata alignedTimeSeriesMetadata = null;
     // load all the TimeseriesMetadata of vector, the first one is for time 
column and the
@@ -293,7 +303,8 @@ public class FileLoaderUtils {
         alignedTimeSeriesMetadata =
             new AlignedTimeSeriesMetadata(timeColumn, 
valueTimeSeriesMetadataList);
         alignedTimeSeriesMetadata.setChunkMetadataLoader(
-            new DiskAlignedChunkMetadataLoader(resource, alignedPath, context, 
filter));
+            new DiskAlignedChunkMetadataLoader(
+                resource, alignedPath, context, filter, queryAllSensors));
       }
     }
     return alignedTimeSeriesMetadata;
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedChunkLoaderTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedChunkLoaderTest.java
index e6f4b4475e6..8e1ba4f1bbf 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedChunkLoaderTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedChunkLoaderTest.java
@@ -52,7 +52,7 @@ public class MemAlignedChunkLoaderTest {
     AlignedReadOnlyMemChunk chunk = 
Mockito.mock(AlignedReadOnlyMemChunk.class);
     ChunkMetadata chunkMetadata = Mockito.mock(ChunkMetadata.class);
 
-    MemAlignedChunkLoader memAlignedChunkLoader = new 
MemAlignedChunkLoader(chunk);
+    MemAlignedChunkLoader memAlignedChunkLoader = new 
MemAlignedChunkLoader(chunk, false);
     try {
       memAlignedChunkLoader.loadChunk(chunkMetadata);
       fail();
diff --git 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileAlignedSeriesReaderIterator.java
 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileAlignedSeriesReaderIterator.java
index 2113a523fcd..f150bfd19e4 100644
--- 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileAlignedSeriesReaderIterator.java
+++ 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileAlignedSeriesReaderIterator.java
@@ -82,7 +82,7 @@ public class TsFileAlignedSeriesReaderIterator {
     }
 
     AlignedChunkReader chunkReader =
-        new AlignedChunkReader(timeChunk, Arrays.asList(valueChunks), null);
+        new AlignedChunkReader(timeChunk, Arrays.asList(valueChunks), null, 
false);
 
     return new NextAlignedChunkInfo(chunkReader, totalSize, notNullChunkNum, 
totalPointNum);
   }
diff --git 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/chunk/AlignedChunkReader.java
 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/chunk/AlignedChunkReader.java
index 86bd53f5616..7a1074562e9 100644
--- 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/chunk/AlignedChunkReader.java
+++ 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/chunk/AlignedChunkReader.java
@@ -92,7 +92,8 @@ public class AlignedChunkReader implements IChunkReader {
    *
    * @param filter filter
    */
-  public AlignedChunkReader(Chunk timeChunk, List<Chunk> valueChunkList, 
Filter filter)
+  public AlignedChunkReader(
+      Chunk timeChunk, List<Chunk> valueChunkList, Filter filter, boolean 
queryAllSensors)
       throws IOException {
     this.filter = filter;
     this.timeChunkDataBuffer = timeChunk.getData();
@@ -108,7 +109,7 @@ public class AlignedChunkReader implements IChunkReader {
           valueChunkStatisticsList.add(chunk == null ? null : 
chunk.getChunkStatistic());
           valueDeleteIntervalList.add(chunk == null ? null : 
chunk.getDeleteIntervalList());
         });
-    initAllPageReaders(timeChunk.getChunkStatistic(), 
valueChunkStatisticsList);
+    initAllPageReaders(timeChunk.getChunkStatistic(), 
valueChunkStatisticsList, queryAllSensors);
   }
 
   /**
@@ -132,12 +133,14 @@ public class AlignedChunkReader implements IChunkReader {
           valueChunkStatisticsList.add(chunk == null ? null : 
chunk.getChunkStatistic());
           valueDeleteIntervalList.add(chunk == null ? null : 
chunk.getDeleteIntervalList());
         });
-    initAllPageReaders(timeChunk.getChunkStatistic(), 
valueChunkStatisticsList);
+    initAllPageReaders(timeChunk.getChunkStatistic(), 
valueChunkStatisticsList, false);
   }
 
   /** construct all the page readers in this chunk */
   private void initAllPageReaders(
-      Statistics timeChunkStatistics, List<Statistics> 
valueChunkStatisticsList)
+      Statistics timeChunkStatistics,
+      List<Statistics> valueChunkStatisticsList,
+      boolean queryAllSensors)
       throws IOException {
     // construct next satisfied page header
     while (timeChunkDataBuffer.remaining() > 0) {
@@ -176,7 +179,7 @@ public class AlignedChunkReader implements IChunkReader {
       // if the current page satisfies
       if (exits && timePageSatisfied(timePageHeader)) {
         AlignedPageReader alignedPageReader =
-            constructPageReaderForNextPage(timePageHeader, 
valuePageHeaderList);
+            constructPageReaderForNextPage(timePageHeader, 
valuePageHeaderList, queryAllSensors);
         if (alignedPageReader != null) {
           pageReaderList.add(alignedPageReader);
         }
@@ -213,7 +216,8 @@ public class AlignedChunkReader implements IChunkReader {
   }
 
   private AlignedPageReader constructPageReaderForNextPage(
-      PageHeader timePageHeader, List<PageHeader> valuePageHeader) throws 
IOException {
+      PageHeader timePageHeader, List<PageHeader> valuePageHeader, boolean 
queryAllSensors)
+      throws IOException {
     PageInfo timePageInfo = new PageInfo();
     getPageInfo(timePageHeader, timeChunkDataBuffer, timeChunkHeader, 
timePageInfo);
     PageInfo valuePageInfo = new PageInfo();
diff --git 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/page/AlignedPageReader.java
 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/page/AlignedPageReader.java
index f0e7b497acb..8aaa3484f83 100644
--- 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/page/AlignedPageReader.java
+++ 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/page/AlignedPageReader.java
@@ -50,6 +50,12 @@ public class AlignedPageReader implements IPageReader, 
IAlignedPageReader {
   private final List<ValuePageReader> valuePageReaderList;
   private final int valueCount;
 
+  // only used for limit and offset push down optimizer, if we select all 
columns from aligned
+  // device, we
+  // can use statistics to skip.
+  // it's only exact while using limit & offset push down
+  private final boolean queryAllSensors;
+
   private Filter filter;
   private PaginationController paginationController = 
UNLIMITED_PAGINATION_CONTROLLER;
 
@@ -67,7 +73,8 @@ public class AlignedPageReader implements IPageReader, 
IAlignedPageReader {
       List<ByteBuffer> valuePageDataList,
       List<TSDataType> valueDataTypeList,
       List<Decoder> valueDecoderList,
-      Filter filter) {
+      Filter filter,
+      boolean queryAllSensors) {
     timePageReader = new TimePageReader(timePageHeader, timePageData, 
timeDecoder);
     isModified = timePageReader.isModified();
     valuePageReaderList = new ArrayList<>(valuePageHeaderList.size());
@@ -87,6 +94,7 @@ public class AlignedPageReader implements IPageReader, 
IAlignedPageReader {
     }
     this.filter = filter;
     this.valueCount = valuePageReaderList.size();
+    this.queryAllSensors = queryAllSensors;
   }
 
   @Override
@@ -126,11 +134,13 @@ public class AlignedPageReader implements IPageReader, 
IAlignedPageReader {
       // NOTE: if we change the query semantic in the future for aligned 
series, we need to remove
       // this check here.
       long rowCount = getTimeStatistics().getCount();
-      boolean canUse = getValueStatisticsList().isEmpty();
-      for (Statistics vStatistics : getValueStatisticsList()) {
-        if (vStatistics != null && !vStatistics.hasNullValue(rowCount)) {
-          canUse = true;
-          break;
+      boolean canUse = queryAllSensors || getValueStatisticsList().isEmpty();
+      if (!canUse) {
+        for (Statistics vStatistics : getValueStatisticsList()) {
+          if (vStatistics != null && !vStatistics.hasNullValue(rowCount)) {
+            canUse = true;
+            break;
+          }
         }
       }
       if (!canUse) {
diff --git 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/series/FileSeriesReader.java
 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/series/FileSeriesReader.java
index 222cc59a5c9..2e1e5090bd8 100644
--- 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/series/FileSeriesReader.java
+++ 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/series/FileSeriesReader.java
@@ -56,7 +56,7 @@ public class FileSeriesReader extends 
AbstractFileSeriesReader {
       for (IChunkMetadata metadata : 
alignedChunkMetadata.getValueChunkMetadataList()) {
         valueChunkList.add(chunkLoader.loadChunk((ChunkMetadata) metadata));
       }
-      this.chunkReader = new AlignedChunkReader(timeChunk, valueChunkList, 
filter);
+      this.chunkReader = new AlignedChunkReader(timeChunk, valueChunkList, 
filter, false);
     }
   }
 
diff --git 
a/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/write/TsFileIntegrityCheckingTool.java
 
b/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/write/TsFileIntegrityCheckingTool.java
index be55f4a0449..c753508b8f0 100644
--- 
a/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/write/TsFileIntegrityCheckingTool.java
+++ 
b/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/write/TsFileIntegrityCheckingTool.java
@@ -224,7 +224,8 @@ public class TsFileIntegrityCheckingTool {
                   reader.readMemChunk((ChunkMetadata) 
valueChunkMetadataList.get(chunkIdx));
               // construct an aligned chunk reader using time chunk and value 
chunk
               IChunkReader chunkReader =
-                  new AlignedChunkReader(timeChunk, 
Collections.singletonList(valueChunk), null);
+                  new AlignedChunkReader(
+                      timeChunk, Collections.singletonList(valueChunk), null, 
false);
               // verify the values
               List<Pair<Long, TsPrimitiveType>> originValue = 
originDataChunks.get(chunkIdx);
               for (int valIdx = 0; chunkReader.hasNextSatisfiedPage(); ) {

Reply via email to