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

hui pushed a commit to branch lmh/extendFilter
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/lmh/extendFilter by this push:
     new f95c8306733 add batch interface
f95c8306733 is described below

commit f95c8306733231dd403deb81a5846c58de0fdd45
Author: Minghui Liu <[email protected]>
AuthorDate: Tue Nov 28 16:53:34 2023 +0800

    add batch interface
---
 .../read/reader/chunk/MemAlignedPageReader.java    |   9 +-
 .../tsfile/file/metadata/AlignedChunkMetadata.java |  14 +-
 .../file/metadata/AlignedTimeSeriesMetadata.java   |  13 +-
 ...Metadata.java => IAlignedMetadataProvider.java} |  19 +-
 .../iotdb/tsfile/file/metadata/IChunkMetadata.java |   3 +-
 .../tsfile/file/metadata/TimeseriesMetadata.java   |   2 +-
 .../iotdb/tsfile/read/filter/basic/Filter.java     |   8 +-
 .../tsfile/read/filter/basic/ITimeFilter.java      |  11 +-
 .../tsfile/read/filter/basic/IValueFilter.java     |  16 +-
 .../tsfile/read/filter/basic/OperatorType.java     |  64 ++--
 .../tsfile/read/filter/factory/ValueFilter.java    |  94 +++---
 .../iotdb/tsfile/read/filter/operator/And.java     |  11 +-
 .../iotdb/tsfile/read/filter/operator/Not.java     |  15 +-
 .../iotdb/tsfile/read/filter/operator/Or.java      |  17 +-
 .../read/filter/operator/ValueFilterOperators.java | 352 ++++++++++++---------
 .../tsfile/read/reader/page/AlignedPageReader.java |  31 +-
 16 files changed, 412 insertions(+), 267 deletions(-)

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 4f3dd7bd7be..a4cc6ea373b 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
@@ -20,6 +20,7 @@
 package org.apache.iotdb.db.storageengine.dataregion.read.reader.chunk;
 
 import org.apache.iotdb.tsfile.file.metadata.AlignedChunkMetadata;
+import org.apache.iotdb.tsfile.file.metadata.IAlignedMetadataProvider;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
 import org.apache.iotdb.tsfile.read.common.BatchData;
@@ -41,7 +42,8 @@ import java.util.List;
 
 import static 
org.apache.iotdb.tsfile.read.reader.series.PaginationController.UNLIMITED_PAGINATION_CONTROLLER;
 
-public class MemAlignedPageReader implements IPageReader, IAlignedPageReader {
+public class MemAlignedPageReader
+    implements IPageReader, IAlignedPageReader, IAlignedMetadataProvider {
 
   private final TsBlock tsBlock;
   private final AlignedChunkMetadata chunkMetadata;
@@ -252,6 +254,11 @@ public class MemAlignedPageReader implements IPageReader, 
IAlignedPageReader {
     return chunkMetadata.getTimeStatistics();
   }
 
+  @Override
+  public Statistics<? extends Serializable> getMeasurementStatistics(int 
measurementIndex) {
+    return getStatistics(measurementIndex);
+  }
+
   private List<Statistics<? extends Serializable>> getValueStatisticsList() {
     return chunkMetadata.getValueStatisticsList();
   }
diff --git 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/AlignedChunkMetadata.java
 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/AlignedChunkMetadata.java
index 227475548be..8f116f6bced 100644
--- 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/AlignedChunkMetadata.java
+++ 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/AlignedChunkMetadata.java
@@ -29,7 +29,7 @@ import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 
-public class AlignedChunkMetadata implements IChunkMetadata {
+public class AlignedChunkMetadata implements IChunkMetadata, 
IAlignedMetadataProvider {
 
   // ChunkMetadata for time column
   private final IChunkMetadata timeChunkMetadata;
@@ -46,13 +46,13 @@ public class AlignedChunkMetadata implements IChunkMetadata 
{
   }
 
   @Override
-  public Statistics<? extends Serializable> getStatistics() {
+  public Statistics<Serializable> getStatistics() {
     return valueChunkMetadataList.size() == 1 && valueChunkMetadataList.get(0) 
!= null
         ? valueChunkMetadataList.get(0).getStatistics()
         : timeChunkMetadata.getStatistics();
   }
 
-  public Statistics<? extends Serializable> getStatistics(int index) {
+  public Statistics<Serializable> getStatistics(int index) {
     IChunkMetadata v = valueChunkMetadataList.get(index);
     return v == null ? null : v.getStatistics();
   }
@@ -65,10 +65,16 @@ public class AlignedChunkMetadata implements IChunkMetadata 
{
     return valueStatisticsList;
   }
 
-  public Statistics<? extends Serializable> getTimeStatistics() {
+  @Override
+  public Statistics<Serializable> getTimeStatistics() {
     return timeChunkMetadata.getStatistics();
   }
 
+  @Override
+  public Statistics<Serializable> getMeasurementStatistics(int 
measurementIndex) {
+    return getStatistics(measurementIndex);
+  }
+
   @Override
   public boolean isModified() {
     return timeChunkMetadata.isModified();
diff --git 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/AlignedTimeSeriesMetadata.java
 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/AlignedTimeSeriesMetadata.java
index 79d20588418..c2bc1426c58 100644
--- 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/AlignedTimeSeriesMetadata.java
+++ 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/AlignedTimeSeriesMetadata.java
@@ -22,11 +22,12 @@ package org.apache.iotdb.tsfile.file.metadata;
 import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
 import org.apache.iotdb.tsfile.read.controller.IChunkMetadataLoader;
 
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
-public class AlignedTimeSeriesMetadata implements ITimeSeriesMetadata {
+public class AlignedTimeSeriesMetadata implements ITimeSeriesMetadata, 
IAlignedMetadataProvider {
 
   // TimeSeriesMetadata for time column
   private final TimeseriesMetadata timeseriesMetadata;
@@ -52,7 +53,7 @@ public class AlignedTimeSeriesMetadata implements 
ITimeSeriesMetadata {
         : timeseriesMetadata.getStatistics();
   }
 
-  public Statistics getStatistics(int index) {
+  public Statistics<? extends Serializable> getStatistics(int index) {
     TimeseriesMetadata v = valueTimeseriesMetadataList.get(index);
     return v == null ? null : v.getStatistics();
   }
@@ -65,10 +66,16 @@ public class AlignedTimeSeriesMetadata implements 
ITimeSeriesMetadata {
     return valueStatisticsList;
   }
 
-  public Statistics getTimeStatistics() {
+  @Override
+  public Statistics<? extends Serializable> getTimeStatistics() {
     return timeseriesMetadata.getStatistics();
   }
 
+  @Override
+  public Statistics<? extends Serializable> getMeasurementStatistics(int 
measurementIndex) {
+    return getStatistics(measurementIndex);
+  }
+
   @Override
   public boolean isModified() {
     return timeseriesMetadata.isModified();
diff --git 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IAlignedMetadata.java
 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IAlignedMetadataProvider.java
similarity index 65%
rename from 
iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IAlignedMetadata.java
rename to 
iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IAlignedMetadataProvider.java
index 78425a00825..71b32034871 100644
--- 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IAlignedMetadata.java
+++ 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IAlignedMetadataProvider.java
@@ -20,24 +20,21 @@
 package org.apache.iotdb.tsfile.file.metadata;
 
 import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
-import org.apache.iotdb.tsfile.file.metadata.statistics.TimeStatistics;
 
 import java.io.Serializable;
 
-public interface IAlignedMetadata {
+public interface IAlignedMetadataProvider {
 
-  TimeStatistics getTimeStatistics();
+  Statistics<? extends Serializable> getTimeStatistics();
 
-  Statistics<Serializable> getMeasurementStatistics(String measurement);
+  Statistics<? extends Serializable> getMeasurementStatistics(int 
measurementIndex);
 
-  /** @return whether there are any nulls. */
-  default boolean hasNullValue(String measurement) {
-    return getMeasurementStatistics(measurement).hasNullValue(getRowCount());
+  default boolean hasNullValue(int measurementIndex) {
+    long rowCount = getTimeStatistics().getCount();
+    return getMeasurementStatistics(measurementIndex).hasNullValue(rowCount);
   }
 
-  default long getRowCount() {
-    return getTimeStatistics().getCount();
+  default boolean isAllNulls(int measurementIndex) {
+    return false;
   }
-
-  boolean isAllNulls(String measurement);
 }
diff --git 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IChunkMetadata.java
 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IChunkMetadata.java
index 2dbedd1be1b..d84ae7fb745 100644
--- 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IChunkMetadata.java
+++ 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IChunkMetadata.java
@@ -26,12 +26,11 @@ import org.apache.iotdb.tsfile.read.controller.IChunkLoader;
 
 import java.io.IOException;
 import java.io.OutputStream;
-import java.io.Serializable;
 import java.util.List;
 
 public interface IChunkMetadata {
 
-  Statistics<? extends Serializable> getStatistics();
+  Statistics getStatistics();
 
   boolean isModified();
 
diff --git 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadata.java
 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadata.java
index b40868d4346..a45ea0525a7 100644
--- 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadata.java
+++ 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadata.java
@@ -87,7 +87,7 @@ public class TimeseriesMetadata implements 
ITimeSeriesMetadata {
       int chunkMetaDataListDataSize,
       String measurementId,
       TSDataType dataType,
-      Statistics<? extends Serializable> statistics,
+      Statistics<Serializable> statistics,
       PublicBAOS chunkMetadataListBuffer) {
     this.timeSeriesMetadataType = timeSeriesMetadataType;
     this.chunkMetaDataListDataSize = chunkMetaDataListDataSize;
diff --git 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/Filter.java
 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/Filter.java
index 890527800ee..6e621043e1e 100755
--- 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/Filter.java
+++ 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/Filter.java
@@ -19,7 +19,7 @@
 
 package org.apache.iotdb.tsfile.read.filter.basic;
 
-import org.apache.iotdb.tsfile.file.metadata.IAlignedMetadata;
+import org.apache.iotdb.tsfile.file.metadata.IAlignedMetadataProvider;
 import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
 import org.apache.iotdb.tsfile.read.common.TimeRange;
 import org.apache.iotdb.tsfile.read.filter.factory.FilterFactory;
@@ -66,6 +66,8 @@ public interface Filter {
    */
   boolean satisfy(long time, Object value);
 
+  boolean satisfy(long time, Object[] values);
+
   /**
    * To examine whether there are data points satisfied with the filter.
    *
@@ -74,7 +76,7 @@ public interface Filter {
    */
   boolean canSkip(Statistics<? extends Serializable> statistics);
 
-  boolean canSkip(IAlignedMetadata alignedMetadata);
+  boolean canSkip(IAlignedMetadataProvider alignedMetadata);
 
   /**
    * To examine whether all data points are satisfied with the filter.
@@ -84,7 +86,7 @@ public interface Filter {
    */
   boolean allSatisfy(Statistics<? extends Serializable> statistics);
 
-  boolean allSatisfy(IAlignedMetadata alignedMetadata);
+  boolean allSatisfy(IAlignedMetadataProvider alignedMetadata);
 
   /**
    * To examine whether the min time and max time are satisfied with the 
filter.
diff --git 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/ITimeFilter.java
 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/ITimeFilter.java
index 5a387ab3724..e9770e6e0a4 100644
--- 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/ITimeFilter.java
+++ 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/ITimeFilter.java
@@ -19,18 +19,23 @@
 
 package org.apache.iotdb.tsfile.read.filter.basic;
 
-import org.apache.iotdb.tsfile.file.metadata.IAlignedMetadata;
+import org.apache.iotdb.tsfile.file.metadata.IAlignedMetadataProvider;
 import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
 
 import java.io.Serializable;
 
 public interface ITimeFilter extends Filter {
 
+  default boolean satisfy(long time, Object[] values) {
+    // only use time to filter
+    return satisfy(time, values[0]);
+  }
+
   default boolean canSkip(Statistics<? extends Serializable> statistics) {
     return !satisfyStartEndTime(statistics.getStartTime(), 
statistics.getEndTime());
   }
 
-  default boolean canSkip(IAlignedMetadata alignedMetadata) {
+  default boolean canSkip(IAlignedMetadataProvider alignedMetadata) {
     return canSkip(alignedMetadata.getTimeStatistics());
   }
 
@@ -38,7 +43,7 @@ public interface ITimeFilter extends Filter {
     return containStartEndTime(statistics.getStartTime(), 
statistics.getEndTime());
   }
 
-  default boolean allSatisfy(IAlignedMetadata alignedMetadata) {
+  default boolean allSatisfy(IAlignedMetadataProvider alignedMetadata) {
     return allSatisfy(alignedMetadata.getTimeStatistics());
   }
 }
diff --git 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/IValueFilter.java
 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/IValueFilter.java
index 3c306149fb9..2e577f323dd 100644
--- 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/IValueFilter.java
+++ 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/IValueFilter.java
@@ -19,21 +19,25 @@
 
 package org.apache.iotdb.tsfile.read.filter.basic;
 
-import org.apache.iotdb.tsfile.file.metadata.IAlignedMetadata;
+import org.apache.iotdb.tsfile.file.metadata.IAlignedMetadataProvider;
 import org.apache.iotdb.tsfile.read.common.TimeRange;
 
 import java.util.List;
 
 public interface IValueFilter extends Filter {
 
-  String getMeasurement();
+  int getMeasurementIndex();
 
-  default boolean canSkip(IAlignedMetadata alignedMetadata) {
-    return canSkip(alignedMetadata.getMeasurementStatistics(getMeasurement()));
+  default boolean satisfy(long time, Object[] values) {
+    return satisfy(time, values[getMeasurementIndex()]);
   }
 
-  default boolean allSatisfy(IAlignedMetadata alignedMetadata) {
-    return 
allSatisfy(alignedMetadata.getMeasurementStatistics(getMeasurement()));
+  default boolean canSkip(IAlignedMetadataProvider alignedMetadata) {
+    return 
canSkip(alignedMetadata.getMeasurementStatistics(getMeasurementIndex()));
+  }
+
+  default boolean allSatisfy(IAlignedMetadataProvider alignedMetadata) {
+    return 
allSatisfy(alignedMetadata.getMeasurementStatistics(getMeasurementIndex()));
   }
 
   default boolean satisfyStartEndTime(long startTime, long endTime) {
diff --git 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/OperatorType.java
 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/OperatorType.java
index d80117d6fb8..d4f329229e2 100644
--- 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/OperatorType.java
+++ 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/OperatorType.java
@@ -21,41 +21,51 @@ package org.apache.iotdb.tsfile.read.filter.basic;
 
 public enum OperatorType {
   // comparison
-  TIME_EQ,
-  VALUE_EQ,
-  TIME_NEQ,
-  VALUE_NEQ,
-  TIME_GT,
-  VALUE_GT,
-  TIME_GTEQ,
-  VALUE_GTEQ,
-  TIME_LT,
-  VALUE_LT,
-  TIME_LTEQ,
-  VALUE_LTEQ,
+  TIME_EQ("=="),
+  VALUE_EQ("=="),
+  TIME_NEQ("!="),
+  VALUE_NEQ("!="),
+  TIME_GT(">"),
+  VALUE_GT(">"),
+  TIME_GTEQ(">="),
+  VALUE_GTEQ(">="),
+  TIME_LT("<"),
+  VALUE_LT("<"),
+  TIME_LTEQ("<="),
+  VALUE_LTEQ("<="),
 
   // logical
-  NOT,
-  AND,
-  OR,
+  NOT("NOT"),
+  AND("&&"),
+  OR("||"),
 
   // range
-  TIME_BETWEEN_AND,
-  VALUE_BETWEEN_AND,
-  TIME_NOT_BETWEEN_AND,
-  VALUE_NOT_BETWEEN_AND,
+  TIME_BETWEEN_AND("BETWEEN"),
+  VALUE_BETWEEN_AND("BETWEEN"),
+  TIME_NOT_BETWEEN_AND("NOT BETWEEN"),
+  VALUE_NOT_BETWEEN_AND("NOT BETWEEN"),
 
   // set
-  TIME_IN,
-  VALUE_IN,
-  TIME_NOT_IN,
-  VALUE_NOT_IN,
+  TIME_IN("IN"),
+  VALUE_IN("IN"),
+  TIME_NOT_IN("NOT IN"),
+  VALUE_NOT_IN("NOT IN"),
 
   // pattern match
-  VALUE_REGEXP,
-  VALUE_NOT_REGEXP,
+  VALUE_REGEXP("MATCH"),
+  VALUE_NOT_REGEXP("NOT MATCH"),
 
   // group by
-  GROUP_BY_TIME,
-  GROUP_BY_MONTH;
+  GROUP_BY_TIME("GROUP BY TIME"),
+  GROUP_BY_MONTH("GROUP BY MONTH");
+
+  private final String symbol;
+
+  OperatorType(String symbol) {
+    this.symbol = symbol;
+  }
+
+  public String getSymbol() {
+    return symbol;
+  }
 }
diff --git 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/factory/ValueFilter.java
 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/factory/ValueFilter.java
index 726159c2cda..f39e7e8c3db 100644
--- 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/factory/ValueFilter.java
+++ 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/factory/ValueFilter.java
@@ -42,127 +42,127 @@ public class ValueFilter {
     // forbidden construction
   }
 
-  private static final String FAKE_MEASUREMENT = "value";
+  private static final int DEFAULT_MEASUREMENT_INDEX = 0;
 
   public static <T extends Comparable<T>> ValueGt<T> gt(T value) {
-    return new ValueGt<>(FAKE_MEASUREMENT, value);
+    return new ValueGt<>(DEFAULT_MEASUREMENT_INDEX, value);
   }
 
-  public static <T extends Comparable<T>> ValueGt<T> gt(String measurement, T 
value) {
-    return new ValueGt<>(measurement, value);
+  public static <T extends Comparable<T>> ValueGt<T> gt(int measurementIndex, 
T value) {
+    return new ValueGt<>(measurementIndex, value);
   }
 
   public static <T extends Comparable<T>> ValueGtEq<T> gtEq(T value) {
-    return new ValueGtEq<>(FAKE_MEASUREMENT, value);
+    return new ValueGtEq<>(DEFAULT_MEASUREMENT_INDEX, value);
   }
 
-  public static <T extends Comparable<T>> ValueGtEq<T> gtEq(String 
measurement, T value) {
-    return new ValueGtEq<>(measurement, value);
+  public static <T extends Comparable<T>> ValueGtEq<T> gtEq(int 
measurementIndex, T value) {
+    return new ValueGtEq<>(measurementIndex, value);
   }
 
   public static <T extends Comparable<T>> ValueLt<T> lt(T value) {
-    return new ValueLt<>(FAKE_MEASUREMENT, value);
+    return new ValueLt<>(DEFAULT_MEASUREMENT_INDEX, value);
   }
 
-  public static <T extends Comparable<T>> ValueLt<T> lt(String measurement, T 
value) {
-    return new ValueLt<>(measurement, value);
+  public static <T extends Comparable<T>> ValueLt<T> lt(int measurementIndex, 
T value) {
+    return new ValueLt<>(measurementIndex, value);
   }
 
   public static <T extends Comparable<T>> ValueLtEq<T> ltEq(T value) {
-    return new ValueLtEq<>(FAKE_MEASUREMENT, value);
+    return new ValueLtEq<>(DEFAULT_MEASUREMENT_INDEX, value);
   }
 
-  public static <T extends Comparable<T>> ValueLtEq<T> ltEq(String 
measurement, T value) {
-    return new ValueLtEq<>(measurement, value);
+  public static <T extends Comparable<T>> ValueLtEq<T> ltEq(int 
measurementIndex, T value) {
+    return new ValueLtEq<>(measurementIndex, value);
   }
 
   public static <T extends Comparable<T>> ValueEq<T> eq(T value) {
-    return new ValueEq<>(FAKE_MEASUREMENT, value);
+    return new ValueEq<>(DEFAULT_MEASUREMENT_INDEX, value);
   }
 
-  public static <T extends Comparable<T>> ValueEq<T> eq(String measurement, T 
value) {
-    return new ValueEq<>(measurement, value);
+  public static <T extends Comparable<T>> ValueEq<T> eq(int measurementIndex, 
T value) {
+    return new ValueEq<>(measurementIndex, value);
   }
 
   public static <T extends Comparable<T>> ValueNotEq<T> notEq(T value) {
-    return new ValueNotEq<>(FAKE_MEASUREMENT, value);
+    return new ValueNotEq<>(DEFAULT_MEASUREMENT_INDEX, value);
   }
 
-  public static <T extends Comparable<T>> ValueNotEq<T> notEq(String 
measurement, T value) {
-    return new ValueNotEq<>(measurement, value);
+  public static <T extends Comparable<T>> ValueNotEq<T> notEq(int 
measurementIndex, T value) {
+    return new ValueNotEq<>(measurementIndex, value);
   }
 
   public static <T extends Comparable<T>> ValueBetweenAnd<T> between(T value1, 
T value2) {
-    return new ValueBetweenAnd<>(FAKE_MEASUREMENT, value1, value2);
+    return new ValueBetweenAnd<>(DEFAULT_MEASUREMENT_INDEX, value1, value2);
   }
 
   public static <T extends Comparable<T>> ValueBetweenAnd<T> between(
-      String measurement, T value1, T value2) {
-    return new ValueBetweenAnd<>(measurement, value1, value2);
+      int measurementIndex, T value1, T value2) {
+    return new ValueBetweenAnd<>(measurementIndex, value1, value2);
   }
 
   public static <T extends Comparable<T>> ValueNotBetweenAnd<T> notBetween(T 
value1, T value2) {
-    return new ValueNotBetweenAnd<>(FAKE_MEASUREMENT, value1, value2);
+    return new ValueNotBetweenAnd<>(DEFAULT_MEASUREMENT_INDEX, value1, value2);
   }
 
   public static <T extends Comparable<T>> ValueNotBetweenAnd<T> notBetween(
-      String measurement, T value1, T value2) {
-    return new ValueNotBetweenAnd<>(measurement, value1, value2);
+      int measurementIndex, T value1, T value2) {
+    return new ValueNotBetweenAnd<>(measurementIndex, value1, value2);
   }
 
   public static ValueRegexp like(String likePattern) {
-    return regexp(FAKE_MEASUREMENT, 
RegexUtils.parseLikePatternToRegex(likePattern));
+    return regexp(DEFAULT_MEASUREMENT_INDEX, 
RegexUtils.parseLikePatternToRegex(likePattern));
   }
 
-  public static ValueRegexp like(String measurement, String likePattern) {
-    return regexp(measurement, 
RegexUtils.parseLikePatternToRegex(likePattern));
+  public static ValueRegexp like(int measurementIndex, String likePattern) {
+    return regexp(measurementIndex, 
RegexUtils.parseLikePatternToRegex(likePattern));
   }
 
   public static ValueNotRegexp notLike(String likePattern) {
-    return notRegexp(FAKE_MEASUREMENT, 
RegexUtils.parseLikePatternToRegex(likePattern));
+    return notRegexp(DEFAULT_MEASUREMENT_INDEX, 
RegexUtils.parseLikePatternToRegex(likePattern));
   }
 
-  public static ValueNotRegexp notLike(String measurement, String likePattern) 
{
-    return notRegexp(measurement, 
RegexUtils.parseLikePatternToRegex(likePattern));
+  public static ValueNotRegexp notLike(int measurementIndex, String 
likePattern) {
+    return notRegexp(measurementIndex, 
RegexUtils.parseLikePatternToRegex(likePattern));
   }
 
   public static ValueRegexp regexp(String regex) {
-    return new ValueRegexp(FAKE_MEASUREMENT, RegexUtils.compileRegex(regex));
+    return new ValueRegexp(DEFAULT_MEASUREMENT_INDEX, 
RegexUtils.compileRegex(regex));
   }
 
-  public static ValueRegexp regexp(String measurement, String regex) {
-    return new ValueRegexp(measurement, RegexUtils.compileRegex(regex));
+  public static ValueRegexp regexp(int measurementIndex, String regex) {
+    return new ValueRegexp(measurementIndex, RegexUtils.compileRegex(regex));
   }
 
-  public static ValueRegexp regexp(String measurement, Pattern pattern) {
-    return new ValueRegexp(measurement, pattern);
+  public static ValueRegexp regexp(int measurementIndex, Pattern pattern) {
+    return new ValueRegexp(measurementIndex, pattern);
   }
 
   public static ValueNotRegexp notRegexp(String regex) {
-    return new ValueNotRegexp(FAKE_MEASUREMENT, 
RegexUtils.compileRegex(regex));
+    return new ValueNotRegexp(DEFAULT_MEASUREMENT_INDEX, 
RegexUtils.compileRegex(regex));
   }
 
-  public static ValueNotRegexp notRegexp(String measurement, String regex) {
-    return new ValueNotRegexp(measurement, RegexUtils.compileRegex(regex));
+  public static ValueNotRegexp notRegexp(int measurementIndex, String regex) {
+    return new ValueNotRegexp(measurementIndex, 
RegexUtils.compileRegex(regex));
   }
 
-  public static ValueNotRegexp notRegexp(String measurement, Pattern pattern) {
-    return new ValueNotRegexp(measurement, pattern);
+  public static ValueNotRegexp notRegexp(int measurementIndex, Pattern 
pattern) {
+    return new ValueNotRegexp(measurementIndex, pattern);
   }
 
   public static <T extends Comparable<T>> ValueIn<T> in(Set<T> values) {
-    return new ValueIn<>(FAKE_MEASUREMENT, values);
+    return new ValueIn<>(DEFAULT_MEASUREMENT_INDEX, values);
   }
 
-  public static <T extends Comparable<T>> ValueIn<T> in(String measurement, 
Set<T> values) {
-    return new ValueIn<>(measurement, values);
+  public static <T extends Comparable<T>> ValueIn<T> in(int measurementIndex, 
Set<T> values) {
+    return new ValueIn<>(measurementIndex, values);
   }
 
   public static <T extends Comparable<T>> ValueNotIn<T> notIn(Set<T> values) {
-    return new ValueNotIn<>(FAKE_MEASUREMENT, values);
+    return new ValueNotIn<>(DEFAULT_MEASUREMENT_INDEX, values);
   }
 
-  public static <T extends Comparable<T>> ValueNotIn<T> notIn(String 
measurement, Set<T> values) {
-    return new ValueNotIn<>(measurement, values);
+  public static <T extends Comparable<T>> ValueNotIn<T> notIn(int 
measurementIndex, Set<T> values) {
+    return new ValueNotIn<>(measurementIndex, values);
   }
 }
diff --git 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/And.java
 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/And.java
index 6a6480c882b..68b702a8c92 100644
--- 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/And.java
+++ 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/And.java
@@ -19,7 +19,7 @@
 
 package org.apache.iotdb.tsfile.read.filter.operator;
 
-import org.apache.iotdb.tsfile.file.metadata.IAlignedMetadata;
+import org.apache.iotdb.tsfile.file.metadata.IAlignedMetadataProvider;
 import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
 import org.apache.iotdb.tsfile.read.common.TimeRange;
 import org.apache.iotdb.tsfile.read.filter.basic.Filter;
@@ -46,6 +46,11 @@ public class And extends BinaryLogicalFilter {
     return left.satisfy(time, value) && right.satisfy(time, value);
   }
 
+  @Override
+  public boolean satisfy(long time, Object[] values) {
+    return left.satisfy(time, values) && right.satisfy(time, values);
+  }
+
   @Override
   public boolean canSkip(Statistics<? extends Serializable> statistics) {
     // we can drop a chunk of records if we know that either the left or the 
right predicate agrees
@@ -54,7 +59,7 @@ public class And extends BinaryLogicalFilter {
   }
 
   @Override
-  public boolean canSkip(IAlignedMetadata alignedMetadata) {
+  public boolean canSkip(IAlignedMetadataProvider alignedMetadata) {
     return left.canSkip(alignedMetadata) || right.canSkip(alignedMetadata);
   }
 
@@ -64,7 +69,7 @@ public class And extends BinaryLogicalFilter {
   }
 
   @Override
-  public boolean allSatisfy(IAlignedMetadata alignedMetadata) {
+  public boolean allSatisfy(IAlignedMetadataProvider alignedMetadata) {
     return left.allSatisfy(alignedMetadata) && 
right.allSatisfy(alignedMetadata);
   }
 
diff --git 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Not.java
 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Not.java
index 90ea0a53edf..3d00981bd82 100644
--- 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Not.java
+++ 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Not.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.tsfile.read.filter.operator;
 
+import org.apache.iotdb.tsfile.file.metadata.IAlignedMetadataProvider;
 import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
 import org.apache.iotdb.tsfile.read.common.TimeRange;
 import org.apache.iotdb.tsfile.read.filter.basic.Filter;
@@ -31,7 +32,6 @@ import java.io.Serializable;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 import java.util.Objects;
 
 public class Not implements Filter {
@@ -55,14 +55,18 @@ public class Not implements Filter {
     return !filter.satisfy(time, value);
   }
 
+  @Override
+  public boolean satisfy(long time, Object[] values) {
+    return !filter.satisfy(time, values);
+  }
+
   @Override
   public boolean canSkip(Statistics<? extends Serializable> statistics) {
     throw new IllegalArgumentException(CONTAIN_NOT_ERR_MSG + this);
   }
 
   @Override
-  public boolean canSkip(
-      Map<String, Statistics<? extends Serializable>> 
measurementToStatisticsMap) {
+  public boolean canSkip(IAlignedMetadataProvider alignedMetadata) {
     throw new IllegalArgumentException(CONTAIN_NOT_ERR_MSG + this);
   }
 
@@ -71,6 +75,11 @@ public class Not implements Filter {
     throw new IllegalArgumentException(CONTAIN_NOT_ERR_MSG + this);
   }
 
+  @Override
+  public boolean allSatisfy(IAlignedMetadataProvider alignedMetadata) {
+    throw new IllegalArgumentException(CONTAIN_NOT_ERR_MSG + this);
+  }
+
   @Override
   public boolean satisfyStartEndTime(long startTime, long endTime) {
     throw new IllegalArgumentException(CONTAIN_NOT_ERR_MSG + this);
diff --git 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Or.java
 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Or.java
index 20d6f9f38e6..26e77d84685 100644
--- 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Or.java
+++ 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Or.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.tsfile.read.filter.operator;
 
+import org.apache.iotdb.tsfile.file.metadata.IAlignedMetadataProvider;
 import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
 import org.apache.iotdb.tsfile.read.common.TimeRange;
 import org.apache.iotdb.tsfile.read.filter.basic.Filter;
@@ -29,7 +30,6 @@ import java.io.Serializable;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 
 public class Or extends BinaryLogicalFilter {
 
@@ -46,6 +46,11 @@ public class Or extends BinaryLogicalFilter {
     return left.satisfy(time, value) || right.satisfy(time, value);
   }
 
+  @Override
+  public boolean satisfy(long time, Object[] values) {
+    return left.satisfy(time, values) || right.satisfy(time, values);
+  }
+
   @Override
   public boolean canSkip(Statistics<? extends Serializable> statistics) {
     // we can only drop a chunk of records if we know that both the left and 
right predicates agree
@@ -54,9 +59,8 @@ public class Or extends BinaryLogicalFilter {
   }
 
   @Override
-  public boolean canSkip(
-      Map<String, Statistics<? extends Serializable>> 
measurementToStatisticsMap) {
-    return left.canSkip(measurementToStatisticsMap) && 
right.canSkip(measurementToStatisticsMap);
+  public boolean canSkip(IAlignedMetadataProvider alignedMetadata) {
+    return left.canSkip(alignedMetadata) && right.canSkip(alignedMetadata);
   }
 
   @Override
@@ -64,6 +68,11 @@ public class Or extends BinaryLogicalFilter {
     return left.allSatisfy(statistics) || right.allSatisfy(statistics);
   }
 
+  @Override
+  public boolean allSatisfy(IAlignedMetadataProvider alignedMetadata) {
+    return left.allSatisfy(alignedMetadata) || 
right.allSatisfy(alignedMetadata);
+  }
+
   @Override
   public boolean satisfyStartEndTime(long startTime, long endTime) {
     return left.satisfyStartEndTime(startTime, endTime)
diff --git 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/ValueFilterOperators.java
 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/ValueFilterOperators.java
index e186c9d0988..adde2d6d117 100644
--- 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/ValueFilterOperators.java
+++ 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/ValueFilterOperators.java
@@ -20,7 +20,7 @@
 package org.apache.iotdb.tsfile.read.filter.operator;
 
 import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
-import org.apache.iotdb.tsfile.file.metadata.IAlignedMetadata;
+import org.apache.iotdb.tsfile.file.metadata.IAlignedMetadataProvider;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
 import org.apache.iotdb.tsfile.read.filter.basic.Filter;
@@ -52,32 +52,34 @@ public final class ValueFilterOperators {
     // forbidden construction
   }
 
-  private static final String MEASUREMENT_CANNOT_BE_NULL_MSG = "measurement 
cannot be null";
   private static final String CONSTANT_CANNOT_BE_NULL_MSG = "constant cannot 
be null";
 
   private static final boolean BLOCK_MIGHT_MATCH = false;
   private static final boolean BLOCK_CANNOT_MATCH = true;
+  private static final boolean BLOCK_ALL_MATCH = true;
+
+  private static final String OPERATOR_TO_STRING_FORMAT = "measurements[%s] %s 
%s";
 
   // base class for ValueEq, ValueNotEq, ValueLt, ValueGt, ValueLtEq, ValueGtEq
   abstract static class ValueColumnCompareFilter<T extends Comparable<T>>
       extends ColumnCompareFilter<T> implements IValueFilter {
 
-    protected final String measurement;
+    protected final int measurementIndex;
 
-    protected ValueColumnCompareFilter(String measurement, T constant) {
+    protected ValueColumnCompareFilter(int measurementIndex, T constant) {
       super(constant);
-      this.measurement = Objects.requireNonNull(measurement, 
MEASUREMENT_CANNOT_BE_NULL_MSG);
+      this.measurementIndex = measurementIndex;
     }
 
     @Override
-    public String getMeasurement() {
-      return measurement;
+    public int getMeasurementIndex() {
+      return measurementIndex;
     }
 
     @Override
     public void serialize(DataOutputStream outputStream) throws IOException {
       ReadWriteIOUtils.write(getOperatorType().ordinal(), outputStream);
-      ReadWriteIOUtils.write(measurement, outputStream);
+      ReadWriteIOUtils.write(measurementIndex, outputStream);
       ReadWriteIOUtils.writeObject(constant, outputStream);
     }
 
@@ -89,26 +91,35 @@ public final class ValueFilterOperators {
       if (o == null || getClass() != o.getClass()) {
         return false;
       }
+      if (!super.equals(o)) {
+        return false;
+      }
       ValueColumnCompareFilter<?> that = (ValueColumnCompareFilter<?>) o;
-      return measurement.equals(that.measurement);
+      return measurementIndex == that.measurementIndex;
     }
 
     @Override
     public int hashCode() {
-      return Objects.hash(measurement);
+      return Objects.hash(super.hashCode(), measurementIndex);
+    }
+
+    @Override
+    public String toString() {
+      return String.format(
+          OPERATOR_TO_STRING_FORMAT, measurementIndex, 
getOperatorType().getSymbol(), constant);
     }
   }
 
   public static final class ValueEq<T extends Comparable<T>> extends 
ValueColumnCompareFilter<T> {
 
     // constant can be null
-    public ValueEq(String measurement, T constant) {
-      super(measurement, constant);
+    public ValueEq(int measurementIndex, T constant) {
+      super(measurementIndex, constant);
     }
 
     @SuppressWarnings("unchecked")
     public ValueEq(ByteBuffer buffer) {
-      this(ReadWriteIOUtils.readString(buffer), (T) 
ReadWriteIOUtils.readObject(buffer));
+      this(ReadWriteIOUtils.readInt(buffer), (T) 
ReadWriteIOUtils.readObject(buffer));
     }
 
     @Override
@@ -123,6 +134,11 @@ public final class ValueFilterOperators {
         return BLOCK_MIGHT_MATCH;
       }
 
+      if (constant == null) {
+        // non-aligned page don't have null value
+        return BLOCK_CANNOT_MATCH;
+      }
+
       // drop if value < min || value > max
       return constant.compareTo((T) statistics.getMinValue()) < 0
           || constant.compareTo((T) statistics.getMaxValue()) > 0;
@@ -130,9 +146,9 @@ public final class ValueFilterOperators {
 
     @Override
     @SuppressWarnings("unchecked")
-    public boolean canSkip(IAlignedMetadata alignedMetadata) {
+    public boolean canSkip(IAlignedMetadataProvider alignedMetadata) {
       Statistics<? extends Serializable> statistics =
-          alignedMetadata.getMeasurementStatistics(measurement);
+          alignedMetadata.getMeasurementStatistics(measurementIndex);
 
       if (statistics == null) {
         // the measurement isn't in this block so all values are null.
@@ -150,7 +166,10 @@ public final class ValueFilterOperators {
       if (constant == null) {
         // we are looking for records where v eq(null)
         // so drop if there are no nulls in this chunk
-        return !alignedMetadata.hasNullValue(measurement);
+        if (!alignedMetadata.hasNullValue(measurementIndex)) {
+          return BLOCK_CANNOT_MATCH;
+        }
+        return BLOCK_MIGHT_MATCH;
       }
 
       // drop if value < min || value > max
@@ -165,23 +184,53 @@ public final class ValueFilterOperators {
         return BLOCK_MIGHT_MATCH;
       }
 
+      if (constant == null) {
+        // non-aligned page don't have null value
+        return BLOCK_MIGHT_MATCH;
+      }
+
       return constant.compareTo((T) statistics.getMinValue()) == 0
           && constant.compareTo((T) statistics.getMaxValue()) == 0;
     }
 
     @Override
-    public Filter reverse() {
-      return new ValueNotEq<>(measurement, constant);
+    @SuppressWarnings("unchecked")
+    public boolean allSatisfy(IAlignedMetadataProvider alignedMetadata) {
+      Statistics<? extends Serializable> statistics =
+          alignedMetadata.getMeasurementStatistics(measurementIndex);
+
+      if (statistics == null) {
+        // the measurement isn't in this block so all values are null.
+        if (constant == null) {
+          // null is always equal to null
+          return BLOCK_ALL_MATCH;
+        }
+        return BLOCK_MIGHT_MATCH;
+      }
+
+      if (statisticsNotAvailable(statistics)) {
+        return BLOCK_MIGHT_MATCH;
+      }
+
+      if (constant == null) {
+        if (alignedMetadata.isAllNulls(measurementIndex)) {
+          return BLOCK_ALL_MATCH;
+        }
+        return BLOCK_MIGHT_MATCH;
+      }
+
+      return constant.compareTo((T) statistics.getMinValue()) == 0
+          && constant.compareTo((T) statistics.getMaxValue()) == 0;
     }
 
     @Override
-    public OperatorType getOperatorType() {
-      return OperatorType.VALUE_EQ;
+    public Filter reverse() {
+      return new ValueNotEq<>(measurementIndex, constant);
     }
 
     @Override
-    public String toString() {
-      return measurement + " == " + constant;
+    public OperatorType getOperatorType() {
+      return OperatorType.VALUE_EQ;
     }
   }
 
@@ -189,13 +238,13 @@ public final class ValueFilterOperators {
       extends ValueColumnCompareFilter<T> {
 
     // constant can be null
-    public ValueNotEq(String measurement, T constant) {
-      super(measurement, constant);
+    public ValueNotEq(int measurementIndex, T constant) {
+      super(measurementIndex, constant);
     }
 
     @SuppressWarnings("unchecked")
     public ValueNotEq(ByteBuffer buffer) {
-      this(ReadWriteIOUtils.readString(buffer), (T) 
ReadWriteIOUtils.readObject(buffer));
+      this(ReadWriteIOUtils.readInt(buffer), (T) 
ReadWriteIOUtils.readObject(buffer));
     }
 
     @Override
@@ -210,6 +259,11 @@ public final class ValueFilterOperators {
         return BLOCK_MIGHT_MATCH;
       }
 
+      if (constant == null) {
+        // non-aligned page don't have null value
+        return BLOCK_MIGHT_MATCH;
+      }
+
       // drop if this is a column where min = max = value
       return constant.compareTo((T) statistics.getMinValue()) == 0
           && constant.compareTo((T) statistics.getMaxValue()) == 0;
@@ -217,9 +271,9 @@ public final class ValueFilterOperators {
 
     @Override
     @SuppressWarnings("unchecked")
-    public boolean canSkip(IAlignedMetadata alignedMetadata) {
+    public boolean canSkip(IAlignedMetadataProvider alignedMetadata) {
       Statistics<? extends Serializable> statistics =
-          alignedMetadata.getMeasurementStatistics(measurement);
+          alignedMetadata.getMeasurementStatistics(measurementIndex);
 
       if (statistics == null) {
         if (constant == null) {
@@ -236,7 +290,10 @@ public final class ValueFilterOperators {
       if (constant == null) {
         // we are looking for records where v notEq(null)
         // so, if this is a column of all nulls, we can drop it
-        return alignedMetadata.isAllNulls(measurement);
+        if (alignedMetadata.isAllNulls(measurementIndex)) {
+          return BLOCK_CANNOT_MATCH;
+        }
+        return BLOCK_MIGHT_MATCH;
       }
 
       // drop if this is a column where min = max = value
@@ -251,36 +308,66 @@ public final class ValueFilterOperators {
         return BLOCK_MIGHT_MATCH;
       }
 
+      if (constant == null) {
+        // non-aligned page don't have null value
+        return BLOCK_ALL_MATCH;
+      }
+
       return constant.compareTo((T) statistics.getMinValue()) < 0
           || constant.compareTo((T) statistics.getMaxValue()) > 0;
     }
 
     @Override
-    public Filter reverse() {
-      return new ValueEq<>(measurement, constant);
+    @SuppressWarnings("unchecked")
+    public boolean allSatisfy(IAlignedMetadataProvider alignedMetadata) {
+      Statistics<? extends Serializable> statistics =
+          alignedMetadata.getMeasurementStatistics(measurementIndex);
+
+      if (statistics == null) {
+        if (constant != null) {
+          return BLOCK_ALL_MATCH;
+        }
+        return BLOCK_MIGHT_MATCH;
+      }
+
+      if (statisticsNotAvailable(statistics)) {
+        return BLOCK_MIGHT_MATCH;
+      }
+
+      if (constant == null) {
+        // we are looking for records where v notEq(null)
+        // so, if this is a column of all nulls, we can drop it
+        if (!alignedMetadata.hasNullValue(measurementIndex)) {
+          return BLOCK_ALL_MATCH;
+        }
+        return BLOCK_MIGHT_MATCH;
+      }
+
+      return constant.compareTo((T) statistics.getMinValue()) < 0
+          || constant.compareTo((T) statistics.getMaxValue()) > 0;
     }
 
     @Override
-    public OperatorType getOperatorType() {
-      return OperatorType.VALUE_NEQ;
+    public Filter reverse() {
+      return new ValueEq<>(measurementIndex, constant);
     }
 
     @Override
-    public String toString() {
-      return measurement + " != " + constant;
+    public OperatorType getOperatorType() {
+      return OperatorType.VALUE_NEQ;
     }
   }
 
   public static final class ValueLt<T extends Comparable<T>> extends 
ValueColumnCompareFilter<T> {
 
     // constant cannot be null
-    public ValueLt(String measurement, T constant) {
-      super(measurement, Objects.requireNonNull(constant, 
CONSTANT_CANNOT_BE_NULL_MSG));
+    public ValueLt(int measurementIndex, T constant) {
+      super(measurementIndex, Objects.requireNonNull(constant, 
CONSTANT_CANNOT_BE_NULL_MSG));
     }
 
     @SuppressWarnings("unchecked")
     public ValueLt(ByteBuffer buffer) {
-      this(ReadWriteIOUtils.readString(buffer), (T) 
ReadWriteIOUtils.readObject(buffer));
+      this(ReadWriteIOUtils.readInt(buffer), (T) 
ReadWriteIOUtils.readObject(buffer));
     }
 
     @Override
@@ -312,30 +399,25 @@ public final class ValueFilterOperators {
 
     @Override
     public Filter reverse() {
-      return new ValueGtEq<>(measurement, constant);
+      return new ValueGtEq<>(measurementIndex, constant);
     }
 
     @Override
     public OperatorType getOperatorType() {
       return OperatorType.VALUE_LT;
     }
-
-    @Override
-    public String toString() {
-      return measurement + " < " + constant;
-    }
   }
 
   public static final class ValueLtEq<T extends Comparable<T>> extends 
ValueColumnCompareFilter<T> {
 
     // constant cannot be null
-    public ValueLtEq(String measurement, T constant) {
-      super(measurement, Objects.requireNonNull(constant, 
CONSTANT_CANNOT_BE_NULL_MSG));
+    public ValueLtEq(int measurementIndex, T constant) {
+      super(measurementIndex, Objects.requireNonNull(constant, 
CONSTANT_CANNOT_BE_NULL_MSG));
     }
 
     @SuppressWarnings("unchecked")
     public ValueLtEq(ByteBuffer buffer) {
-      this(ReadWriteIOUtils.readString(buffer), (T) 
ReadWriteIOUtils.readObject(buffer));
+      this(ReadWriteIOUtils.readInt(buffer), (T) 
ReadWriteIOUtils.readObject(buffer));
     }
 
     @Override
@@ -367,30 +449,25 @@ public final class ValueFilterOperators {
 
     @Override
     public Filter reverse() {
-      return new ValueGt<>(measurement, constant);
+      return new ValueGt<>(measurementIndex, constant);
     }
 
     @Override
     public OperatorType getOperatorType() {
       return OperatorType.VALUE_LTEQ;
     }
-
-    @Override
-    public String toString() {
-      return measurement + " <= " + constant;
-    }
   }
 
   public static final class ValueGt<T extends Comparable<T>> extends 
ValueColumnCompareFilter<T> {
 
     // constant cannot be null
-    public ValueGt(String measurement, T constant) {
-      super(measurement, Objects.requireNonNull(constant, 
CONSTANT_CANNOT_BE_NULL_MSG));
+    public ValueGt(int measurementIndex, T constant) {
+      super(measurementIndex, Objects.requireNonNull(constant, 
CONSTANT_CANNOT_BE_NULL_MSG));
     }
 
     @SuppressWarnings("unchecked")
     public ValueGt(ByteBuffer buffer) {
-      this(ReadWriteIOUtils.readString(buffer), (T) 
ReadWriteIOUtils.readObject(buffer));
+      this(ReadWriteIOUtils.readInt(buffer), (T) 
ReadWriteIOUtils.readObject(buffer));
     }
 
     @Override
@@ -422,30 +499,25 @@ public final class ValueFilterOperators {
 
     @Override
     public Filter reverse() {
-      return new ValueLtEq<>(measurement, constant);
+      return new ValueLtEq<>(measurementIndex, constant);
     }
 
     @Override
     public OperatorType getOperatorType() {
       return OperatorType.VALUE_GT;
     }
-
-    @Override
-    public String toString() {
-      return measurement + " > " + constant;
-    }
   }
 
   public static final class ValueGtEq<T extends Comparable<T>> extends 
ValueColumnCompareFilter<T> {
 
     // constant cannot be null
-    public ValueGtEq(String measurement, T constant) {
-      super(measurement, Objects.requireNonNull(constant, 
CONSTANT_CANNOT_BE_NULL_MSG));
+    public ValueGtEq(int measurementIndex, T constant) {
+      super(measurementIndex, Objects.requireNonNull(constant, 
CONSTANT_CANNOT_BE_NULL_MSG));
     }
 
     @SuppressWarnings("unchecked")
     public ValueGtEq(ByteBuffer buffer) {
-      this(ReadWriteIOUtils.readString(buffer), (T) 
ReadWriteIOUtils.readObject(buffer));
+      this(ReadWriteIOUtils.readInt(buffer), (T) 
ReadWriteIOUtils.readObject(buffer));
     }
 
     @Override
@@ -477,40 +549,35 @@ public final class ValueFilterOperators {
 
     @Override
     public Filter reverse() {
-      return new ValueLt<>(measurement, constant);
+      return new ValueLt<>(measurementIndex, constant);
     }
 
     @Override
     public OperatorType getOperatorType() {
       return OperatorType.VALUE_GTEQ;
     }
-
-    @Override
-    public String toString() {
-      return measurement + " >= " + constant;
-    }
   }
 
   // base class for ValueBetweenAnd, ValueNotBetweenAnd
   abstract static class ValueColumnRangeFilter<T extends Comparable<T>> 
extends ColumnRangeFilter<T>
       implements IValueFilter {
 
-    protected final String measurement;
+    protected final int measurementIndex;
 
-    protected ValueColumnRangeFilter(String measurement, T min, T max) {
+    protected ValueColumnRangeFilter(int measurementIndex, T min, T max) {
       super(min, max);
-      this.measurement = Objects.requireNonNull(measurement, 
MEASUREMENT_CANNOT_BE_NULL_MSG);
+      this.measurementIndex = measurementIndex;
     }
 
     @Override
-    public String getMeasurement() {
-      return measurement;
+    public int getMeasurementIndex() {
+      return measurementIndex;
     }
 
     @Override
     public void serialize(DataOutputStream outputStream) throws IOException {
       ReadWriteIOUtils.write(getOperatorType().ordinal(), outputStream);
-      ReadWriteIOUtils.write(measurement, outputStream);
+      ReadWriteIOUtils.write(measurementIndex, outputStream);
       ReadWriteIOUtils.writeObject(min, outputStream);
       ReadWriteIOUtils.writeObject(max, outputStream);
     }
@@ -527,26 +594,33 @@ public final class ValueFilterOperators {
         return false;
       }
       ValueColumnRangeFilter<?> that = (ValueColumnRangeFilter<?>) o;
-      return measurement.equals(that.measurement);
+      return measurementIndex == that.measurementIndex;
     }
 
     @Override
     public int hashCode() {
-      return Objects.hash(super.hashCode(), measurement);
+      return Objects.hash(super.hashCode(), measurementIndex);
+    }
+
+    @Override
+    public String toString() {
+      return String.format(
+          "measurements[%s] %s %s AND %s",
+          measurementIndex, getOperatorType().getSymbol(), min, max);
     }
   }
 
   public static final class ValueBetweenAnd<T extends Comparable<T>>
       extends ValueColumnRangeFilter<T> {
 
-    public ValueBetweenAnd(String measurement, T min, T max) {
-      super(measurement, min, max);
+    public ValueBetweenAnd(int measurementIndex, T min, T max) {
+      super(measurementIndex, min, max);
     }
 
     @SuppressWarnings("unchecked")
     public ValueBetweenAnd(ByteBuffer buffer) {
       this(
-          ReadWriteIOUtils.readString(buffer),
+          ReadWriteIOUtils.readInt(buffer),
           (T) ReadWriteIOUtils.readObject(buffer),
           (T) ReadWriteIOUtils.readObject(buffer));
     }
@@ -581,31 +655,26 @@ public final class ValueFilterOperators {
 
     @Override
     public Filter reverse() {
-      return new ValueNotBetweenAnd<>(measurement, min, max);
+      return new ValueNotBetweenAnd<>(measurementIndex, min, max);
     }
 
     @Override
     public OperatorType getOperatorType() {
       return OperatorType.VALUE_BETWEEN_AND;
     }
-
-    @Override
-    public String toString() {
-      return measurement + " between " + min + " and " + max;
-    }
   }
 
   public static final class ValueNotBetweenAnd<T extends Comparable<T>>
       extends ValueColumnRangeFilter<T> {
 
-    public ValueNotBetweenAnd(String measurement, T min, T max) {
-      super(measurement, min, max);
+    public ValueNotBetweenAnd(int measurementIndex, T min, T max) {
+      super(measurementIndex, min, max);
     }
 
     @SuppressWarnings("unchecked")
     public ValueNotBetweenAnd(ByteBuffer buffer) {
       this(
-          ReadWriteIOUtils.readString(buffer),
+          ReadWriteIOUtils.readInt(buffer),
           (T) ReadWriteIOUtils.readObject(buffer),
           (T) ReadWriteIOUtils.readObject(buffer));
     }
@@ -640,18 +709,13 @@ public final class ValueFilterOperators {
 
     @Override
     public Filter reverse() {
-      return new ValueBetweenAnd<>(measurement, min, max);
+      return new ValueBetweenAnd<>(measurementIndex, min, max);
     }
 
     @Override
     public OperatorType getOperatorType() {
       return OperatorType.VALUE_NOT_BETWEEN_AND;
     }
-
-    @Override
-    public String toString() {
-      return measurement + " not between " + min + " and " + max;
-    }
   }
 
   // we have no statistics available, we cannot drop any blocks
@@ -666,22 +730,22 @@ public final class ValueFilterOperators {
   abstract static class ValueColumnSetFilter<T> extends ColumnSetFilter<T>
       implements IDisableStatisticsValueFilter {
 
-    protected final String measurement;
+    protected final int measurementIndex;
 
-    protected ValueColumnSetFilter(String measurement, Set<T> candidates) {
+    protected ValueColumnSetFilter(int measurementIndex, Set<T> candidates) {
       super(candidates);
-      this.measurement = Objects.requireNonNull(measurement, 
MEASUREMENT_CANNOT_BE_NULL_MSG);
+      this.measurementIndex = measurementIndex;
     }
 
     @Override
-    public String getMeasurement() {
-      return measurement;
+    public int getMeasurementIndex() {
+      return measurementIndex;
     }
 
     @Override
     public void serialize(DataOutputStream outputStream) throws IOException {
       ReadWriteIOUtils.write(getOperatorType().ordinal(), outputStream);
-      ReadWriteIOUtils.write(measurement, outputStream);
+      ReadWriteIOUtils.write(measurementIndex, outputStream);
       ReadWriteIOUtils.writeObjectSet(candidates, outputStream);
     }
 
@@ -697,23 +761,29 @@ public final class ValueFilterOperators {
         return false;
       }
       ValueColumnSetFilter<?> that = (ValueColumnSetFilter<?>) o;
-      return measurement.equals(that.measurement);
+      return measurementIndex == that.measurementIndex;
     }
 
     @Override
     public int hashCode() {
-      return Objects.hash(super.hashCode(), measurement);
+      return Objects.hash(super.hashCode(), measurementIndex);
+    }
+
+    @Override
+    public String toString() {
+      return String.format(
+          OPERATOR_TO_STRING_FORMAT, measurementIndex, 
getOperatorType().getSymbol(), candidates);
     }
   }
 
   public static final class ValueIn<T> extends ValueColumnSetFilter<T> {
 
-    public ValueIn(String measurement, Set<T> candidates) {
-      super(measurement, candidates);
+    public ValueIn(int measurementIndex, Set<T> candidates) {
+      super(measurementIndex, candidates);
     }
 
     public ValueIn(ByteBuffer buffer) {
-      this(ReadWriteIOUtils.readString(buffer), 
ReadWriteIOUtils.readObjectSet(buffer));
+      this(ReadWriteIOUtils.readInt(buffer), 
ReadWriteIOUtils.readObjectSet(buffer));
     }
 
     @Override
@@ -723,28 +793,23 @@ public final class ValueFilterOperators {
 
     @Override
     public Filter reverse() {
-      return new ValueNotIn<>(measurement, candidates);
+      return new ValueNotIn<>(measurementIndex, candidates);
     }
 
     @Override
     public OperatorType getOperatorType() {
       return OperatorType.VALUE_IN;
     }
-
-    @Override
-    public String toString() {
-      return measurement + " in " + candidates;
-    }
   }
 
   public static final class ValueNotIn<T> extends ValueColumnSetFilter<T> {
 
-    public ValueNotIn(String measurement, Set<T> candidates) {
-      super(measurement, candidates);
+    public ValueNotIn(int measurementIndex, Set<T> candidates) {
+      super(measurementIndex, candidates);
     }
 
     public ValueNotIn(ByteBuffer buffer) {
-      this(ReadWriteIOUtils.readString(buffer), 
ReadWriteIOUtils.readObjectSet(buffer));
+      this(ReadWriteIOUtils.readInt(buffer), 
ReadWriteIOUtils.readObjectSet(buffer));
     }
 
     @Override
@@ -754,40 +819,35 @@ public final class ValueFilterOperators {
 
     @Override
     public Filter reverse() {
-      return new ValueIn<>(measurement, candidates);
+      return new ValueIn<>(measurementIndex, candidates);
     }
 
     @Override
     public OperatorType getOperatorType() {
       return OperatorType.VALUE_NOT_IN;
     }
-
-    @Override
-    public String toString() {
-      return measurement + " not in " + candidates;
-    }
   }
 
   // base class for ValueRegex, ValueNotRegex
   abstract static class ValueColumnPatternMatchFilter extends 
ColumnPatternMatchFilter
       implements IDisableStatisticsValueFilter {
 
-    protected final String measurement;
+    protected final int measurementIndex;
 
-    protected ValueColumnPatternMatchFilter(String measurement, Pattern 
pattern) {
+    protected ValueColumnPatternMatchFilter(int measurementIndex, Pattern 
pattern) {
       super(pattern);
-      this.measurement = Objects.requireNonNull(measurement, 
MEASUREMENT_CANNOT_BE_NULL_MSG);
+      this.measurementIndex = measurementIndex;
     }
 
     @Override
-    public String getMeasurement() {
-      return measurement;
+    public int getMeasurementIndex() {
+      return measurementIndex;
     }
 
     @Override
     public void serialize(DataOutputStream outputStream) throws IOException {
       ReadWriteIOUtils.write(getOperatorType().ordinal(), outputStream);
-      ReadWriteIOUtils.write(measurement, outputStream);
+      ReadWriteIOUtils.write(measurementIndex, outputStream);
       ReadWriteIOUtils.write(pattern.pattern(), outputStream);
     }
 
@@ -803,24 +863,30 @@ public final class ValueFilterOperators {
         return false;
       }
       ValueColumnPatternMatchFilter that = (ValueColumnPatternMatchFilter) o;
-      return measurement.equals(that.measurement);
+      return measurementIndex == that.measurementIndex;
     }
 
     @Override
     public int hashCode() {
-      return Objects.hash(super.hashCode(), measurement);
+      return Objects.hash(super.hashCode(), measurementIndex);
+    }
+
+    @Override
+    public String toString() {
+      return String.format(
+          OPERATOR_TO_STRING_FORMAT, measurementIndex, 
getOperatorType().getSymbol(), pattern);
     }
   }
 
   public static final class ValueRegexp extends ValueColumnPatternMatchFilter {
 
-    public ValueRegexp(String measurement, Pattern pattern) {
-      super(measurement, pattern);
+    public ValueRegexp(int measurementIndex, Pattern pattern) {
+      super(measurementIndex, pattern);
     }
 
     public ValueRegexp(ByteBuffer buffer) {
       this(
-          ReadWriteIOUtils.readString(buffer),
+          ReadWriteIOUtils.readInt(buffer),
           RegexUtils.compileRegex(ReadWriteIOUtils.readString(buffer)));
     }
 
@@ -831,29 +897,24 @@ public final class ValueFilterOperators {
 
     @Override
     public Filter reverse() {
-      return new ValueNotRegexp(measurement, pattern);
+      return new ValueNotRegexp(measurementIndex, pattern);
     }
 
     @Override
     public OperatorType getOperatorType() {
       return OperatorType.VALUE_REGEXP;
     }
-
-    @Override
-    public String toString() {
-      return measurement + " match " + pattern;
-    }
   }
 
   public static final class ValueNotRegexp extends 
ValueColumnPatternMatchFilter {
 
-    public ValueNotRegexp(String measurement, Pattern pattern) {
-      super(measurement, pattern);
+    public ValueNotRegexp(int measurementIndex, Pattern pattern) {
+      super(measurementIndex, pattern);
     }
 
     public ValueNotRegexp(ByteBuffer buffer) {
       this(
-          ReadWriteIOUtils.readString(buffer),
+          ReadWriteIOUtils.readInt(buffer),
           RegexUtils.compileRegex(ReadWriteIOUtils.readString(buffer)));
     }
 
@@ -864,18 +925,13 @@ public final class ValueFilterOperators {
 
     @Override
     public Filter reverse() {
-      return new ValueRegexp(measurement, pattern);
+      return new ValueRegexp(measurementIndex, pattern);
     }
 
     @Override
     public OperatorType getOperatorType() {
       return OperatorType.VALUE_NOT_REGEXP;
     }
-
-    @Override
-    public String toString() {
-      return measurement + " not match " + pattern;
-    }
   }
 
   private static class AccessCount {
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 fc39a2cb07f..98f849d570c 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
@@ -21,6 +21,7 @@ package org.apache.iotdb.tsfile.read.reader.page;
 
 import org.apache.iotdb.tsfile.encoding.decoder.Decoder;
 import org.apache.iotdb.tsfile.file.header.PageHeader;
+import org.apache.iotdb.tsfile.file.metadata.IAlignedMetadataProvider;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
 import org.apache.iotdb.tsfile.read.common.BatchData;
@@ -45,7 +46,8 @@ import java.util.List;
 
 import static 
org.apache.iotdb.tsfile.read.reader.series.PaginationController.UNLIMITED_PAGINATION_CONTROLLER;
 
-public class AlignedPageReader implements IPageReader, IAlignedPageReader {
+public class AlignedPageReader
+    implements IPageReader, IAlignedPageReader, IAlignedMetadataProvider {
 
   private final TimePageReader timePageReader;
   private final List<ValuePageReader> valuePageReaderList;
@@ -368,6 +370,28 @@ public class AlignedPageReader implements IPageReader, 
IAlignedPageReader {
         }
       }
     }
+
+    if (filter == null || filter.allSatisfy(getTimeStatistics())) {
+      return builder.build();
+    }
+
+    // filter the block
+    TsBlock unfilteredBlock = builder.build();
+    Object[] values = new Object[valueCount];
+
+    for (int i = 0, size = unfilteredBlock.getPositionCount(); i < size; i++) {
+      long time = unfilteredBlock.getTimeByIndex(i);
+      for (int j = 0; j < valueCount; j++) {
+        values[j] = unfilteredBlock.getValueColumns()[j].getObject(i);
+      }
+
+      if (filter.satisfy(time, values)) {
+        builder.getTimeColumnBuilder().writeLong(time);
+        for (int j = 0; j < valueCount; j++) {
+          builder.getValueColumnBuilders()[j].writeObject(values[j]);
+        }
+      }
+    }
     return builder.build();
   }
 
@@ -397,6 +421,11 @@ public class AlignedPageReader implements IPageReader, 
IAlignedPageReader {
     return timePageReader.getStatistics();
   }
 
+  @Override
+  public Statistics<? extends Serializable> getMeasurementStatistics(int 
measurementIndex) {
+    return getStatistics(measurementIndex);
+  }
+
   private List<Statistics<? extends Serializable>> getValueStatisticsList() {
     List<Statistics<? extends Serializable>> valueStatisticsList = new 
ArrayList<>();
     for (ValuePageReader v : valuePageReaderList) {

Reply via email to