You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ja...@apache.org on 2021/03/12 08:08:37 UTC

[iotdb] 02/07: make the timeseries metadata and chunk metadata to be interface

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

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

commit 0ab98773292febc422213ca28eb647df1bf909d3
Author: JackieTien97 <Ja...@foxmail.com>
AuthorDate: Thu Mar 11 18:06:57 2021 +0800

    make the timeseries metadata and chunk metadata to be interface
---
 .../chunk/metadata/DiskChunkMetadataLoader.java    |  15 ++-
 .../iotdb/db/query/reader/series/SeriesReader.java |  40 ++++----
 .../org/apache/iotdb/db/utils/FileLoaderUtils.java |  41 ++++----
 .../java/org/apache/iotdb/db/utils/QueryUtils.java |  11 +-
 .../iotdb/tsfile/file/metadata/ChunkMetadata.java  |  10 +-
 .../iotdb/tsfile/file/metadata/IChunkMetadata.java |  26 +++++
 .../tsfile/file/metadata/ITimeSeriesMetadata.java  |   2 +
 .../tsfile/file/metadata/TimeseriesMetadata.java   |  16 ++-
 .../tsfile/file/metadata/VectorChunkMetadata.java  | 114 +++++++++++++++++++--
 .../file/metadata/VectorTimeSeriesMetadata.java    |  35 ++++++-
 .../iotdb/tsfile/read/TsFileSequenceReader.java    |  77 +++++++-------
 .../read/controller/IChunkMetadataLoader.java      |   7 +-
 .../tsfile/read/controller/IMetadataQuerier.java   |  13 ++-
 .../read/controller/MetadataQuerierByFileImpl.java |  49 +++++----
 .../tsfile/v2/read/TsFileSequenceReaderForV2.java  |  48 ++++-----
 15 files changed, 336 insertions(+), 168 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/query/reader/chunk/metadata/DiskChunkMetadataLoader.java b/server/src/main/java/org/apache/iotdb/db/query/reader/chunk/metadata/DiskChunkMetadataLoader.java
index ebb9521..e3dc79e 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/reader/chunk/metadata/DiskChunkMetadataLoader.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/reader/chunk/metadata/DiskChunkMetadataLoader.java
@@ -18,19 +18,18 @@
  */
 package org.apache.iotdb.db.query.reader.chunk.metadata;
 
+import java.util.List;
 import org.apache.iotdb.db.engine.modification.Modification;
 import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
 import org.apache.iotdb.db.metadata.PartialPath;
 import org.apache.iotdb.db.query.context.QueryContext;
 import org.apache.iotdb.db.query.reader.chunk.DiskChunkLoader;
 import org.apache.iotdb.db.utils.QueryUtils;
-import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata;
-import org.apache.iotdb.tsfile.file.metadata.TimeseriesMetadata;
+import org.apache.iotdb.tsfile.file.metadata.IChunkMetadata;
+import org.apache.iotdb.tsfile.file.metadata.ITimeSeriesMetadata;
 import org.apache.iotdb.tsfile.read.controller.IChunkMetadataLoader;
 import org.apache.iotdb.tsfile.read.filter.basic.Filter;
 
-import java.util.List;
-
 public class DiskChunkMetadataLoader implements IChunkMetadataLoader {
 
   private final TsFileResource resource;
@@ -48,8 +47,8 @@ public class DiskChunkMetadataLoader implements IChunkMetadataLoader {
   }
 
   @Override
-  public List<ChunkMetadata> loadChunkMetadataList(TimeseriesMetadata timeseriesMetadata) {
-    List<ChunkMetadata> chunkMetadataList = timeseriesMetadata.getChunkMetadataList();
+  public List<IChunkMetadata> loadChunkMetadataList(ITimeSeriesMetadata timeseriesMetadata) {
+    List<IChunkMetadata> chunkMetadataList = timeseriesMetadata.getChunkMetadataList();
 
     setDiskChunkLoader(chunkMetadataList, resource, seriesPath, context);
 
@@ -64,7 +63,7 @@ public class DiskChunkMetadataLoader implements IChunkMetadataLoader {
                 || chunkMetaData.getStartTime() > chunkMetaData.getEndTime());
 
     // For chunkMetadata from old TsFile, do not set version
-    for (ChunkMetadata metadata : chunkMetadataList) {
+    for (IChunkMetadata metadata : chunkMetadataList) {
       if (!metadata.isFromOldTsFile()) {
         metadata.setVersion(resource.getVersion());
       }
@@ -73,7 +72,7 @@ public class DiskChunkMetadataLoader implements IChunkMetadataLoader {
   }
 
   public static void setDiskChunkLoader(
-      List<ChunkMetadata> chunkMetadataList,
+      List<IChunkMetadata> chunkMetadataList,
       TsFileResource resource,
       PartialPath seriesPath,
       QueryContext context) {
diff --git a/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java b/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java
index 01cb4f1..27a3e3f 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java
@@ -18,6 +18,16 @@
  */
 package org.apache.iotdb.db.query.reader.series;
 
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.Comparator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Objects;
+import java.util.PriorityQueue;
+import java.util.Set;
+import java.util.function.ToLongFunction;
+import java.util.stream.Collectors;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.engine.querycontext.QueryDataSource;
 import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
@@ -32,7 +42,8 @@ import org.apache.iotdb.db.query.reader.universal.PriorityMergeReader.MergeReade
 import org.apache.iotdb.db.utils.FileLoaderUtils;
 import org.apache.iotdb.db.utils.QueryUtils;
 import org.apache.iotdb.db.utils.TestOnly;
-import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata;
+import org.apache.iotdb.tsfile.file.metadata.IChunkMetadata;
+import org.apache.iotdb.tsfile.file.metadata.ITimeSeriesMetadata;
 import org.apache.iotdb.tsfile.file.metadata.TimeseriesMetadata;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
@@ -43,17 +54,6 @@ import org.apache.iotdb.tsfile.read.filter.basic.Filter;
 import org.apache.iotdb.tsfile.read.filter.basic.UnaryFilter;
 import org.apache.iotdb.tsfile.read.reader.IPageReader;
 
-import java.io.IOException;
-import java.io.Serializable;
-import java.util.Comparator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Objects;
-import java.util.PriorityQueue;
-import java.util.Set;
-import java.util.function.ToLongFunction;
-import java.util.stream.Collectors;
-
 public class SeriesReader {
 
   // inner class of SeriesReader for order purpose
@@ -84,15 +84,15 @@ public class SeriesReader {
   /*
    * TimeSeriesMetadata cache
    */
-  private TimeseriesMetadata firstTimeSeriesMetadata;
-  private final List<TimeseriesMetadata> seqTimeSeriesMetadata = new LinkedList<>();
-  private final PriorityQueue<TimeseriesMetadata> unSeqTimeSeriesMetadata;
+  private ITimeSeriesMetadata firstTimeSeriesMetadata;
+  private final List<ITimeSeriesMetadata> seqTimeSeriesMetadata = new LinkedList<>();
+  private final PriorityQueue<ITimeSeriesMetadata> unSeqTimeSeriesMetadata;
 
   /*
    * chunk cache
    */
-  private ChunkMetadata firstChunkMetadata;
-  private final PriorityQueue<ChunkMetadata> cachedChunkMetadata;
+  private IChunkMetadata firstChunkMetadata;
+  private final PriorityQueue<IChunkMetadata> cachedChunkMetadata;
 
   /*
    * page cache
@@ -328,9 +328,9 @@ public class SeriesReader {
     }
   }
 
-  private void unpackOneTimeSeriesMetadata(TimeseriesMetadata timeSeriesMetadata)
+  private void unpackOneTimeSeriesMetadata(ITimeSeriesMetadata timeSeriesMetadata)
       throws IOException {
-    List<ChunkMetadata> chunkMetadataList =
+    List<IChunkMetadata> chunkMetadataList =
         FileLoaderUtils.loadChunkMetadataList(timeSeriesMetadata);
     chunkMetadataList.forEach(chunkMetadata -> chunkMetadata.setSeq(timeSeriesMetadata.isSeq()));
 
@@ -508,7 +508,7 @@ public class SeriesReader {
     }
   }
 
-  private void unpackOneChunkMetaData(ChunkMetadata chunkMetaData) throws IOException {
+  private void unpackOneChunkMetaData(IChunkMetadata chunkMetaData) throws IOException {
     FileLoaderUtils.loadPageReaderList(chunkMetaData, timeFilter)
         .forEach(
             pageReader -> {
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/FileLoaderUtils.java b/server/src/main/java/org/apache/iotdb/db/utils/FileLoaderUtils.java
index a829b69..c241d2f 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/FileLoaderUtils.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/FileLoaderUtils.java
@@ -18,6 +18,10 @@
  */
 package org.apache.iotdb.db.utils;
 
+import java.io.IOException;
+import java.util.List;
+import java.util.Map.Entry;
+import java.util.Set;
 import org.apache.iotdb.db.engine.cache.TimeSeriesMetadataCache;
 import org.apache.iotdb.db.engine.modification.Modification;
 import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
@@ -29,8 +33,10 @@ import org.apache.iotdb.db.query.reader.chunk.MemChunkReader;
 import org.apache.iotdb.db.query.reader.chunk.metadata.DiskChunkMetadataLoader;
 import org.apache.iotdb.db.query.reader.chunk.metadata.MemChunkMetadataLoader;
 import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata;
+import org.apache.iotdb.tsfile.file.metadata.IChunkMetadata;
+import org.apache.iotdb.tsfile.file.metadata.ITimeSeriesMetadata;
 import org.apache.iotdb.tsfile.file.metadata.TimeseriesMetadata;
-import org.apache.iotdb.tsfile.file.metadata.TsFileMetadata;
+import org.apache.iotdb.tsfile.file.metadata.VectorChunkMetadata;
 import org.apache.iotdb.tsfile.read.TsFileSequenceReader;
 import org.apache.iotdb.tsfile.read.common.Chunk;
 import org.apache.iotdb.tsfile.read.common.Path;
@@ -39,11 +45,7 @@ import org.apache.iotdb.tsfile.read.filter.basic.Filter;
 import org.apache.iotdb.tsfile.read.reader.IChunkReader;
 import org.apache.iotdb.tsfile.read.reader.IPageReader;
 import org.apache.iotdb.tsfile.read.reader.chunk.ChunkReader;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Map.Entry;
-import java.util.Set;
+import org.apache.iotdb.tsfile.read.reader.chunk.VectorChunkReader;
 
 public class FileLoaderUtils {
 
@@ -140,7 +142,7 @@ public class FileLoaderUtils {
    *
    * @param timeSeriesMetadata the corresponding TimeSeriesMetadata in that file.
    */
-  public static List<ChunkMetadata> loadChunkMetadataList(TimeseriesMetadata timeSeriesMetadata)
+  public static List<IChunkMetadata> loadChunkMetadataList(ITimeSeriesMetadata timeSeriesMetadata)
       throws IOException {
     return timeSeriesMetadata.loadChunkMetadataList();
   }
@@ -151,8 +153,9 @@ public class FileLoaderUtils {
    * @param chunkMetaData the corresponding chunk metadata
    * @param timeFilter it should be a TimeFilter instead of a ValueFilter
    */
-  public static List<IPageReader> loadPageReaderList(ChunkMetadata chunkMetaData, Filter timeFilter)
+  public static List<IPageReader> loadPageReaderList(IChunkMetadata chunkMetaData, Filter timeFilter)
       throws IOException {
+    // TODO memory Vector chunk metadata
     if (chunkMetaData == null) {
       throw new IOException("Can't init null chunkMeta");
     }
@@ -162,22 +165,24 @@ public class FileLoaderUtils {
       MemChunkLoader memChunkLoader = (MemChunkLoader) chunkLoader;
       chunkReader = new MemChunkReader(memChunkLoader.getChunk(), timeFilter);
     } else {
-      Chunk chunk = chunkLoader.loadChunk(chunkMetaData);
-      chunk.setFromOldFile(chunkMetaData.isFromOldTsFile());
-      chunkReader = new ChunkReader(chunk, timeFilter);
-      chunkReader.hasNextSatisfiedPage();
+      if (chunkMetaData instanceof ChunkMetadata) {
+        Chunk chunk = chunkLoader.loadChunk((ChunkMetadata) chunkMetaData);
+        chunk.setFromOldFile(chunkMetaData.isFromOldTsFile());
+        chunkReader = new ChunkReader(chunk, timeFilter);
+        chunkReader.hasNextSatisfiedPage();
+      } else {
+        VectorChunkMetadata vectorChunkMetadata = (VectorChunkMetadata) chunkMetaData;
+        Chunk timeChunk = vectorChunkMetadata.getTimeChunk();
+        List<Chunk> valueChunkList = vectorChunkMetadata.getValueChunkList();
+        chunkReader = new VectorChunkReader(timeChunk, valueChunkList, timeFilter);
+      }
     }
     return chunkReader.loadPageReaderList();
   }
 
-  public static List<ChunkMetadata> getChunkMetadataList(Path path, String filePath)
+  public static List<IChunkMetadata> getChunkMetadataList(Path path, String filePath)
       throws IOException {
     TsFileSequenceReader tsFileReader = FileReaderManager.getInstance().get(filePath, true);
     return tsFileReader.getChunkMetadataList(path);
   }
-
-  public static TsFileMetadata getTsFileMetadata(String filePath) throws IOException {
-    TsFileSequenceReader reader = FileReaderManager.getInstance().get(filePath, true);
-    return reader.readFileMetadata();
-  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/QueryUtils.java b/server/src/main/java/org/apache/iotdb/db/utils/QueryUtils.java
index 5c0409f..194def7 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/QueryUtils.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/QueryUtils.java
@@ -19,16 +19,15 @@
 
 package org.apache.iotdb.db.utils;
 
+import java.util.List;
 import org.apache.iotdb.db.engine.modification.Deletion;
 import org.apache.iotdb.db.engine.modification.Modification;
 import org.apache.iotdb.db.engine.querycontext.QueryDataSource;
 import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
 import org.apache.iotdb.db.query.filter.TsFileFilter;
-import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata;
+import org.apache.iotdb.tsfile.file.metadata.IChunkMetadata;
 import org.apache.iotdb.tsfile.read.common.TimeRange;
 
-import java.util.List;
-
 public class QueryUtils {
 
   private QueryUtils() {
@@ -46,9 +45,9 @@ public class QueryUtils {
    */
   @SuppressWarnings("squid:S3776") // Suppress high Cognitive Complexity warning
   public static void modifyChunkMetaData(
-      List<ChunkMetadata> chunkMetaData, List<Modification> modifications) {
+      List<IChunkMetadata> chunkMetaData, List<Modification> modifications) {
     for (int metaIndex = 0; metaIndex < chunkMetaData.size(); metaIndex++) {
-      ChunkMetadata metaData = chunkMetaData.get(metaIndex);
+      IChunkMetadata metaData = chunkMetaData.get(metaIndex);
       for (Modification modification : modifications) {
         // When the chunkMetadata come from an old TsFile, the method modification.getFileOffset()
         // is gerVersionNum actually. In this case, we compare the versions of modification and
@@ -86,7 +85,7 @@ public class QueryUtils {
         });
   }
 
-  private static void doModifyChunkMetaData(Modification modification, ChunkMetadata metaData) {
+  private static void doModifyChunkMetaData(Modification modification, IChunkMetadata metaData) {
     if (modification instanceof Deletion) {
       Deletion deletion = (Deletion) modification;
       metaData.insertIntoSortedDeletions(deletion.getStartTime(), deletion.getEndTime());
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ChunkMetadata.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ChunkMetadata.java
index de6681d..1a3859c 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ChunkMetadata.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ChunkMetadata.java
@@ -34,7 +34,7 @@ import java.util.List;
 import java.util.Objects;
 
 /** Metadata of one chunk. */
-public class ChunkMetadata implements Accountable {
+public class ChunkMetadata implements Accountable, IChunkMetadata {
 
   private String measurementUid;
 
@@ -106,6 +106,7 @@ public class ChunkMetadata implements Accountable {
    *
    * @return Byte offset of header of this chunk (includes the marker)
    */
+  @Override
   public long getOffsetOfChunkHeader() {
     return offsetOfChunkHeader;
   }
@@ -114,6 +115,7 @@ public class ChunkMetadata implements Accountable {
     return measurementUid;
   }
 
+  @Override
   public Statistics getStatistics() {
     return statistics;
   }
@@ -171,10 +173,12 @@ public class ChunkMetadata implements Accountable {
     return chunkMetaData;
   }
 
+  @Override
   public long getVersion() {
     return version;
   }
 
+  @Override
   public void setVersion(long version) {
     this.version = version;
   }
@@ -239,10 +243,12 @@ public class ChunkMetadata implements Accountable {
         measurementUid, deleteIntervalList, tsDataType, statistics, version, offsetOfChunkHeader);
   }
 
+  @Override
   public boolean isModified() {
     return modified;
   }
 
+  @Override
   public void setModified(boolean modified) {
     this.modified = modified;
   }
@@ -283,10 +289,12 @@ public class ChunkMetadata implements Accountable {
     this.ramSize = calculateRamSize();
   }
 
+  @Override
   public void setSeq(boolean seq) {
     isSeq = seq;
   }
 
+  @Override
   public boolean isSeq() {
     return isSeq;
   }
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IChunkMetadata.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IChunkMetadata.java
index b1259a6..95569db 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IChunkMetadata.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IChunkMetadata.java
@@ -18,7 +18,11 @@
  */
 package org.apache.iotdb.tsfile.file.metadata;
 
+import java.util.List;
+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.TimeRange;
+import org.apache.iotdb.tsfile.read.controller.IChunkLoader;
 
 public interface IChunkMetadata {
 
@@ -37,4 +41,26 @@ public interface IChunkMetadata {
   void setVersion(long version);
 
   long getOffsetOfChunkHeader();
+
+  long getStartTime();
+
+  long getEndTime();
+
+  boolean isFromOldTsFile();
+
+  IChunkLoader getChunkLoader();
+
+  void setChunkLoader(IChunkLoader chunkLoader);
+
+  void setFilePath(String filePath);
+
+  void setClosed(boolean closed);
+
+  TSDataType getDataType();
+
+  String getMeasurementUid();
+
+  void insertIntoSortedDeletions(long startTime, long endTime);
+
+  List<TimeRange> getDeleteIntervalList();
 }
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ITimeSeriesMetadata.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ITimeSeriesMetadata.java
index 4029965..b508f57 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ITimeSeriesMetadata.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ITimeSeriesMetadata.java
@@ -36,4 +36,6 @@ public interface ITimeSeriesMetadata {
   void setSeq(boolean seq);
 
   List<IChunkMetadata> loadChunkMetadataList() throws IOException;
+
+  List<IChunkMetadata> getChunkMetadataList();
 }
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadata.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadata.java
index 20dbf05..79f90fd 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadata.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadata.java
@@ -33,7 +33,7 @@ import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.List;
 
-public class TimeseriesMetadata implements Accountable {
+public class TimeseriesMetadata implements Accountable, ITimeSeriesMetadata {
 
   /** used for old version tsfile */
   private long startOffsetOfChunkMetaDataList;
@@ -64,7 +64,7 @@ public class TimeseriesMetadata implements Accountable {
   // used to save chunk metadata list while serializing
   private PublicBAOS chunkMetadataListBuffer;
 
-  private ArrayList<ChunkMetadata> chunkMetadataList;
+  private ArrayList<IChunkMetadata> chunkMetadataList;
 
   public TimeseriesMetadata() {}
 
@@ -176,6 +176,7 @@ public class TimeseriesMetadata implements Accountable {
     this.dataType = tsDataType;
   }
 
+  @Override
   public Statistics getStatistics() {
     return statistics;
   }
@@ -188,18 +189,21 @@ public class TimeseriesMetadata implements Accountable {
     this.chunkMetadataLoader = chunkMetadataLoader;
   }
 
-  public List<ChunkMetadata> loadChunkMetadataList() throws IOException {
+  @Override
+  public List<IChunkMetadata> loadChunkMetadataList() throws IOException {
     return chunkMetadataLoader.loadChunkMetadataList(this);
   }
 
-  public List<ChunkMetadata> getChunkMetadataList() {
+  public List<IChunkMetadata> getChunkMetadataList() {
     return chunkMetadataList;
   }
 
+  @Override
   public boolean isModified() {
     return modified;
   }
 
+  @Override
   public void setModified(boolean modified) {
     this.modified = modified;
   }
@@ -214,10 +218,12 @@ public class TimeseriesMetadata implements Accountable {
     return ramSize;
   }
 
+  @Override
   public void setSeq(boolean seq) {
     isSeq = seq;
   }
 
+  @Override
   public boolean isSeq() {
     return isSeq;
   }
@@ -228,7 +234,7 @@ public class TimeseriesMetadata implements Accountable {
   }
 
   // For reading version-2 only
-  public void setChunkMetadataList(ArrayList<ChunkMetadata> chunkMetadataList) {
+  public void setChunkMetadataList(ArrayList<IChunkMetadata> chunkMetadataList) {
     this.chunkMetadataList = chunkMetadataList;
   }
 }
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/VectorChunkMetadata.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/VectorChunkMetadata.java
index d512495..321197e 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/VectorChunkMetadata.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/VectorChunkMetadata.java
@@ -18,41 +18,139 @@
  */
 package org.apache.iotdb.tsfile.file.metadata;
 
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+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.Chunk;
+import org.apache.iotdb.tsfile.read.common.TimeRange;
+import org.apache.iotdb.tsfile.read.controller.IChunkLoader;
 
 public class VectorChunkMetadata implements IChunkMetadata {
 
+  private final IChunkMetadata timeChunkMetadata;
+  private final List<IChunkMetadata> valueChunkMetadataList;
+
+  public VectorChunkMetadata(IChunkMetadata timeChunkMetadata,
+      List<IChunkMetadata> valueChunkMetadataList) {
+    this.timeChunkMetadata = timeChunkMetadata;
+    this.valueChunkMetadataList = valueChunkMetadataList;
+  }
+
   @Override
   public Statistics getStatistics() {
-    return null;
+    return timeChunkMetadata.getStatistics();
   }
 
   @Override
   public boolean isModified() {
-    return false;
+    return timeChunkMetadata.isModified();
   }
 
   @Override
-  public void setModified(boolean modified) {}
+  public void setModified(boolean modified) {
+    timeChunkMetadata.setModified(modified);
+  }
 
   @Override
   public boolean isSeq() {
-    return false;
+    return timeChunkMetadata.isSeq();
   }
 
   @Override
-  public void setSeq(boolean seq) {}
+  public void setSeq(boolean seq) {
+    timeChunkMetadata.setSeq(seq);
+  }
 
   @Override
   public long getVersion() {
-    return 0;
+    return timeChunkMetadata.getVersion();
   }
 
   @Override
-  public void setVersion(long version) {}
+  public void setVersion(long version) {
+    timeChunkMetadata.setVersion(version);
+  }
 
   @Override
   public long getOffsetOfChunkHeader() {
-    return 0;
+    return timeChunkMetadata.getOffsetOfChunkHeader();
+  }
+
+  @Override
+  public long getStartTime() {
+    return timeChunkMetadata.getStartTime();
+  }
+
+  @Override
+  public long getEndTime() {
+    return timeChunkMetadata.getEndTime();
+  }
+
+  @Override
+  public boolean isFromOldTsFile() {
+    return false;
+  }
+
+  @Override
+  public IChunkLoader getChunkLoader() {
+    return timeChunkMetadata.getChunkLoader();
+  }
+
+  @Override
+  public void setChunkLoader(IChunkLoader chunkLoader) {
+    timeChunkMetadata.setChunkLoader(chunkLoader);
+    for (IChunkMetadata chunkMetadata : valueChunkMetadataList) {
+      chunkMetadata.setChunkLoader(chunkLoader);
+    }
+  }
+
+  @Override
+  public void setFilePath(String filePath) {
+    timeChunkMetadata.setFilePath(filePath);
+    for (IChunkMetadata chunkMetadata : valueChunkMetadataList) {
+      chunkMetadata.setFilePath(filePath);
+    }
+  }
+
+  @Override
+  public void setClosed(boolean closed) {
+    timeChunkMetadata.setClosed(closed);
+    for (IChunkMetadata chunkMetadata : valueChunkMetadataList) {
+      chunkMetadata.setClosed(closed);
+    }
+  }
+
+  @Override
+  public TSDataType getDataType() {
+    return timeChunkMetadata.getDataType();
+  }
+
+  @Override
+  public String getMeasurementUid() {
+    return timeChunkMetadata.getMeasurementUid();
+  }
+
+  @Override
+  public void insertIntoSortedDeletions(long startTime, long endTime) {
+    timeChunkMetadata.insertIntoSortedDeletions(startTime, endTime);
+  }
+
+  @Override
+  public List<TimeRange> getDeleteIntervalList() {
+    return timeChunkMetadata.getDeleteIntervalList();
+  }
+
+  public Chunk getTimeChunk() throws IOException {
+    return timeChunkMetadata.getChunkLoader().loadChunk((ChunkMetadata) timeChunkMetadata);
+  }
+
+  public List<Chunk> getValueChunkList() throws IOException {
+    List<Chunk> valueChunkList = new ArrayList<>();
+    for (IChunkMetadata chunkMetadata : valueChunkMetadataList) {
+      valueChunkList.add(chunkMetadata.getChunkLoader().loadChunk((ChunkMetadata) chunkMetadata));
+    }
+    return valueChunkList;
   }
 }
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/VectorTimeSeriesMetadata.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/VectorTimeSeriesMetadata.java
index 49a44aa..82aad19 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/VectorTimeSeriesMetadata.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/VectorTimeSeriesMetadata.java
@@ -18,6 +18,7 @@
  */
 package org.apache.iotdb.tsfile.file.metadata;
 
+import java.util.ArrayList;
 import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
 
 import java.io.IOException;
@@ -25,8 +26,16 @@ import java.util.List;
 
 public class VectorTimeSeriesMetadata implements ITimeSeriesMetadata {
 
-  private TimeseriesMetadata timeseriesMetadata;
-  private List<TimeseriesMetadata> valueTimeseriesMetadataList;
+  private final TimeseriesMetadata timeseriesMetadata;
+  private final List<TimeseriesMetadata> valueTimeseriesMetadataList;
+
+
+  public VectorTimeSeriesMetadata(
+      TimeseriesMetadata timeseriesMetadata,
+      List<TimeseriesMetadata> valueTimeseriesMetadataList) {
+    this.timeseriesMetadata = timeseriesMetadata;
+    this.valueTimeseriesMetadataList = valueTimeseriesMetadataList;
+  }
 
   @Override
   public Statistics getStatistics() {
@@ -55,7 +64,27 @@ public class VectorTimeSeriesMetadata implements ITimeSeriesMetadata {
 
   @Override
   public List<IChunkMetadata> loadChunkMetadataList() throws IOException {
-    List<ChunkMetadata> timeChunkMetadata = timeseriesMetadata.loadChunkMetadataList();
+    List<IChunkMetadata> timeChunkMetadata = timeseriesMetadata.loadChunkMetadataList();
+    List<List<IChunkMetadata>> valueChunkMetadataList = new ArrayList<>();
+    for (TimeseriesMetadata metadata : valueTimeseriesMetadataList) {
+      valueChunkMetadataList.add(metadata.loadChunkMetadataList());
+    }
+
+    List<IChunkMetadata> res = new ArrayList<>();
+
+    for (int i = 0; i < timeChunkMetadata.size(); i++) {
+      List<IChunkMetadata> chunkMetadataList = new ArrayList<>();
+      for (List<IChunkMetadata> chunkMetadata : valueChunkMetadataList) {
+        chunkMetadataList.add(chunkMetadata.get(i));
+      }
+      res.add(new VectorChunkMetadata(timeChunkMetadata.get(i), chunkMetadataList));
+    }
+
+    return res;
+  }
+
+  @Override
+  public List<IChunkMetadata> getChunkMetadataList() {
     return null;
   }
 }
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileSequenceReader.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileSequenceReader.java
index 256288f..434d10b 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileSequenceReader.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileSequenceReader.java
@@ -18,6 +18,27 @@
  */
 package org.apache.iotdb.tsfile.read;
 
+import java.io.File;
+import java.io.IOException;
+import java.nio.BufferOverflowException;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Queue;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+import java.util.stream.Collectors;
 import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
 import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
 import org.apache.iotdb.tsfile.compress.IUnCompressor;
@@ -29,6 +50,7 @@ import org.apache.iotdb.tsfile.file.header.ChunkHeader;
 import org.apache.iotdb.tsfile.file.header.PageHeader;
 import org.apache.iotdb.tsfile.file.metadata.ChunkGroupMetadata;
 import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata;
+import org.apache.iotdb.tsfile.file.metadata.IChunkMetadata;
 import org.apache.iotdb.tsfile.file.metadata.MetadataIndexEntry;
 import org.apache.iotdb.tsfile.file.metadata.MetadataIndexNode;
 import org.apache.iotdb.tsfile.file.metadata.TimeseriesMetadata;
@@ -49,32 +71,9 @@ import org.apache.iotdb.tsfile.utils.BloomFilter;
 import org.apache.iotdb.tsfile.utils.Pair;
 import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
 import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.File;
-import java.io.IOException;
-import java.nio.BufferOverflowException;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.Queue;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-import java.util.stream.Collectors;
-
 public class TsFileSequenceReader implements AutoCloseable {
 
   private static final Logger logger = LoggerFactory.getLogger(TsFileSequenceReader.class);
@@ -539,14 +538,14 @@ public class TsFileSequenceReader implements AutoCloseable {
    * @return measurement -> ChunkMetadata list
    * @throws IOException io error
    */
-  public Map<String, List<ChunkMetadata>> readChunkMetadataInDevice(String device)
+  public Map<String, List<IChunkMetadata>> readChunkMetadataInDevice(String device)
       throws IOException {
     readFileMetadata();
     List<TimeseriesMetadata> timeseriesMetadataMap = getDeviceTimeseriesMetadata(device);
     if (timeseriesMetadataMap.isEmpty()) {
       return new HashMap<>();
     }
-    Map<String, List<ChunkMetadata>> seriesMetadata = new HashMap<>();
+    Map<String, List<IChunkMetadata>> seriesMetadata = new HashMap<>();
     for (TimeseriesMetadata timeseriesMetadata : timeseriesMetadataMap) {
       seriesMetadata.put(
           timeseriesMetadata.getMeasurementId(), timeseriesMetadata.getChunkMetadataList());
@@ -1144,13 +1143,13 @@ public class TsFileSequenceReader implements AutoCloseable {
    * @param path timeseries path
    * @return List of ChunkMetaData
    */
-  public List<ChunkMetadata> getChunkMetadataList(Path path) throws IOException {
+  public List<IChunkMetadata> getChunkMetadataList(Path path) throws IOException {
     TimeseriesMetadata timeseriesMetaData = readTimeseriesMetadata(path);
     if (timeseriesMetaData == null) {
       return Collections.emptyList();
     }
-    List<ChunkMetadata> chunkMetadataList = readChunkMetaDataList(timeseriesMetaData);
-    chunkMetadataList.sort(Comparator.comparingLong(ChunkMetadata::getStartTime));
+    List<IChunkMetadata> chunkMetadataList = readChunkMetaDataList(timeseriesMetaData);
+    chunkMetadataList.sort(Comparator.comparingLong(IChunkMetadata::getStartTime));
     return chunkMetadataList;
   }
 
@@ -1159,7 +1158,7 @@ public class TsFileSequenceReader implements AutoCloseable {
    *
    * @return List of ChunkMetaData
    */
-  public List<ChunkMetadata> readChunkMetaDataList(TimeseriesMetadata timeseriesMetaData)
+  public List<IChunkMetadata> readChunkMetaDataList(TimeseriesMetadata timeseriesMetaData)
       throws IOException {
     return timeseriesMetaData.getChunkMetadataList();
   }
@@ -1203,7 +1202,7 @@ public class TsFileSequenceReader implements AutoCloseable {
   public List<String> getDeviceNameInRange(long start, long end) throws IOException {
     List<String> res = new ArrayList<>();
     for (String device : getAllDevices()) {
-      Map<String, List<ChunkMetadata>> seriesMetadataMap = readChunkMetadataInDevice(device);
+      Map<String, List<IChunkMetadata>> seriesMetadataMap = readChunkMetadataInDevice(device);
       if (hasDataInPartition(seriesMetadataMap, start, end)) {
         res.add(device);
       }
@@ -1219,9 +1218,9 @@ public class TsFileSequenceReader implements AutoCloseable {
    * @param end the end position of the space partition
    */
   private boolean hasDataInPartition(
-      Map<String, List<ChunkMetadata>> seriesMetadataMap, long start, long end) {
-    for (List<ChunkMetadata> chunkMetadataList : seriesMetadataMap.values()) {
-      for (ChunkMetadata chunkMetadata : chunkMetadataList) {
+      Map<String, List<IChunkMetadata>> seriesMetadataMap, long start, long end) {
+    for (List<IChunkMetadata> chunkMetadataList : seriesMetadataMap.values()) {
+      for (IChunkMetadata chunkMetadata : chunkMetadataList) {
         LocateStatus location =
             MetadataQuerierByFileImpl.checkLocateStatus(chunkMetadata, start, end);
         if (location == LocateStatus.in) {
@@ -1254,7 +1253,7 @@ public class TsFileSequenceReader implements AutoCloseable {
     return maxPlanIndex;
   }
 
-  public Iterator<Map<String, List<ChunkMetadata>>> getMeasurementChunkMetadataListMapIterator(
+  public Iterator<Map<String, List<IChunkMetadata>>> getMeasurementChunkMetadataListMapIterator(
       String device) throws IOException {
     readFileMetadata();
 
@@ -1263,7 +1262,7 @@ public class TsFileSequenceReader implements AutoCloseable {
         getMetadataAndEndOffset(metadataIndexNode, device, true, true);
 
     if (metadataIndexPair == null) {
-      return new Iterator<Map<String, List<ChunkMetadata>>>() {
+      return new Iterator<Map<String, List<IChunkMetadata>>>() {
 
         @Override
         public boolean hasNext() {
@@ -1271,7 +1270,7 @@ public class TsFileSequenceReader implements AutoCloseable {
         }
 
         @Override
-        public Map<String, List<ChunkMetadata>> next() {
+        public Map<String, List<IChunkMetadata>> next() {
           throw new NoSuchElementException();
         }
       };
@@ -1281,7 +1280,7 @@ public class TsFileSequenceReader implements AutoCloseable {
     ByteBuffer buffer = readData(metadataIndexPair.left.getOffset(), metadataIndexPair.right);
     collectEachLeafMeasurementNodeOffsetRange(buffer, queue);
 
-    return new Iterator<Map<String, List<ChunkMetadata>>>() {
+    return new Iterator<Map<String, List<IChunkMetadata>>>() {
 
       @Override
       public boolean hasNext() {
@@ -1289,12 +1288,12 @@ public class TsFileSequenceReader implements AutoCloseable {
       }
 
       @Override
-      public Map<String, List<ChunkMetadata>> next() {
+      public Map<String, List<IChunkMetadata>> next() {
         if (!hasNext()) {
           throw new NoSuchElementException();
         }
         Pair<Long, Long> startEndPair = queue.remove();
-        Map<String, List<ChunkMetadata>> measurementChunkMetadataList = new HashMap<>();
+        Map<String, List<IChunkMetadata>> measurementChunkMetadataList = new HashMap<>();
         try {
           List<TimeseriesMetadata> timeseriesMetadataList = new ArrayList<>();
           ByteBuffer nextBuffer = readData(startEndPair.left, startEndPair.right);
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/controller/IChunkMetadataLoader.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/controller/IChunkMetadataLoader.java
index f02f9e3..7268b12 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/controller/IChunkMetadataLoader.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/controller/IChunkMetadataLoader.java
@@ -18,15 +18,14 @@
  */
 package org.apache.iotdb.tsfile.read.controller;
 
-import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata;
-import org.apache.iotdb.tsfile.file.metadata.TimeseriesMetadata;
-
 import java.io.IOException;
 import java.util.List;
+import org.apache.iotdb.tsfile.file.metadata.IChunkMetadata;
+import org.apache.iotdb.tsfile.file.metadata.ITimeSeriesMetadata;
 
 public interface IChunkMetadataLoader {
 
   /** read all chunk metadata of one time series in one file. */
-  List<ChunkMetadata> loadChunkMetadataList(TimeseriesMetadata timeseriesMetadata)
+  List<IChunkMetadata> loadChunkMetadataList(ITimeSeriesMetadata timeseriesMetadata)
       throws IOException;
 }
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/controller/IMetadataQuerier.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/controller/IMetadataQuerier.java
index 704aa11..5ce61bb 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/controller/IMetadataQuerier.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/controller/IMetadataQuerier.java
@@ -18,22 +18,21 @@
  */
 package org.apache.iotdb.tsfile.read.controller;
 
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
 import org.apache.iotdb.tsfile.exception.write.NoMeasurementException;
-import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata;
+import org.apache.iotdb.tsfile.file.metadata.IChunkMetadata;
 import org.apache.iotdb.tsfile.file.metadata.TsFileMetadata;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.Path;
 import org.apache.iotdb.tsfile.read.common.TimeRange;
 
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-
 public interface IMetadataQuerier {
 
-  List<ChunkMetadata> getChunkMetaDataList(Path path) throws IOException;
+  List<IChunkMetadata> getChunkMetaDataList(Path path) throws IOException;
 
-  Map<Path, List<ChunkMetadata>> getChunkMetaDataMap(List<Path> paths) throws IOException;
+  Map<Path, List<IChunkMetadata>> getChunkMetaDataMap(List<Path> paths) throws IOException;
 
   TsFileMetadata getWholeFileMetadata();
 
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/controller/MetadataQuerierByFileImpl.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/controller/MetadataQuerierByFileImpl.java
index dbe7f7b..3204c2f 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/controller/MetadataQuerierByFileImpl.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/controller/MetadataQuerierByFileImpl.java
@@ -18,16 +18,6 @@
  */
 package org.apache.iotdb.tsfile.read.controller;
 
-import org.apache.iotdb.tsfile.common.cache.LRUCache;
-import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata;
-import org.apache.iotdb.tsfile.file.metadata.TimeseriesMetadata;
-import org.apache.iotdb.tsfile.file.metadata.TsFileMetadata;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
-import org.apache.iotdb.tsfile.read.TsFileSequenceReader;
-import org.apache.iotdb.tsfile.read.TsFileSequenceReader.LocateStatus;
-import org.apache.iotdb.tsfile.read.common.Path;
-import org.apache.iotdb.tsfile.read.common.TimeRange;
-
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -39,6 +29,15 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 import java.util.TreeMap;
+import org.apache.iotdb.tsfile.common.cache.LRUCache;
+import org.apache.iotdb.tsfile.file.metadata.IChunkMetadata;
+import org.apache.iotdb.tsfile.file.metadata.TimeseriesMetadata;
+import org.apache.iotdb.tsfile.file.metadata.TsFileMetadata;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.tsfile.read.TsFileSequenceReader;
+import org.apache.iotdb.tsfile.read.TsFileSequenceReader.LocateStatus;
+import org.apache.iotdb.tsfile.read.common.Path;
+import org.apache.iotdb.tsfile.read.common.TimeRange;
 
 public class MetadataQuerierByFileImpl implements IMetadataQuerier {
 
@@ -47,7 +46,7 @@ public class MetadataQuerierByFileImpl implements IMetadataQuerier {
 
   private TsFileMetadata fileMetaData;
 
-  private LRUCache<Path, List<ChunkMetadata>> chunkMetaDataCache;
+  private LRUCache<Path, List<IChunkMetadata>> chunkMetaDataCache;
 
   private TsFileSequenceReader tsFileReader;
 
@@ -56,22 +55,22 @@ public class MetadataQuerierByFileImpl implements IMetadataQuerier {
     this.tsFileReader = tsFileReader;
     this.fileMetaData = tsFileReader.readFileMetadata();
     chunkMetaDataCache =
-        new LRUCache<Path, List<ChunkMetadata>>(CACHED_ENTRY_NUMBER) {
+        new LRUCache<Path, List<IChunkMetadata>>(CACHED_ENTRY_NUMBER) {
           @Override
-          public List<ChunkMetadata> loadObjectByKey(Path key) throws IOException {
+          public List<IChunkMetadata> loadObjectByKey(Path key) throws IOException {
             return loadChunkMetadata(key);
           }
         };
   }
 
   @Override
-  public List<ChunkMetadata> getChunkMetaDataList(Path path) throws IOException {
+  public List<IChunkMetadata> getChunkMetaDataList(Path path) throws IOException {
     return chunkMetaDataCache.get(path);
   }
 
   @Override
-  public Map<Path, List<ChunkMetadata>> getChunkMetaDataMap(List<Path> paths) throws IOException {
-    Map<Path, List<ChunkMetadata>> chunkMetaDatas = new HashMap<>();
+  public Map<Path, List<IChunkMetadata>> getChunkMetaDataMap(List<Path> paths) throws IOException {
+    Map<Path, List<IChunkMetadata>> chunkMetaDatas = new HashMap<>();
     for (Path path : paths) {
       if (!chunkMetaDatas.containsKey(path)) {
         chunkMetaDatas.put(path, new ArrayList<>());
@@ -98,7 +97,7 @@ public class MetadataQuerierByFileImpl implements IMetadataQuerier {
       deviceMeasurementsMap.get(path.getDevice()).add(path.getMeasurement());
     }
 
-    Map<Path, List<ChunkMetadata>> tempChunkMetaDatas = new HashMap<>();
+    Map<Path, List<IChunkMetadata>> tempChunkMetaDatas = new HashMap<>();
 
     int count = 0;
     boolean enough = false;
@@ -118,12 +117,12 @@ public class MetadataQuerierByFileImpl implements IMetadataQuerier {
 
       List<TimeseriesMetadata> timeseriesMetaDataList =
           tsFileReader.readTimeseriesMetadata(selectedDevice, selectedMeasurements);
-      List<ChunkMetadata> chunkMetadataList = new ArrayList<>();
+      List<IChunkMetadata> chunkMetadataList = new ArrayList<>();
       for (TimeseriesMetadata timeseriesMetadata : timeseriesMetaDataList) {
         chunkMetadataList.addAll(tsFileReader.readChunkMetaDataList(timeseriesMetadata));
       }
       // d1
-      for (ChunkMetadata chunkMetaData : chunkMetadataList) {
+      for (IChunkMetadata chunkMetaData : chunkMetadataList) {
         String currentMeasurement = chunkMetaData.getMeasurementUid();
 
         // s1
@@ -148,7 +147,7 @@ public class MetadataQuerierByFileImpl implements IMetadataQuerier {
       }
     }
 
-    for (Map.Entry<Path, List<ChunkMetadata>> entry : tempChunkMetaDatas.entrySet()) {
+    for (Map.Entry<Path, List<IChunkMetadata>> entry : tempChunkMetaDatas.entrySet()) {
       chunkMetaDataCache.put(entry.getKey(), entry.getValue());
     }
   }
@@ -162,7 +161,7 @@ public class MetadataQuerierByFileImpl implements IMetadataQuerier {
     return tsFileReader.getChunkMetadataList(path).get(0).getDataType();
   }
 
-  private List<ChunkMetadata> loadChunkMetadata(Path path) throws IOException {
+  private List<IChunkMetadata> loadChunkMetadata(Path path) throws IOException {
     return tsFileReader.getChunkMetadataList(path);
   }
 
@@ -193,16 +192,16 @@ public class MetadataQuerierByFileImpl implements IMetadataQuerier {
       Set<String> selectedMeasurements = deviceMeasurements.getValue();
 
       // measurement -> ChunkMetadata list
-      Map<String, List<ChunkMetadata>> seriesMetadatas =
+      Map<String, List<IChunkMetadata>> seriesMetadatas =
           tsFileReader.readChunkMetadataInDevice(selectedDevice);
 
-      for (Entry<String, List<ChunkMetadata>> seriesMetadata : seriesMetadatas.entrySet()) {
+      for (Entry<String, List<IChunkMetadata>> seriesMetadata : seriesMetadatas.entrySet()) {
 
         if (!selectedMeasurements.contains(seriesMetadata.getKey())) {
           continue;
         }
 
-        for (ChunkMetadata chunkMetadata : seriesMetadata.getValue()) {
+        for (IChunkMetadata chunkMetadata : seriesMetadata.getValue()) {
           LocateStatus location =
               checkLocateStatus(chunkMetadata, spacePartitionStartPos, spacePartitionEndPos);
           if (location == LocateStatus.after) {
@@ -250,7 +249,7 @@ public class MetadataQuerierByFileImpl implements IMetadataQuerier {
    * @return LocateStatus
    */
   public static LocateStatus checkLocateStatus(
-      ChunkMetadata chunkMetaData, long spacePartitionStartPos, long spacePartitionEndPos) {
+      IChunkMetadata chunkMetaData, long spacePartitionStartPos, long spacePartitionEndPos) {
     long startOffsetOfChunk = chunkMetaData.getOffsetOfChunkHeader();
     if (spacePartitionStartPos <= startOffsetOfChunk && startOffsetOfChunk < spacePartitionEndPos) {
       return LocateStatus.in;
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/v2/read/TsFileSequenceReaderForV2.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/v2/read/TsFileSequenceReaderForV2.java
index 9247a72..cf10567 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/v2/read/TsFileSequenceReaderForV2.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/v2/read/TsFileSequenceReaderForV2.java
@@ -18,11 +18,24 @@
  */
 package org.apache.iotdb.tsfile.v2.read;
 
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.stream.Collectors;
 import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
 import org.apache.iotdb.tsfile.file.header.ChunkGroupHeader;
 import org.apache.iotdb.tsfile.file.header.ChunkHeader;
 import org.apache.iotdb.tsfile.file.header.PageHeader;
 import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata;
+import org.apache.iotdb.tsfile.file.metadata.IChunkMetadata;
 import org.apache.iotdb.tsfile.file.metadata.MetadataIndexEntry;
 import org.apache.iotdb.tsfile.file.metadata.MetadataIndexNode;
 import org.apache.iotdb.tsfile.file.metadata.TimeseriesMetadata;
@@ -43,19 +56,6 @@ import org.apache.iotdb.tsfile.v2.file.metadata.MetadataIndexNodeV2;
 import org.apache.iotdb.tsfile.v2.file.metadata.TimeseriesMetadataV2;
 import org.apache.iotdb.tsfile.v2.file.metadata.TsFileMetadataV2;
 
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.stream.Collectors;
-
 public class TsFileSequenceReaderForV2 extends TsFileSequenceReader implements AutoCloseable {
 
   private List<Pair<Long, Long>> versionInfo;
@@ -182,7 +182,7 @@ public class TsFileSequenceReaderForV2 extends TsFileSequenceReader implements A
     buffer = readData(metadataIndexPair.left.getOffset(), metadataIndexPair.right);
     while (buffer.hasRemaining()) {
       TimeseriesMetadata timeseriesMetadata = TimeseriesMetadataV2.deserializeFrom(buffer);
-      ArrayList<ChunkMetadata> chunkMetadataList = readChunkMetaDataList(timeseriesMetadata);
+      ArrayList<IChunkMetadata> chunkMetadataList = readChunkMetaDataList(timeseriesMetadata);
       timeseriesMetadata.setChunkMetadataList(chunkMetadataList);
       timeseriesMetadataList.add(timeseriesMetadata);
     }
@@ -222,7 +222,7 @@ public class TsFileSequenceReaderForV2 extends TsFileSequenceReader implements A
     while (buffer.hasRemaining()) {
       TimeseriesMetadata timeseriesMetadata;
       timeseriesMetadata = TimeseriesMetadataV2.deserializeFrom(buffer);
-      ArrayList<ChunkMetadata> chunkMetadataList = readChunkMetaDataList(timeseriesMetadata);
+      ArrayList<IChunkMetadata> chunkMetadataList = readChunkMetaDataList(timeseriesMetadata);
       timeseriesMetadata.setChunkMetadataList(chunkMetadataList);
       if (allSensors.contains(timeseriesMetadata.getMeasurementId())) {
         timeseriesMetadataList.add(timeseriesMetadata);
@@ -271,7 +271,7 @@ public class TsFileSequenceReaderForV2 extends TsFileSequenceReader implements A
               measurementMetadataIndexPair.left.getOffset(), measurementMetadataIndexPair.right);
       while (buffer.hasRemaining()) {
         TimeseriesMetadata timeseriesMetadata = TimeseriesMetadataV2.deserializeFrom(buffer);
-        ArrayList<ChunkMetadata> chunkMetadataList = readChunkMetaDataList(timeseriesMetadata);
+        ArrayList<IChunkMetadata> chunkMetadataList = readChunkMetaDataList(timeseriesMetadata);
         timeseriesMetadata.setChunkMetadataList(chunkMetadataList);
         timeseriesMetadataList.add(timeseriesMetadata);
       }
@@ -338,7 +338,7 @@ public class TsFileSequenceReaderForV2 extends TsFileSequenceReader implements A
    * @throws IOException io error
    */
   @Override
-  public Map<String, List<ChunkMetadata>> readChunkMetadataInDevice(String device)
+  public Map<String, List<IChunkMetadata>> readChunkMetadataInDevice(String device)
       throws IOException {
     if (tsFileMetaData == null) {
       readFileMetadata();
@@ -355,7 +355,7 @@ public class TsFileSequenceReaderForV2 extends TsFileSequenceReader implements A
     }
     // read buffer of all ChunkMetadatas of this device
     ByteBuffer buffer = readData(start, size);
-    Map<String, List<ChunkMetadata>> seriesMetadata = new HashMap<>();
+    Map<String, List<IChunkMetadata>> seriesMetadata = new HashMap<>();
     while (buffer.hasRemaining()) {
       ChunkMetadata chunkMetadata = ChunkMetadataV2.deserializeFrom(buffer);
       seriesMetadata
@@ -363,7 +363,7 @@ public class TsFileSequenceReaderForV2 extends TsFileSequenceReader implements A
           .add(chunkMetadata);
     }
     // set version in ChunkMetadata
-    for (Entry<String, List<ChunkMetadata>> entry : seriesMetadata.entrySet()) {
+    for (Entry<String, List<IChunkMetadata>> entry : seriesMetadata.entrySet()) {
       applyVersion(entry.getValue());
     }
     return seriesMetadata;
@@ -410,7 +410,7 @@ public class TsFileSequenceReaderForV2 extends TsFileSequenceReader implements A
         List<TimeseriesMetadata> timeseriesMetadataList = new ArrayList<>();
         while (buffer.hasRemaining()) {
           TimeseriesMetadata timeseriesMetadata = TimeseriesMetadataV2.deserializeFrom(buffer);
-          ArrayList<ChunkMetadata> chunkMetadataList = readChunkMetaDataList(timeseriesMetadata);
+          ArrayList<IChunkMetadata> chunkMetadataList = readChunkMetaDataList(timeseriesMetadata);
           timeseriesMetadata.setChunkMetadataList(chunkMetadataList);
           timeseriesMetadataList.add(timeseriesMetadata);
         }
@@ -584,10 +584,10 @@ public class TsFileSequenceReaderForV2 extends TsFileSequenceReader implements A
    *
    * @return List of ChunkMetaData
    */
-  public ArrayList<ChunkMetadata> readChunkMetaDataList(TimeseriesMetadata timeseriesMetaData)
+  public ArrayList<IChunkMetadata> readChunkMetaDataList(TimeseriesMetadata timeseriesMetaData)
       throws IOException {
     readFileMetadata();
-    ArrayList<ChunkMetadata> chunkMetadataList = new ArrayList<>();
+    ArrayList<IChunkMetadata> chunkMetadataList = new ArrayList<>();
     long startOffsetOfChunkMetadataList = timeseriesMetaData.getOffsetOfChunkMetaDataList();
     int dataSizeOfChunkMetadataList = timeseriesMetaData.getDataSizeOfChunkMetaDataList();
 
@@ -602,12 +602,12 @@ public class TsFileSequenceReaderForV2 extends TsFileSequenceReader implements A
     return chunkMetadataList;
   }
 
-  private void applyVersion(List<ChunkMetadata> chunkMetadataList) {
+  private void applyVersion(List<IChunkMetadata> chunkMetadataList) {
     if (versionInfo == null || versionInfo.isEmpty()) {
       return;
     }
     int versionIndex = 0;
-    for (ChunkMetadata chunkMetadata : chunkMetadataList) {
+    for (IChunkMetadata chunkMetadata : chunkMetadataList) {
 
       while (chunkMetadata.getOffsetOfChunkHeader() >= versionInfo.get(versionIndex).left) {
         versionIndex++;