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:36 UTC

[iotdb] 01/07: finish reader work(without UT)

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 6389622d3c92eebb0746f4bb802e9bb1d72110cb
Author: JackieTien97 <Ja...@foxmail.com>
AuthorDate: Thu Mar 11 16:50:16 2021 +0800

    finish reader work(without UT)
---
 .../iotdb/tsfile/encoding/decoder/Decoder.java     |   4 +
 .../iotdb/tsfile/file/metadata/IChunkMetadata.java |  40 ++++
 .../tsfile/file/metadata/ITimeSeriesMetadata.java  |  39 +++
 .../tsfile/file/metadata/VectorChunkMetadata.java  |  58 +++++
 .../file/metadata/VectorTimeSeriesMetadata.java    |  61 +++++
 .../tsfile/file/metadata/enums/TSDataType.java     |   2 +-
 .../file/metadata/statistics/Statistics.java       |   2 +-
 .../file/metadata/statistics/TimeStatistics.java   |   2 +-
 .../apache/iotdb/tsfile/read/common/BatchData.java |  59 +++++
 .../tsfile/read/reader/chunk/ChunkReader.java      |   6 +-
 .../read/reader/chunk/VectorChunkReader.java       | 262 +++++++++++++++++++++
 .../tsfile/read/reader/page/TimePageReader.java    |  93 ++++++++
 .../tsfile/read/reader/page/ValuePageReader.java   | 160 +++++++++++++
 .../tsfile/read/reader/page/VectorChunkReader.java |  21 ++
 .../tsfile/read/reader/page/VectorPageReader.java  | 116 +++++++++
 .../apache/iotdb/tsfile/utils/TsPrimitiveType.java |   4 +-
 .../iotdb/tsfile/write/chunk/TimeChunkWriter.java  |   4 +-
 .../tsfile/write/chunk/VectorChunkWriterImpl.java  |   2 +-
 .../tsfile/write/writer/TimeChunkWriterTest.java   |   4 +-
 .../tsfile/write/writer/TimePageWriterTest.java    |   2 +-
 .../write/writer/VectorChunkWriterImplTest.java    |   4 +-
 .../write/writer/VectorMeasurementSchemaStub.java  |   2 +-
 22 files changed, 930 insertions(+), 17 deletions(-)

diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/encoding/decoder/Decoder.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/encoding/decoder/Decoder.java
index fc70f03..d5ac0cb 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/encoding/decoder/Decoder.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/encoding/decoder/Decoder.java
@@ -56,6 +56,7 @@ public abstract class Decoder {
           case INT32:
             return new IntRleDecoder();
           case INT64:
+          case VECTOR:
             return new LongRleDecoder();
           case FLOAT:
           case DOUBLE:
@@ -68,6 +69,7 @@ public abstract class Decoder {
           case INT32:
             return new DeltaBinaryDecoder.IntDeltaDecoder();
           case INT64:
+          case VECTOR:
             return new DeltaBinaryDecoder.LongDeltaDecoder();
           case FLOAT:
           case DOUBLE:
@@ -89,6 +91,7 @@ public abstract class Decoder {
           case INT32:
             return new RegularDataDecoder.IntRegularDecoder();
           case INT64:
+          case VECTOR:
             return new RegularDataDecoder.LongRegularDecoder();
           default:
             throw new TsFileDecodingException(String.format(ERROR_MSG, encoding, dataType));
@@ -102,6 +105,7 @@ public abstract class Decoder {
           case INT32:
             return new IntGorillaDecoder();
           case INT64:
+          case VECTOR:
             return new LongGorillaDecoder();
           default:
             throw new TsFileDecodingException(String.format(ERROR_MSG, encoding, dataType));
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
new file mode 100644
index 0000000..b1259a6
--- /dev/null
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IChunkMetadata.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.tsfile.file.metadata;
+
+import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
+
+public interface IChunkMetadata {
+
+  Statistics getStatistics();
+
+  boolean isModified();
+
+  void setModified(boolean modified);
+
+  boolean isSeq();
+
+  void setSeq(boolean seq);
+
+  long getVersion();
+
+  void setVersion(long version);
+
+  long getOffsetOfChunkHeader();
+}
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
new file mode 100644
index 0000000..4029965
--- /dev/null
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ITimeSeriesMetadata.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.tsfile.file.metadata;
+
+import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
+
+import java.io.IOException;
+import java.util.List;
+
+public interface ITimeSeriesMetadata {
+
+  Statistics getStatistics();
+
+  boolean isModified();
+
+  void setModified(boolean modified);
+
+  boolean isSeq();
+
+  void setSeq(boolean seq);
+
+  List<IChunkMetadata> loadChunkMetadataList() throws IOException;
+}
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
new file mode 100644
index 0000000..d512495
--- /dev/null
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/VectorChunkMetadata.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.tsfile.file.metadata;
+
+import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
+
+public class VectorChunkMetadata implements IChunkMetadata {
+
+  @Override
+  public Statistics getStatistics() {
+    return null;
+  }
+
+  @Override
+  public boolean isModified() {
+    return false;
+  }
+
+  @Override
+  public void setModified(boolean modified) {}
+
+  @Override
+  public boolean isSeq() {
+    return false;
+  }
+
+  @Override
+  public void setSeq(boolean seq) {}
+
+  @Override
+  public long getVersion() {
+    return 0;
+  }
+
+  @Override
+  public void setVersion(long version) {}
+
+  @Override
+  public long getOffsetOfChunkHeader() {
+    return 0;
+  }
+}
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
new file mode 100644
index 0000000..49a44aa
--- /dev/null
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/VectorTimeSeriesMetadata.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.tsfile.file.metadata;
+
+import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
+
+import java.io.IOException;
+import java.util.List;
+
+public class VectorTimeSeriesMetadata implements ITimeSeriesMetadata {
+
+  private TimeseriesMetadata timeseriesMetadata;
+  private List<TimeseriesMetadata> valueTimeseriesMetadataList;
+
+  @Override
+  public Statistics getStatistics() {
+    return timeseriesMetadata.getStatistics();
+  }
+
+  @Override
+  public boolean isModified() {
+    return timeseriesMetadata.isModified();
+  }
+
+  @Override
+  public void setModified(boolean modified) {
+    timeseriesMetadata.setModified(modified);
+  }
+
+  @Override
+  public boolean isSeq() {
+    return timeseriesMetadata.isSeq();
+  }
+
+  @Override
+  public void setSeq(boolean seq) {
+    timeseriesMetadata.setSeq(seq);
+  }
+
+  @Override
+  public List<IChunkMetadata> loadChunkMetadataList() throws IOException {
+    List<ChunkMetadata> timeChunkMetadata = timeseriesMetadata.loadChunkMetadataList();
+    return null;
+  }
+}
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/enums/TSDataType.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/enums/TSDataType.java
index a2b7eef..2612e03 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/enums/TSDataType.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/enums/TSDataType.java
@@ -44,7 +44,7 @@ public enum TSDataType {
   TEXT((byte) 5),
 
   /** Vector */
-  Vector((byte) 6);
+  VECTOR((byte) 6);
 
   private final byte type;
 
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/Statistics.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/Statistics.java
index 1c1ba7f..759a751 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/Statistics.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/Statistics.java
@@ -77,7 +77,7 @@ public abstract class Statistics<T> {
         return new DoubleStatistics();
       case FLOAT:
         return new FloatStatistics();
-      case Vector:
+      case VECTOR:
         return new TimeStatistics();
       default:
         throw new UnknownColumnTypeException(type.toString());
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/TimeStatistics.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/TimeStatistics.java
index 74bd701..e812166 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/TimeStatistics.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/TimeStatistics.java
@@ -32,7 +32,7 @@ public class TimeStatistics extends Statistics {
 
   @Override
   public TSDataType getType() {
-    return TSDataType.Vector;
+    return TSDataType.VECTOR;
   }
 
   @Override
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/BatchData.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/BatchData.java
index c2a7d3b..a2c2ce7 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/BatchData.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/BatchData.java
@@ -31,6 +31,7 @@ import org.apache.iotdb.tsfile.utils.TsPrimitiveType.TsDouble;
 import org.apache.iotdb.tsfile.utils.TsPrimitiveType.TsFloat;
 import org.apache.iotdb.tsfile.utils.TsPrimitiveType.TsInt;
 import org.apache.iotdb.tsfile.utils.TsPrimitiveType.TsLong;
+import org.apache.iotdb.tsfile.utils.TsPrimitiveType.TsVector;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -77,6 +78,7 @@ public class BatchData {
   protected List<float[]> floatRet;
   protected List<double[]> doubleRet;
   protected List<Binary[]> binaryRet;
+  protected List<TsPrimitiveType[][]> vectorRet;
 
   public BatchData() {
     dataType = null;
@@ -134,6 +136,8 @@ public class BatchData {
         return getBoolean();
       case TEXT:
         return getBinary();
+      case VECTOR:
+        return getVector();
       default:
         return null;
     }
@@ -153,6 +157,8 @@ public class BatchData {
         return new TsBoolean(getBoolean());
       case TEXT:
         return new TsBinary(getBinary());
+      case VECTOR:
+        return new TsVector(getVector());
       default:
         return null;
     }
@@ -203,6 +209,9 @@ public class BatchData {
         binaryRet = new ArrayList<>();
         binaryRet.add(new Binary[capacity]);
         break;
+      case VECTOR:
+        vectorRet = new ArrayList<>();
+        vectorRet.add(new TsPrimitiveType[capacity][]);
       default:
         throw new UnSupportedDataTypeException(String.valueOf(dataType));
     }
@@ -417,6 +426,41 @@ public class BatchData {
     count++;
   }
 
+  /**
+   * put vector data.
+   *
+   * @param t timestamp
+   * @param v vector data.
+   */
+  public void putVector(long t, TsPrimitiveType[] v) {
+    if (writeCurArrayIndex == capacity) {
+      if (capacity >= CAPACITY_THRESHOLD) {
+        timeRet.add(new long[capacity]);
+        vectorRet.add(new TsPrimitiveType[capacity][]);
+        writeCurListIndex++;
+        writeCurArrayIndex = 0;
+      } else {
+        int newCapacity = capacity << 1;
+
+        long[] newTimeData = new long[newCapacity];
+        TsPrimitiveType[][] newValueData = new TsPrimitiveType[newCapacity][];
+
+        System.arraycopy(timeRet.get(0), 0, newTimeData, 0, capacity);
+        System.arraycopy(vectorRet.get(0), 0, newValueData, 0, capacity);
+
+        timeRet.set(0, newTimeData);
+        vectorRet.set(0, newValueData);
+
+        capacity = newCapacity;
+      }
+    }
+    timeRet.get(writeCurListIndex)[writeCurArrayIndex] = t;
+    vectorRet.get(writeCurListIndex)[writeCurArrayIndex] = v;
+
+    writeCurArrayIndex++;
+    count++;
+  }
+
   public boolean getBoolean() {
     return this.booleanRet.get(readCurListIndex)[readCurArrayIndex];
   }
@@ -465,6 +509,14 @@ public class BatchData {
     this.binaryRet.get(readCurListIndex)[readCurArrayIndex] = v;
   }
 
+  public TsPrimitiveType[] getVector() {
+    return this.vectorRet.get(readCurListIndex)[readCurArrayIndex];
+  }
+
+  public void setVector(TsPrimitiveType[] v) {
+    this.vectorRet.get(readCurListIndex)[readCurArrayIndex] = v;
+  }
+
   public void setTime(long v) {
     this.timeRet.get(readCurListIndex)[readCurArrayIndex] = v;
   }
@@ -495,6 +547,9 @@ public class BatchData {
       case TEXT:
         putBinary(t, (Binary) v);
         break;
+      case VECTOR:
+        putVector(t, (TsPrimitiveType[]) v);
+        break;
       default:
         throw new UnSupportedDataTypeException(String.valueOf(dataType));
     }
@@ -532,6 +587,10 @@ public class BatchData {
     return booleanRet.get(idx / capacity)[idx % capacity];
   }
 
+  public TsPrimitiveType[] getVectorByIndex(int idx) {
+    return vectorRet.get(idx / capacity)[idx % capacity];
+  }
+
   public TimeValuePair getLastPairBeforeOrEqualTimestamp(long queryTime) {
     TimeValuePair resultPair = new TimeValuePair(Long.MIN_VALUE, null);
     resetBatchData();
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/chunk/ChunkReader.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/chunk/ChunkReader.java
index 2a4e1f7..8b67dd4 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/chunk/ChunkReader.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/chunk/ChunkReader.java
@@ -118,11 +118,11 @@ public class ChunkReader implements IChunkReader {
     return pageReaderList.remove(0).getAllSatisfiedPageData();
   }
 
-  private void skipBytesInStreamByLength(long length) {
-    chunkDataBuffer.position(chunkDataBuffer.position() + (int) length);
+  private void skipBytesInStreamByLength(int length) {
+    chunkDataBuffer.position(chunkDataBuffer.position() + length);
   }
 
-  public boolean pageSatisfied(PageHeader pageHeader) {
+  protected boolean pageSatisfied(PageHeader pageHeader) {
     if (deleteIntervalList != null) {
       for (TimeRange range : deleteIntervalList) {
         if (range.contains(pageHeader.getStartTime(), pageHeader.getEndTime())) {
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/chunk/VectorChunkReader.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/chunk/VectorChunkReader.java
new file mode 100644
index 0000000..33b256a
--- /dev/null
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/chunk/VectorChunkReader.java
@@ -0,0 +1,262 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.tsfile.read.reader.chunk;
+
+import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
+import org.apache.iotdb.tsfile.compress.IUnCompressor;
+import org.apache.iotdb.tsfile.encoding.decoder.Decoder;
+import org.apache.iotdb.tsfile.file.MetaMarker;
+import org.apache.iotdb.tsfile.file.header.ChunkHeader;
+import org.apache.iotdb.tsfile.file.header.PageHeader;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
+import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
+import org.apache.iotdb.tsfile.read.common.BatchData;
+import org.apache.iotdb.tsfile.read.common.Chunk;
+import org.apache.iotdb.tsfile.read.common.TimeRange;
+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.page.VectorPageReader;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+public class VectorChunkReader implements IChunkReader {
+
+  private final ChunkHeader timeChunkHeader;
+  private final List<ChunkHeader> valueChunkHeaderList = new ArrayList<>();
+  private final ByteBuffer timeChunkDataBuffer;
+  private final List<ByteBuffer> valueChunkDataBufferList = new ArrayList<>();
+  private final IUnCompressor unCompressor;
+  private final Decoder timeDecoder =
+      Decoder.getDecoderByType(
+          TSEncoding.valueOf(TSFileDescriptor.getInstance().getConfig().getTimeEncoder()),
+          TSDataType.INT64);
+
+  protected Filter filter;
+
+  private final List<IPageReader> pageReaderList = new LinkedList<>();
+
+  /** A list of deleted intervals. */
+  private final List<List<TimeRange>> valueDeleteIntervalList;
+
+  /**
+   * constructor of ChunkReader.
+   *
+   * @param filter filter
+   */
+  public VectorChunkReader(Chunk timeChunk, List<Chunk> valueChunkList, Filter filter)
+      throws IOException {
+    this.filter = filter;
+    this.timeChunkDataBuffer = timeChunk.getData();
+    this.valueDeleteIntervalList = new ArrayList<>();
+    this.timeChunkHeader = timeChunk.getHeader();
+    this.unCompressor = IUnCompressor.getUnCompressor(timeChunkHeader.getCompressionType());
+    List<Statistics> valueChunkStatisticsList = new ArrayList<>();
+    valueChunkList.forEach(
+        chunk -> {
+          this.valueChunkHeaderList.add(chunk.getHeader());
+          this.valueChunkDataBufferList.add(chunk.getData());
+          valueChunkStatisticsList.add(chunk.getChunkStatistic());
+          valueDeleteIntervalList.add(chunk.getDeleteIntervalList());
+        });
+    initAllPageReaders(timeChunk.getChunkStatistic(), valueChunkStatisticsList);
+  }
+
+  private void initAllPageReaders(
+      Statistics timeChunkStatistics, List<Statistics> valueChunkStatisticsList)
+      throws IOException {
+    // construct next satisfied page header
+    while (timeChunkDataBuffer.remaining() > 0) {
+      // deserialize a PageHeader from chunkDataBuffer
+      PageHeader timePageHeader;
+      List<PageHeader> valuePageHeaderList = new ArrayList<>();
+      if (timeChunkHeader.getChunkType() == MetaMarker.ONLY_ONE_PAGE_CHUNK_HEADER) {
+        timePageHeader = PageHeader.deserializeFrom(timeChunkDataBuffer, timeChunkStatistics);
+        for (int i = 0; i < valueChunkDataBufferList.size(); i++) {
+          valuePageHeaderList.add(
+              PageHeader.deserializeFrom(
+                  valueChunkDataBufferList.get(i), valueChunkStatisticsList.get(i)));
+        }
+      } else {
+        timePageHeader =
+            PageHeader.deserializeFrom(timeChunkDataBuffer, timeChunkHeader.getDataType());
+        for (int i = 0; i < valueChunkDataBufferList.size(); i++) {
+          valuePageHeaderList.add(
+              PageHeader.deserializeFrom(
+                  valueChunkDataBufferList.get(i), valueChunkHeaderList.get(i).getDataType()));
+        }
+      }
+      // if the current page satisfies
+      if (pageSatisfied(timePageHeader)) {
+        pageReaderList.add(constructPageReaderForNextPage(timePageHeader, valuePageHeaderList));
+      } else {
+        skipBytesInStreamByLength(timePageHeader, valuePageHeaderList);
+      }
+    }
+  }
+
+  private boolean pageSatisfied(PageHeader pageHeader) {
+    return filter == null || filter.satisfy(pageHeader.getStatistics());
+  }
+
+  /** used for value page filter */
+  private boolean pageSatisfied(PageHeader pageHeader, List<TimeRange> valueDeleteInterval) {
+    if (valueDeleteInterval != null) {
+      for (TimeRange range : valueDeleteInterval) {
+        if (range.contains(pageHeader.getStartTime(), pageHeader.getEndTime())) {
+          return false;
+        }
+        if (range.overlaps(new TimeRange(pageHeader.getStartTime(), pageHeader.getEndTime()))) {
+          pageHeader.setModified(true);
+        }
+      }
+    }
+    return filter == null || filter.satisfy(pageHeader.getStatistics());
+  }
+
+  private VectorPageReader constructPageReaderForNextPage(
+      PageHeader timePageHeader, List<PageHeader> valuePageHeader) throws IOException {
+    PageInfo timePageInfo = new PageInfo();
+    getPageInfo(timePageHeader, timeChunkDataBuffer, timeChunkHeader, timePageInfo);
+    PageInfo valuePageInfo = new PageInfo();
+    List<PageHeader> valuePageHeaderList = new ArrayList<>();
+    List<ByteBuffer> valuePageDataList = new ArrayList<>();
+    List<TSDataType> valueDataTypeList = new ArrayList<>();
+    List<Decoder> valueDecoderList = new ArrayList<>();
+    for (int i = 0; i < valuePageHeader.size(); i++) {
+      if (pageSatisfied(valuePageHeader.get(i), valueDeleteIntervalList.get(i))) {
+        getPageInfo(
+            valuePageHeader.get(i),
+            valueChunkDataBufferList.get(i),
+            valueChunkHeaderList.get(i),
+            valuePageInfo);
+        valuePageHeaderList.add(valuePageInfo.pageHeader);
+        valuePageDataList.add(valuePageInfo.pageData);
+        valueDataTypeList.add(valuePageInfo.dataType);
+        valueDecoderList.add(valuePageInfo.decoder);
+      } else {
+        valueChunkDataBufferList
+            .get(i)
+            .position(
+                valueChunkDataBufferList.get(i).position()
+                    + valuePageHeader.get(i).getCompressedSize());
+        valuePageHeaderList.add(valuePageHeader.get(i));
+        valuePageDataList.add(null);
+        valueDataTypeList.add(null);
+        valueDecoderList.add(null);
+      }
+    }
+    VectorPageReader vectorPageReader =
+        new VectorPageReader(
+            timePageHeader,
+            timePageInfo.pageData,
+            timeDecoder,
+            valuePageHeaderList,
+            valuePageDataList,
+            valueDataTypeList,
+            valueDecoderList,
+            filter);
+    vectorPageReader.setDeleteIntervalList(valueDeleteIntervalList);
+    return vectorPageReader;
+  }
+
+  private void getPageInfo(
+      PageHeader pageHeader, ByteBuffer chunkBuffer, ChunkHeader chunkHeader, PageInfo pageInfo)
+      throws IOException {
+    pageInfo.pageHeader = pageHeader;
+    pageInfo.dataType = chunkHeader.getDataType();
+    int compressedPageBodyLength = pageHeader.getCompressedSize();
+    byte[] compressedPageBody = new byte[compressedPageBodyLength];
+
+    // doesn't has a complete page body
+    if (compressedPageBodyLength > chunkBuffer.remaining()) {
+      throw new IOException(
+          "do not has a complete page body. Expected:"
+              + compressedPageBodyLength
+              + ". Actual:"
+              + chunkBuffer.remaining());
+    }
+
+    chunkBuffer.get(compressedPageBody);
+    pageInfo.decoder =
+        Decoder.getDecoderByType(chunkHeader.getEncodingType(), chunkHeader.getDataType());
+    byte[] uncompressedPageData = new byte[pageHeader.getUncompressedSize()];
+    try {
+      unCompressor.uncompress(
+          compressedPageBody, 0, compressedPageBodyLength, uncompressedPageData, 0);
+    } catch (Exception e) {
+      throw new IOException(
+          "Uncompress error! uncompress size: "
+              + pageHeader.getUncompressedSize()
+              + "compressed size: "
+              + pageHeader.getCompressedSize()
+              + "page header: "
+              + pageHeader
+              + e.getMessage());
+    }
+    pageInfo.pageData = ByteBuffer.wrap(uncompressedPageData);
+  }
+
+  private static class PageInfo {
+
+    PageHeader pageHeader;
+    ByteBuffer pageData;
+    TSDataType dataType;
+    Decoder decoder;
+  }
+
+  private void skipBytesInStreamByLength(
+      PageHeader timePageHeader, List<PageHeader> valuePageHeader) {
+    timeChunkDataBuffer.position(
+        timeChunkDataBuffer.position() + timePageHeader.getCompressedSize());
+    for (int i = 0; i < valuePageHeader.size(); i++) {
+      valueChunkDataBufferList
+          .get(i)
+          .position(
+              valueChunkDataBufferList.get(i).position()
+                  + valuePageHeader.get(i).getCompressedSize());
+    }
+  }
+
+  @Override
+  public boolean hasNextSatisfiedPage() {
+    return !pageReaderList.isEmpty();
+  }
+
+  @Override
+  public BatchData nextPageData() throws IOException {
+    if (pageReaderList.isEmpty()) {
+      throw new IOException("No more page");
+    }
+    return pageReaderList.remove(0).getAllSatisfiedPageData();
+  }
+
+  @Override
+  public void close() throws IOException {}
+
+  @Override
+  public List<IPageReader> loadPageReaderList() {
+    return pageReaderList;
+  }
+}
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/page/TimePageReader.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/page/TimePageReader.java
new file mode 100644
index 0000000..6bb7e74
--- /dev/null
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/page/TimePageReader.java
@@ -0,0 +1,93 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.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.statistics.TimeStatistics;
+import org.apache.iotdb.tsfile.read.common.TimeRange;
+
+import com.sun.tools.javac.util.List;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+public class TimePageReader {
+
+  private final PageHeader pageHeader;
+
+  /** decoder for time column */
+  protected Decoder timeDecoder;
+
+  /** time column in memory */
+  protected ByteBuffer timeBuffer;
+
+  /** A list of deleted intervals. */
+  private List<TimeRange> deleteIntervalList;
+
+  private int deleteCursor = 0;
+
+  public TimePageReader(ByteBuffer pageData, Decoder timeDecoder) {
+    this(null, pageData, timeDecoder);
+  }
+
+  public TimePageReader(PageHeader pageHeader, ByteBuffer pageData, Decoder timeDecoder) {
+    this.timeDecoder = timeDecoder;
+    this.pageHeader = pageHeader;
+    this.timeBuffer = pageData;
+  }
+
+  public long[] nexTimeBatch() throws IOException {
+    long[] timeBatch = new long[(int) pageHeader.getStatistics().getCount()];
+    int index = 0;
+    while (timeDecoder.hasNext(timeBuffer)) {
+      timeBatch[index++] = timeDecoder.readLong(timeBuffer);
+    }
+    return timeBatch;
+  }
+
+  public TimeStatistics getStatistics() {
+    return (TimeStatistics) pageHeader.getStatistics();
+  }
+
+  public void setDeleteIntervalList(List<TimeRange> list) {
+    this.deleteIntervalList = list;
+  }
+
+  public List<TimeRange> getDeleteIntervalList() {
+    return deleteIntervalList;
+  }
+
+  public boolean isModified() {
+    return pageHeader.isModified();
+  }
+
+  protected boolean isDeleted(long timestamp) {
+    while (deleteIntervalList != null && deleteCursor < deleteIntervalList.size()) {
+      if (deleteIntervalList.get(deleteCursor).contains(timestamp)) {
+        return true;
+      } else if (deleteIntervalList.get(deleteCursor).getMax() < timestamp) {
+        deleteCursor++;
+      } else {
+        return false;
+      }
+    }
+    return false;
+  }
+}
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/page/ValuePageReader.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/page/ValuePageReader.java
new file mode 100644
index 0000000..f972159
--- /dev/null
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/page/ValuePageReader.java
@@ -0,0 +1,160 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.tsfile.read.reader.page;
+
+import org.apache.iotdb.tsfile.encoding.decoder.Decoder;
+import org.apache.iotdb.tsfile.exception.write.UnSupportedDataTypeException;
+import org.apache.iotdb.tsfile.file.header.PageHeader;
+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.utils.Binary;
+import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
+import org.apache.iotdb.tsfile.utils.TsPrimitiveType;
+
+import java.nio.ByteBuffer;
+import java.util.List;
+
+public class ValuePageReader {
+
+  private static final int MASK = 0x80;
+
+  private final PageHeader pageHeader;
+
+  private final TSDataType dataType;
+
+  /** decoder for value column */
+  private final Decoder valueDecoder;
+
+  private byte[] bitmap;
+
+  private int size;
+
+  /** value column in memory */
+  protected ByteBuffer valueBuffer;
+
+  /** A list of deleted intervals. */
+  private List<TimeRange> deleteIntervalList;
+
+  private int deleteCursor = 0;
+
+  public ValuePageReader(ByteBuffer pageData, TSDataType dataType, Decoder valueDecoder) {
+    this(null, pageData, dataType, valueDecoder);
+  }
+
+  public ValuePageReader(
+      PageHeader pageHeader, ByteBuffer pageData, TSDataType dataType, Decoder valueDecoder) {
+    this.dataType = dataType;
+    this.valueDecoder = valueDecoder;
+    this.pageHeader = pageHeader;
+    if (pageData != null) {
+      splitDataToBitmapAndValue(pageData);
+    }
+    this.valueBuffer = pageData;
+  }
+
+  private void splitDataToBitmapAndValue(ByteBuffer pageData) {
+    this.size = ReadWriteIOUtils.readInt(pageData);
+    this.bitmap = new byte[(size + 7) / 8];
+    pageData.get(bitmap);
+    this.valueBuffer = pageData.slice();
+  }
+
+  public TsPrimitiveType[] nextValueBatch(long[] timeBatch) {
+    TsPrimitiveType[] valueBatch = new TsPrimitiveType[size];
+    if (valueBuffer == null) {
+      return valueBatch;
+    }
+    for (int i = 0; i < size; i++) {
+      if ((bitmap[i / 8] & (MASK >>> (i % 8))) == 0) {
+        continue;
+      }
+      switch (dataType) {
+        case BOOLEAN:
+          boolean aBoolean = valueDecoder.readBoolean(valueBuffer);
+          if (!isDeleted(timeBatch[i])) {
+            valueBatch[i] = new TsPrimitiveType.TsBoolean(aBoolean);
+          }
+          break;
+        case INT32:
+          int anInt = valueDecoder.readInt(valueBuffer);
+          if (!isDeleted(timeBatch[i])) {
+            valueBatch[i] = new TsPrimitiveType.TsInt(anInt);
+          }
+          break;
+        case INT64:
+          long aLong = valueDecoder.readLong(valueBuffer);
+          if (!isDeleted(timeBatch[i])) {
+            valueBatch[i] = new TsPrimitiveType.TsLong(aLong);
+          }
+          break;
+        case FLOAT:
+          float aFloat = valueDecoder.readFloat(valueBuffer);
+          if (!isDeleted(timeBatch[i])) {
+            valueBatch[i] = new TsPrimitiveType.TsFloat(aFloat);
+          }
+          break;
+        case DOUBLE:
+          double aDouble = valueDecoder.readDouble(valueBuffer);
+          if (!isDeleted(timeBatch[i])) {
+            valueBatch[i] = new TsPrimitiveType.TsDouble(aDouble);
+          }
+          break;
+        case TEXT:
+          Binary aBinary = valueDecoder.readBinary(valueBuffer);
+          if (!isDeleted(timeBatch[i])) {
+            valueBatch[i] = new TsPrimitiveType.TsBinary(aBinary);
+          }
+          break;
+        default:
+          throw new UnSupportedDataTypeException(String.valueOf(dataType));
+      }
+    }
+    return valueBatch;
+  }
+
+  public Statistics getStatistics() {
+    return pageHeader.getStatistics();
+  }
+
+  public void setDeleteIntervalList(List<TimeRange> list) {
+    this.deleteIntervalList = list;
+  }
+
+  public List<TimeRange> getDeleteIntervalList() {
+    return deleteIntervalList;
+  }
+
+  public boolean isModified() {
+    return pageHeader.isModified();
+  }
+
+  protected boolean isDeleted(long timestamp) {
+    while (deleteIntervalList != null && deleteCursor < deleteIntervalList.size()) {
+      if (deleteIntervalList.get(deleteCursor).contains(timestamp)) {
+        return true;
+      } else if (deleteIntervalList.get(deleteCursor).getMax() < timestamp) {
+        deleteCursor++;
+      } else {
+        return false;
+      }
+    }
+    return false;
+  }
+}
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/page/VectorChunkReader.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/page/VectorChunkReader.java
new file mode 100644
index 0000000..b4665fc
--- /dev/null
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/page/VectorChunkReader.java
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.tsfile.read.reader.page;
+
+public class VectorChunkReader {}
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/page/VectorPageReader.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/page/VectorPageReader.java
new file mode 100644
index 0000000..b2059af
--- /dev/null
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/page/VectorPageReader.java
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.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.enums.TSDataType;
+import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
+import org.apache.iotdb.tsfile.read.common.BatchData;
+import org.apache.iotdb.tsfile.read.common.BatchDataFactory;
+import org.apache.iotdb.tsfile.read.common.TimeRange;
+import org.apache.iotdb.tsfile.read.filter.basic.Filter;
+import org.apache.iotdb.tsfile.read.reader.IPageReader;
+import org.apache.iotdb.tsfile.utils.TsPrimitiveType;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+
+public class VectorPageReader implements IPageReader {
+
+  private final TimePageReader timePageReader;
+  private final List<ValuePageReader> valuePageReaderList;
+  private final int valueCount;
+  private Filter filter;
+  private boolean isModified;
+
+  public VectorPageReader(
+      PageHeader timePageHeader,
+      ByteBuffer timePageData,
+      Decoder timeDecoder,
+      List<PageHeader> valuePageHeaderList,
+      List<ByteBuffer> valuePageDataList,
+      List<TSDataType> valueDataTypeList,
+      List<Decoder> valueDecoderList,
+      Filter filter) {
+    timePageReader = new TimePageReader(timePageHeader, timePageData, timeDecoder);
+    isModified = timePageReader.isModified();
+    valuePageReaderList = new ArrayList<>(valuePageHeaderList.size());
+    for (int i = 0; i < valuePageHeaderList.size(); i++) {
+      ValuePageReader valuePageReader =
+          new ValuePageReader(
+              valuePageHeaderList.get(i),
+              valuePageDataList.get(i),
+              valueDataTypeList.get(i),
+              valueDecoderList.get(i));
+      valuePageReaderList.add(valuePageReader);
+      isModified = isModified && valuePageReader.isModified();
+    }
+    this.filter = filter;
+    this.valueCount = valuePageReaderList.size();
+  }
+
+  @Override
+  public BatchData getAllSatisfiedPageData(boolean ascending) throws IOException {
+    long[] timeBatch = timePageReader.nexTimeBatch();
+    List<TsPrimitiveType[]> valueBatchList = new ArrayList<>(valueCount);
+    for (ValuePageReader valuePageReader : valuePageReaderList) {
+      valueBatchList.add(valuePageReader.nextValueBatch(timeBatch));
+    }
+    BatchData pageData = BatchDataFactory.createBatchData(TSDataType.VECTOR, ascending, false);
+    boolean isNull;
+    for (int i = 0; i < timeBatch.length; i++) {
+      isNull = true;
+      TsPrimitiveType[] v = new TsPrimitiveType[valueCount];
+      for (int j = 0; j < v.length; j++) {
+        v[j] = valueBatchList.get(j)[i];
+        if (v[j] != null) {
+          isNull = false;
+        }
+      }
+      if (!isNull && (filter == null || filter.satisfy(timeBatch[i], v))) {
+        pageData.putVector(timeBatch[i], v);
+      }
+    }
+    return pageData;
+  }
+
+  public void setDeleteIntervalList(List<List<TimeRange>> list) {
+    for (int i = 0; i < valueCount; i++) {
+      valuePageReaderList.get(i).setDeleteIntervalList(list.get(i));
+    }
+  }
+
+  @Override
+  public Statistics getStatistics() {
+    return timePageReader.getStatistics();
+  }
+
+  @Override
+  public void setFilter(Filter filter) {
+    this.filter = filter;
+  }
+
+  @Override
+  public boolean isModified() {
+    return isModified;
+  }
+}
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/TsPrimitiveType.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/TsPrimitiveType.java
index 6c00f43..b4efd18 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/TsPrimitiveType.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/TsPrimitiveType.java
@@ -45,7 +45,7 @@ public abstract class TsPrimitiveType implements Serializable {
         return new TsPrimitiveType.TsDouble((double) v);
       case TEXT:
         return new TsPrimitiveType.TsBinary((Binary) v);
-      case Vector:
+      case VECTOR:
         return new TsPrimitiveType.TsVector((TsPrimitiveType[]) v);
       default:
         throw new UnSupportedDataTypeException("Unsupported data type:" + dataType);
@@ -519,7 +519,7 @@ public abstract class TsPrimitiveType implements Serializable {
 
     @Override
     public TSDataType getDataType() {
-      return TSDataType.Vector;
+      return TSDataType.VECTOR;
     }
   }
 }
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/TimeChunkWriter.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/TimeChunkWriter.java
index df9ded9..522eff5 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/TimeChunkWriter.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/TimeChunkWriter.java
@@ -205,7 +205,7 @@ public class TimeChunkWriter {
   }
 
   public TSDataType getDataType() {
-    return TSDataType.Vector;
+    return TSDataType.VECTOR;
   }
 
   /**
@@ -223,7 +223,7 @@ public class TimeChunkWriter {
     writer.startFlushChunk(
         measurementId,
         compressionType,
-        TSDataType.Vector,
+        TSDataType.VECTOR,
         encodingType,
         statistics,
         pageBuffer.size(),
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/VectorChunkWriterImpl.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/VectorChunkWriterImpl.java
index af71ecd..8f1e907 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/VectorChunkWriterImpl.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/VectorChunkWriterImpl.java
@@ -197,6 +197,6 @@ public class VectorChunkWriterImpl implements IChunkWriter {
 
   @Override
   public TSDataType getDataType() {
-    return TSDataType.Vector;
+    return TSDataType.VECTOR;
   }
 }
diff --git a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/TimeChunkWriterTest.java b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/TimeChunkWriterTest.java
index 9968815..bdca8d5 100644
--- a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/TimeChunkWriterTest.java
+++ b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/TimeChunkWriterTest.java
@@ -63,7 +63,7 @@ public class TimeChunkWriterTest {
           (byte) (0x80 | MetaMarker.ONLY_ONE_PAGE_CHUNK_HEADER), ReadWriteIOUtils.readByte(buffer));
       assertEquals("c1", ReadWriteIOUtils.readVarIntString(buffer));
       assertEquals(82, ReadWriteForEncodingUtils.readUnsignedVarInt(buffer));
-      assertEquals(TSDataType.Vector.serialize(), ReadWriteIOUtils.readByte(buffer));
+      assertEquals(TSDataType.VECTOR.serialize(), ReadWriteIOUtils.readByte(buffer));
       assertEquals(CompressionType.UNCOMPRESSED.serialize(), ReadWriteIOUtils.readByte(buffer));
       assertEquals(TSEncoding.PLAIN.serialize(), ReadWriteIOUtils.readByte(buffer));
       assertEquals(82, buffer.remaining());
@@ -99,7 +99,7 @@ public class TimeChunkWriterTest {
       assertEquals((byte) (0x80 | MetaMarker.CHUNK_HEADER), ReadWriteIOUtils.readByte(buffer));
       assertEquals("c1", ReadWriteIOUtils.readVarIntString(buffer));
       assertEquals(198, ReadWriteForEncodingUtils.readUnsignedVarInt(buffer));
-      assertEquals(TSDataType.Vector.serialize(), ReadWriteIOUtils.readByte(buffer));
+      assertEquals(TSDataType.VECTOR.serialize(), ReadWriteIOUtils.readByte(buffer));
       assertEquals(CompressionType.UNCOMPRESSED.serialize(), ReadWriteIOUtils.readByte(buffer));
       assertEquals(TSEncoding.PLAIN.serialize(), ReadWriteIOUtils.readByte(buffer));
       assertEquals(198, buffer.remaining());
diff --git a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/TimePageWriterTest.java b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/TimePageWriterTest.java
index 2ec6294..cab975c 100644
--- a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/TimePageWriterTest.java
+++ b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/TimePageWriterTest.java
@@ -119,7 +119,7 @@ public class TimePageWriterTest {
       // compressedSize
       assertEquals(24, ReadWriteForEncodingUtils.readUnsignedVarInt(buffer));
       TimeStatistics testStatistics =
-          (TimeStatistics) TimeStatistics.deserialize(buffer, TSDataType.Vector);
+          (TimeStatistics) TimeStatistics.deserialize(buffer, TSDataType.VECTOR);
       assertEquals(1L, testStatistics.getStartTime());
       assertEquals(3L, testStatistics.getEndTime());
       assertEquals(3, testStatistics.getCount());
diff --git a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/VectorChunkWriterImplTest.java b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/VectorChunkWriterImplTest.java
index 93e18bb..3ca81b1 100644
--- a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/VectorChunkWriterImplTest.java
+++ b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/VectorChunkWriterImplTest.java
@@ -65,7 +65,7 @@ public class VectorChunkWriterImplTest {
           (byte) (0x80 | MetaMarker.ONLY_ONE_PAGE_CHUNK_HEADER), ReadWriteIOUtils.readByte(buffer));
       assertEquals("s1.time", ReadWriteIOUtils.readVarIntString(buffer));
       assertEquals(164, ReadWriteForEncodingUtils.readUnsignedVarInt(buffer));
-      assertEquals(TSDataType.Vector.serialize(), ReadWriteIOUtils.readByte(buffer));
+      assertEquals(TSDataType.VECTOR.serialize(), ReadWriteIOUtils.readByte(buffer));
       assertEquals(CompressionType.UNCOMPRESSED.serialize(), ReadWriteIOUtils.readByte(buffer));
       assertEquals(TSEncoding.PLAIN.serialize(), ReadWriteIOUtils.readByte(buffer));
       buffer.position(buffer.position() + 164);
@@ -138,7 +138,7 @@ public class VectorChunkWriterImplTest {
       assertEquals((byte) (0x80 | MetaMarker.CHUNK_HEADER), ReadWriteIOUtils.readByte(buffer));
       assertEquals("s1.time", ReadWriteIOUtils.readVarIntString(buffer));
       assertEquals(362, ReadWriteForEncodingUtils.readUnsignedVarInt(buffer));
-      assertEquals(TSDataType.Vector.serialize(), ReadWriteIOUtils.readByte(buffer));
+      assertEquals(TSDataType.VECTOR.serialize(), ReadWriteIOUtils.readByte(buffer));
       assertEquals(CompressionType.UNCOMPRESSED.serialize(), ReadWriteIOUtils.readByte(buffer));
       assertEquals(TSEncoding.PLAIN.serialize(), ReadWriteIOUtils.readByte(buffer));
       buffer.position(buffer.position() + 362);
diff --git a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/VectorMeasurementSchemaStub.java b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/VectorMeasurementSchemaStub.java
index 795a0a6..40335f5 100644
--- a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/VectorMeasurementSchemaStub.java
+++ b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/VectorMeasurementSchemaStub.java
@@ -42,7 +42,7 @@ public class VectorMeasurementSchemaStub implements IMeasurementSchema {
 
   @Override
   public TSDataType getType() {
-    return TSDataType.Vector;
+    return TSDataType.VECTOR;
   }
 
   @Override