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

jiangtian pushed a commit to branch tsFile_v4
in repository https://gitbox.apache.org/repos/asf/tsfile.git


The following commit(s) were added to refs/heads/tsFile_v4 by this push:
     new fec211e9 add stream deserializer
fec211e9 is described below

commit fec211e99fbcb4b8de57ae7b17b80c3088272fc7
Author: jt2594838 <[email protected]>
AuthorDate: Fri Apr 12 18:26:53 2024 +0800

    add stream deserializer
---
 .../{Deserializer.java => BufferDeserializer.java} |   4 +-
 .../tsfile/compatibility/CompatibilityUtils.java   |  15 ++--
 .../tsfile/compatibility/DeserializeConfig.java    |  83 ++++++++++++++++++++
 .../tsfile/compatibility/DeserializeContext.java   |  41 ----------
 .../tsfile/compatibility/StreamDeserializer.java   |   8 ++
 .../tsfile/file/header/ChunkGroupHeader.java       |   1 -
 .../file/metadata/DeviceMetadataIndexEntry.java    |  17 ++---
 .../tsfile/file/metadata/MetadataIndexNode.java    |  19 ++---
 .../apache/tsfile/file/metadata/PlainDeviceID.java |  29 ++-----
 .../apache/tsfile/file/metadata/TableSchema.java   |   6 +-
 .../tsfile/file/metadata/TsFileMetadata.java       |   8 +-
 .../apache/tsfile/read/TsFileSequenceReader.java   |  84 ++++++++++-----------
 ...leSequenceReaderTimeseriesMetadataIterator.java |   8 +-
 .../tsfile/compatibility/CompatibilityTest.java    |  55 ++++++++++++++
 .../tsfile/file/metadata/TsFileMetadataTest.java   |   6 +-
 tsfile/src/test/resources/v3TsFile                 | Bin 0 -> 378 bytes
 16 files changed, 231 insertions(+), 153 deletions(-)

diff --git 
a/tsfile/src/main/java/org/apache/tsfile/compatibility/Deserializer.java 
b/tsfile/src/main/java/org/apache/tsfile/compatibility/BufferDeserializer.java
similarity index 89%
rename from 
tsfile/src/main/java/org/apache/tsfile/compatibility/Deserializer.java
rename to 
tsfile/src/main/java/org/apache/tsfile/compatibility/BufferDeserializer.java
index c95eba6e..d82182d6 100644
--- a/tsfile/src/main/java/org/apache/tsfile/compatibility/Deserializer.java
+++ 
b/tsfile/src/main/java/org/apache/tsfile/compatibility/BufferDeserializer.java
@@ -21,6 +21,6 @@ package org.apache.tsfile.compatibility;
 
 import java.nio.ByteBuffer;
 
-public interface Deserializer<T> {
-  T deserialize(ByteBuffer buffer, DeserializeContext context);
+public interface BufferDeserializer<T> {
+  T deserialize(ByteBuffer buffer, DeserializeConfig context);
 }
diff --git 
a/tsfile/src/main/java/org/apache/tsfile/compatibility/CompatibilityUtils.java 
b/tsfile/src/main/java/org/apache/tsfile/compatibility/CompatibilityUtils.java
index 2a79cc91..de01351f 100644
--- 
a/tsfile/src/main/java/org/apache/tsfile/compatibility/CompatibilityUtils.java
+++ 
b/tsfile/src/main/java/org/apache/tsfile/compatibility/CompatibilityUtils.java
@@ -35,22 +35,25 @@ public class CompatibilityUtils {
     // util class
   }
 
-  public static DeserializeContext v3DeserializeContext = new 
DeserializeContext();
+  public static DeserializeConfig v3DeserializeConfig = new 
DeserializeConfig();
 
   static {
-    v3DeserializeContext.tsFileMetadataDeserializer =
+    v3DeserializeConfig.tsFileMetadataBufferDeserializer =
         CompatibilityUtils::deserializeTsFileMetadataFromV3;
-    v3DeserializeContext.deviceIDDeserializer =
-        ((buffer, context) -> PlainDeviceID.deserialize(buffer));
+    v3DeserializeConfig.deviceIDBufferDeserializer =
+        ((buffer, context) -> {
+          final PlainDeviceID deviceID = PlainDeviceID.deserialize(buffer);
+          return deviceID.convertToStringArrayDeviceId();
+        });
   }
 
   public static TsFileMetadata deserializeTsFileMetadataFromV3(
-      ByteBuffer buffer, DeserializeContext context) {
+      ByteBuffer buffer, DeserializeConfig context) {
     TsFileMetadata fileMetaData = new TsFileMetadata();
 
     // metadataIndex
     MetadataIndexNode metadataIndexNode =
-        context.deviceMetadataIndexNodeDeserializer.deserialize(buffer, 
context);
+        context.deviceMetadataIndexNodeBufferDeserializer.deserialize(buffer, 
context);
     fileMetaData.setTableMetadataIndexNodeMap(Collections.singletonMap("", 
metadataIndexNode));
 
     // metaOffset
diff --git 
a/tsfile/src/main/java/org/apache/tsfile/compatibility/DeserializeConfig.java 
b/tsfile/src/main/java/org/apache/tsfile/compatibility/DeserializeConfig.java
new file mode 100644
index 00000000..ac0b8afa
--- /dev/null
+++ 
b/tsfile/src/main/java/org/apache/tsfile/compatibility/DeserializeConfig.java
@@ -0,0 +1,83 @@
+package org.apache.tsfile.compatibility;
+
+import java.io.IOException;
+import java.io.InputStream;
+import org.apache.tsfile.file.IMetadataIndexEntry;
+import org.apache.tsfile.file.metadata.DeviceMetadataIndexEntry;
+import org.apache.tsfile.file.metadata.IDeviceID;
+import org.apache.tsfile.file.metadata.MeasurementMetadataIndexEntry;
+import org.apache.tsfile.file.metadata.MetadataIndexNode;
+import org.apache.tsfile.file.metadata.StringArrayDeviceID;
+import org.apache.tsfile.file.metadata.TableSchema;
+import org.apache.tsfile.file.metadata.TsFileMetadata;
+import org.apache.tsfile.write.schema.MeasurementSchema;
+
+import java.nio.ByteBuffer;
+
+public class DeserializeConfig {
+  public BufferDeserializer<TsFileMetadata> tsFileMetadataBufferDeserializer = 
TsFileMetadata::deserializeFrom;
+
+  public BufferDeserializer<MetadataIndexNode> 
deviceMetadataIndexNodeBufferDeserializer =
+      (buffer, context) -> MetadataIndexNode.deserializeFrom(buffer, true, 
context);
+  public BufferDeserializer<MetadataIndexNode> 
measurementMetadataIndexNodeBufferDeserializer =
+      (buffer, context) -> MetadataIndexNode.deserializeFrom(buffer, false, 
context);
+  public BufferDeserializer<IMetadataIndexEntry> 
deviceMetadataIndexEntryBufferDeserializer =
+      DeviceMetadataIndexEntry::deserializeFrom;
+  public BufferDeserializer<IMetadataIndexEntry> 
measurementMetadataIndexEntryBufferDeserializer =
+      ((buffer, context) -> 
MeasurementMetadataIndexEntry.deserializeFrom(buffer));
+
+  public BufferDeserializer<TableSchema> tableSchemaBufferDeserializer = 
TableSchema::deserialize;
+  public BufferDeserializer<MeasurementSchema> 
measurementSchemaBufferDeserializer =
+      ((buffer, context) -> MeasurementSchema.deserializeFrom(buffer));
+
+  public BufferDeserializer<IDeviceID> deviceIDBufferDeserializer =
+      ((buffer, context) -> StringArrayDeviceID.deserialize(buffer));
+
+  // stream deserializers
+  public StreamDeserializer<MetadataIndexNode> 
deviceMetadataIndexNodeStreamDeserializer =
+      (stream, context) -> MetadataIndexNode.deserializeFrom(stream, true, 
context);
+  public StreamDeserializer<MetadataIndexNode> 
measurementMetadataIndexNodeStreamDeserializer =
+      (stream, context) -> MetadataIndexNode.deserializeFrom(stream, false, 
context);
+  public StreamDeserializer<IMetadataIndexEntry> 
deviceMetadataIndexEntryStreamDeserializer =
+      DeviceMetadataIndexEntry::deserializeFrom;
+  public StreamDeserializer<IMetadataIndexEntry> 
measurementMetadataIndexEntryStreamDeserializer =
+      ((stream, context) -> 
MeasurementMetadataIndexEntry.deserializeFrom(stream));
+
+  public StreamDeserializer<IDeviceID> deviceIDStreamDeserializer =
+      ((stream, context) -> StringArrayDeviceID.deserialize(stream));
+
+  public MetadataIndexNode deserializeMetadataIndexNode(ByteBuffer buffer, 
boolean isDeviceLevel) {
+    if (isDeviceLevel) {
+      return deviceMetadataIndexNodeBufferDeserializer.deserialize(buffer, 
this);
+    } else {
+      return 
measurementMetadataIndexNodeBufferDeserializer.deserialize(buffer, this);
+    }
+  }
+
+  public IMetadataIndexEntry deserializeMetadataIndexEntry(ByteBuffer buffer,
+      boolean isDeviceLevel) {
+    if (isDeviceLevel) {
+      return deviceMetadataIndexEntryBufferDeserializer.deserialize(buffer, 
this);
+    } else {
+      return 
measurementMetadataIndexEntryBufferDeserializer.deserialize(buffer, this);
+    }
+  }
+
+  public MetadataIndexNode deserializeMetadataIndexNode(InputStream stream, 
boolean isDeviceLevel)
+      throws IOException {
+    if (isDeviceLevel) {
+      return deviceMetadataIndexNodeStreamDeserializer.deserialize(stream, 
this);
+    } else {
+      return 
measurementMetadataIndexNodeStreamDeserializer.deserialize(stream, this);
+    }
+  }
+
+  public IMetadataIndexEntry deserializeMetadataIndexEntry(InputStream stream,
+      boolean isDeviceLevel) throws IOException {
+    if (isDeviceLevel) {
+      return deviceMetadataIndexEntryStreamDeserializer.deserialize(stream, 
this);
+    } else {
+      return 
measurementMetadataIndexEntryStreamDeserializer.deserialize(stream, this);
+    }
+  }
+}
diff --git 
a/tsfile/src/main/java/org/apache/tsfile/compatibility/DeserializeContext.java 
b/tsfile/src/main/java/org/apache/tsfile/compatibility/DeserializeContext.java
deleted file mode 100644
index 0c245cce..00000000
--- 
a/tsfile/src/main/java/org/apache/tsfile/compatibility/DeserializeContext.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.apache.tsfile.compatibility;
-
-import org.apache.tsfile.file.IMetadataIndexEntry;
-import org.apache.tsfile.file.metadata.DeviceMetadataIndexEntry;
-import org.apache.tsfile.file.metadata.IDeviceID;
-import org.apache.tsfile.file.metadata.MeasurementMetadataIndexEntry;
-import org.apache.tsfile.file.metadata.MetadataIndexNode;
-import org.apache.tsfile.file.metadata.StringArrayDeviceID;
-import org.apache.tsfile.file.metadata.TableSchema;
-import org.apache.tsfile.file.metadata.TsFileMetadata;
-import org.apache.tsfile.write.schema.MeasurementSchema;
-
-import java.nio.ByteBuffer;
-
-public class DeserializeContext {
-  public Deserializer<TsFileMetadata> tsFileMetadataDeserializer = 
TsFileMetadata::deserializeFrom;
-
-  public Deserializer<MetadataIndexNode> deviceMetadataIndexNodeDeserializer =
-      (buffer, context) -> MetadataIndexNode.deserializeFrom(buffer, true, 
context);
-  public Deserializer<MetadataIndexNode> 
measurementMetadataIndexNodeDeserializer =
-      (buffer, context) -> MetadataIndexNode.deserializeFrom(buffer, false, 
context);
-  public Deserializer<IMetadataIndexEntry> 
deviceMetadataIndexEntryDeserializer =
-      DeviceMetadataIndexEntry::deserializeFrom;
-  public Deserializer<IMetadataIndexEntry> 
measurementMetadataIndexEntryDeserializer =
-      ((buffer, context) -> 
MeasurementMetadataIndexEntry.deserializeFrom(buffer));
-
-  public Deserializer<TableSchema> tableSchemaDeserializer = 
TableSchema::deserialize;
-  public Deserializer<MeasurementSchema> measurementSchemaDeserializer =
-      ((buffer, context) -> MeasurementSchema.deserializeFrom(buffer));
-
-  public Deserializer<IDeviceID> deviceIDDeserializer =
-      ((buffer, context) -> StringArrayDeviceID.deserialize(buffer));
-
-  public MetadataIndexNode deserilizeMetadataIndexNode(ByteBuffer buffer, 
boolean isDeviceLevel) {
-    if (isDeviceLevel) {
-      return deviceMetadataIndexNodeDeserializer.deserialize(buffer, this);
-    } else {
-      return measurementMetadataIndexNodeDeserializer.deserialize(buffer, 
this);
-    }
-  }
-}
diff --git 
a/tsfile/src/main/java/org/apache/tsfile/compatibility/StreamDeserializer.java 
b/tsfile/src/main/java/org/apache/tsfile/compatibility/StreamDeserializer.java
new file mode 100644
index 00000000..b0afd457
--- /dev/null
+++ 
b/tsfile/src/main/java/org/apache/tsfile/compatibility/StreamDeserializer.java
@@ -0,0 +1,8 @@
+package org.apache.tsfile.compatibility;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+public interface StreamDeserializer<T> {
+  T deserialize(InputStream inputStream, DeserializeConfig context) throws 
IOException;
+}
diff --git 
a/tsfile/src/main/java/org/apache/tsfile/file/header/ChunkGroupHeader.java 
b/tsfile/src/main/java/org/apache/tsfile/file/header/ChunkGroupHeader.java
index b9adf3bf..6bc0493e 100644
--- a/tsfile/src/main/java/org/apache/tsfile/file/header/ChunkGroupHeader.java
+++ b/tsfile/src/main/java/org/apache/tsfile/file/header/ChunkGroupHeader.java
@@ -91,7 +91,6 @@ public class ChunkGroupHeader {
     if (!markerRead) {
       offsetVar++;
     }
-    // TODO: add an interface in IDeviceID
     final InputStream inputStream = input.wrapAsInputStream();
     final long skipped = inputStream.skip(offsetVar);
     if (skipped != offsetVar) {
diff --git 
a/tsfile/src/main/java/org/apache/tsfile/file/metadata/DeviceMetadataIndexEntry.java
 
b/tsfile/src/main/java/org/apache/tsfile/file/metadata/DeviceMetadataIndexEntry.java
index f2097664..d483bc5d 100644
--- 
a/tsfile/src/main/java/org/apache/tsfile/file/metadata/DeviceMetadataIndexEntry.java
+++ 
b/tsfile/src/main/java/org/apache/tsfile/file/metadata/DeviceMetadataIndexEntry.java
@@ -19,7 +19,7 @@
 
 package org.apache.tsfile.file.metadata;
 
-import org.apache.tsfile.compatibility.DeserializeContext;
+import org.apache.tsfile.compatibility.DeserializeConfig;
 import org.apache.tsfile.file.IMetadataIndexEntry;
 import org.apache.tsfile.utils.ReadWriteIOUtils;
 
@@ -75,15 +75,16 @@ public class DeviceMetadataIndexEntry implements 
IMetadataIndexEntry {
   }
 
   public static DeviceMetadataIndexEntry deserializeFrom(
-      ByteBuffer buffer, DeserializeContext context) {
-    IDeviceID device = context.deviceIDDeserializer.deserialize(buffer, 
context);
+      ByteBuffer buffer, DeserializeConfig context) {
+    IDeviceID device = context.deviceIDBufferDeserializer.deserialize(buffer, 
context);
     long offset = ReadWriteIOUtils.readLong(buffer);
     return new DeviceMetadataIndexEntry(device, offset);
   }
 
-  public static DeviceMetadataIndexEntry deserializeFrom(InputStream 
inputStream)
+  public static DeviceMetadataIndexEntry deserializeFrom(InputStream 
inputStream,
+      DeserializeConfig config)
       throws IOException {
-    IDeviceID device = 
IDeviceID.Deserializer.DEFAULT_DESERIALIZER.deserializeFrom(inputStream);
+    IDeviceID device = 
config.deviceIDStreamDeserializer.deserialize(inputStream, config);
     long offset = ReadWriteIOUtils.readLong(inputStream);
     return new DeviceMetadataIndexEntry(device, offset);
   }
@@ -92,10 +93,4 @@ public class DeviceMetadataIndexEntry implements 
IMetadataIndexEntry {
   public String toString() {
     return "<" + deviceID + "," + offset + ">";
   }
-
-  public interface Deserializer {
-    DeviceMetadataIndexEntry deserializeFrom(ByteBuffer buffer);
-
-    DeviceMetadataIndexEntry deserializeFrom(InputStream inputStream) throws 
IOException;
-  }
 }
diff --git 
a/tsfile/src/main/java/org/apache/tsfile/file/metadata/MetadataIndexNode.java 
b/tsfile/src/main/java/org/apache/tsfile/file/metadata/MetadataIndexNode.java
index 95f9ca5a..e55cf490 100644
--- 
a/tsfile/src/main/java/org/apache/tsfile/file/metadata/MetadataIndexNode.java
+++ 
b/tsfile/src/main/java/org/apache/tsfile/file/metadata/MetadataIndexNode.java
@@ -21,7 +21,7 @@ package org.apache.tsfile.file.metadata;
 
 import org.apache.tsfile.common.conf.TSFileConfig;
 import org.apache.tsfile.common.conf.TSFileDescriptor;
-import org.apache.tsfile.compatibility.DeserializeContext;
+import org.apache.tsfile.compatibility.DeserializeConfig;
 import org.apache.tsfile.file.IMetadataIndexEntry;
 import org.apache.tsfile.file.metadata.enums.MetadataIndexNodeType;
 import org.apache.tsfile.utils.Pair;
@@ -100,15 +100,11 @@ public class MetadataIndexNode {
   }
 
   public static MetadataIndexNode deserializeFrom(
-      ByteBuffer buffer, boolean isDeviceLevel, DeserializeContext context) {
+      ByteBuffer buffer, boolean isDeviceLevel, DeserializeConfig context) {
     List<IMetadataIndexEntry> children = new ArrayList<>();
     int size = ReadWriteForEncodingUtils.readUnsignedVarInt(buffer);
     for (int i = 0; i < size; i++) {
-      if (isDeviceLevel) {
-        
children.add(context.deviceMetadataIndexEntryDeserializer.deserialize(buffer, 
context));
-      } else {
-        children.add(MeasurementMetadataIndexEntry.deserializeFrom(buffer));
-      }
+      children.add(context.deserializeMetadataIndexEntry(buffer, 
isDeviceLevel));
     }
     long offset = ReadWriteIOUtils.readLong(buffer);
     MetadataIndexNodeType nodeType =
@@ -116,16 +112,13 @@ public class MetadataIndexNode {
     return new MetadataIndexNode(children, offset, nodeType);
   }
 
-  public static MetadataIndexNode deserializeFrom(InputStream inputStream, 
boolean isDeviceLevel)
+  public static MetadataIndexNode deserializeFrom(InputStream inputStream, 
boolean isDeviceLevel,
+      DeserializeConfig config)
       throws IOException {
     List<IMetadataIndexEntry> children = new ArrayList<>();
     int size = ReadWriteForEncodingUtils.readUnsignedVarInt(inputStream);
     for (int i = 0; i < size; i++) {
-      if (isDeviceLevel) {
-        children.add(DeviceMetadataIndexEntry.deserializeFrom(inputStream));
-      } else {
-        
children.add(MeasurementMetadataIndexEntry.deserializeFrom(inputStream));
-      }
+      children.add(config.deserializeMetadataIndexEntry(inputStream, 
isDeviceLevel));
     }
     long offset = ReadWriteIOUtils.readLong(inputStream);
     MetadataIndexNodeType nodeType =
diff --git 
a/tsfile/src/main/java/org/apache/tsfile/file/metadata/PlainDeviceID.java 
b/tsfile/src/main/java/org/apache/tsfile/file/metadata/PlainDeviceID.java
index 0cf77051..61d32dcf 100644
--- a/tsfile/src/main/java/org/apache/tsfile/file/metadata/PlainDeviceID.java
+++ b/tsfile/src/main/java/org/apache/tsfile/file/metadata/PlainDeviceID.java
@@ -35,27 +35,6 @@ import static 
org.apache.tsfile.utils.RamUsageEstimator.sizeOfCharArray;
 /** Using device id path as id. */
 public class PlainDeviceID implements IDeviceID {
 
-  public static final Deserializer DESERIALIZER =
-      new Deserializer() {
-        @Override
-        public IDeviceID deserializeFrom(ByteBuffer byteBuffer) {
-          return deserialize(byteBuffer);
-        }
-
-        @Override
-        public IDeviceID deserializeFrom(InputStream inputStream) throws 
IOException {
-          return deserialize(inputStream);
-        }
-      };
-
-  public static final Factory FACTORY =
-      new Factory() {
-        @Override
-        public IDeviceID create(String deviceIdString) {
-          return new PlainDeviceID(deviceIdString);
-        }
-      };
-
   // TODO: configurable but unchangeable
   private static final int DEFAULT_SEGMENT_NUM_FOR_TABLE_NAME = 3;
   private static final long INSTANCE_SIZE =
@@ -128,14 +107,18 @@ public class PlainDeviceID implements IDeviceID {
     return size;
   }
 
-  public static IDeviceID deserialize(ByteBuffer byteBuffer) {
+  public static PlainDeviceID deserialize(ByteBuffer byteBuffer) {
     return new PlainDeviceID(ReadWriteIOUtils.readVarIntString(byteBuffer));
   }
 
-  public static IDeviceID deserialize(InputStream inputStream) throws 
IOException {
+  public static PlainDeviceID deserialize(InputStream inputStream) throws 
IOException {
     return new PlainDeviceID(ReadWriteIOUtils.readVarIntString(inputStream));
   }
 
+  public StringArrayDeviceID convertToStringArrayDeviceId() {
+    return new StringArrayDeviceID(deviceID);
+  }
+
   @Override
   public int compareTo(IDeviceID other) {
     if (!(other instanceof PlainDeviceID)) {
diff --git 
a/tsfile/src/main/java/org/apache/tsfile/file/metadata/TableSchema.java 
b/tsfile/src/main/java/org/apache/tsfile/file/metadata/TableSchema.java
index 838eefd0..7005d779 100644
--- a/tsfile/src/main/java/org/apache/tsfile/file/metadata/TableSchema.java
+++ b/tsfile/src/main/java/org/apache/tsfile/file/metadata/TableSchema.java
@@ -19,7 +19,7 @@
 
 package org.apache.tsfile.file.metadata;
 
-import org.apache.tsfile.compatibility.DeserializeContext;
+import org.apache.tsfile.compatibility.DeserializeConfig;
 import org.apache.tsfile.utils.ReadWriteIOUtils;
 import org.apache.tsfile.write.record.Tablet.ColumnType;
 import org.apache.tsfile.write.schema.MeasurementSchema;
@@ -124,13 +124,13 @@ public class TableSchema {
     return cnt;
   }
 
-  public static TableSchema deserialize(ByteBuffer buffer, DeserializeContext 
context) {
+  public static TableSchema deserialize(ByteBuffer buffer, DeserializeConfig 
context) {
     final int tableNum = buffer.getInt();
     List<MeasurementSchema> measurementSchemas = new ArrayList<>(tableNum);
     List<ColumnType> columnTypes = new ArrayList<>();
     for (int i = 0; i < tableNum; i++) {
       MeasurementSchema measurementSchema =
-          context.measurementSchemaDeserializer.deserialize(buffer, context);
+          context.measurementSchemaBufferDeserializer.deserialize(buffer, 
context);
       measurementSchemas.add(measurementSchema);
       columnTypes.add(ColumnType.values()[buffer.getInt()]);
     }
diff --git 
a/tsfile/src/main/java/org/apache/tsfile/file/metadata/TsFileMetadata.java 
b/tsfile/src/main/java/org/apache/tsfile/file/metadata/TsFileMetadata.java
index c8ea5f23..f0dfcf53 100644
--- a/tsfile/src/main/java/org/apache/tsfile/file/metadata/TsFileMetadata.java
+++ b/tsfile/src/main/java/org/apache/tsfile/file/metadata/TsFileMetadata.java
@@ -19,7 +19,7 @@
 
 package org.apache.tsfile.file.metadata;
 
-import org.apache.tsfile.compatibility.DeserializeContext;
+import org.apache.tsfile.compatibility.DeserializeConfig;
 import org.apache.tsfile.utils.BloomFilter;
 import org.apache.tsfile.utils.ReadWriteForEncodingUtils;
 import org.apache.tsfile.utils.ReadWriteIOUtils;
@@ -50,7 +50,7 @@ public class TsFileMetadata {
    * @param buffer -buffer use to deserialize
    * @return -a instance of TsFileMetaData
    */
-  public static TsFileMetadata deserializeFrom(ByteBuffer buffer, 
DeserializeContext context) {
+  public static TsFileMetadata deserializeFrom(ByteBuffer buffer, 
DeserializeConfig context) {
     TsFileMetadata fileMetaData = new TsFileMetadata();
 
     // metadataIndex
@@ -59,7 +59,7 @@ public class TsFileMetadata {
     for (int i = 0; i < tableIndexNodeNum; i++) {
       String tableName = ReadWriteIOUtils.readString(buffer);
       MetadataIndexNode metadataIndexNode =
-          context.deviceMetadataIndexNodeDeserializer.deserialize(buffer, 
context);
+          
context.deviceMetadataIndexNodeBufferDeserializer.deserialize(buffer, context);
       tableIndexNodeMap.put(tableName, metadataIndexNode);
     }
     fileMetaData.setTableMetadataIndexNodeMap(tableIndexNodeMap);
@@ -69,7 +69,7 @@ public class TsFileMetadata {
     Map<String, TableSchema> tableSchemaMap = new HashMap<>();
     for (int i = 0; i < tableSchemaNum; i++) {
       String tableName = ReadWriteIOUtils.readString(buffer);
-      TableSchema tableSchema = 
context.tableSchemaDeserializer.deserialize(buffer, context);
+      TableSchema tableSchema = 
context.tableSchemaBufferDeserializer.deserialize(buffer, context);
       tableSchema.setTableName(tableName);
       tableSchemaMap.put(tableName, tableSchema);
     }
diff --git 
a/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReader.java 
b/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReader.java
index 4ca86fd9..eb2de930 100644
--- a/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReader.java
+++ b/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReader.java
@@ -23,7 +23,7 @@ import org.apache.tsfile.common.conf.TSFileConfig;
 import org.apache.tsfile.common.conf.TSFileDescriptor;
 import org.apache.tsfile.common.constant.TsFileConstant;
 import org.apache.tsfile.compatibility.CompatibilityUtils;
-import org.apache.tsfile.compatibility.DeserializeContext;
+import org.apache.tsfile.compatibility.DeserializeConfig;
 import org.apache.tsfile.compress.IUnCompressor;
 import org.apache.tsfile.encoding.decoder.Decoder;
 import org.apache.tsfile.enums.TSDataType;
@@ -124,7 +124,7 @@ public class TsFileSequenceReader implements AutoCloseable {
 
   private byte fileVersion;
 
-  private DeserializeContext deserializeContext = new DeserializeContext();
+  private DeserializeConfig deserializeConfig = new DeserializeConfig();
 
   /**
    * Create a file reader of the given file. The reader will read the tail of 
the file to get the
@@ -227,7 +227,7 @@ public class TsFileSequenceReader implements AutoCloseable {
 
   private void configDeserializer() throws IOException {
     if (fileVersion == 0x03) {
-      deserializeContext = CompatibilityUtils.v3DeserializeContext;
+      deserializeConfig = CompatibilityUtils.v3DeserializeConfig;
     }
   }
 
@@ -330,8 +330,8 @@ public class TsFileSequenceReader implements AutoCloseable {
         synchronized (this) {
           if (tsFileMetaData == null) {
             tsFileMetaData =
-                deserializeContext.tsFileMetadataDeserializer.deserialize(
-                    readData(fileMetadataPos, fileMetadataSize), 
deserializeContext);
+                deserializeConfig.tsFileMetadataBufferDeserializer.deserialize(
+                    readData(fileMetadataPos, fileMetadataSize), 
deserializeConfig);
           }
         }
       }
@@ -423,8 +423,8 @@ public class TsFileSequenceReader implements AutoCloseable {
     if 
(!metadataIndexNode.getNodeType().equals(MetadataIndexNodeType.LEAF_MEASUREMENT))
 {
       try {
         metadataIndexNode =
-            
deserializeContext.measurementMetadataIndexNodeDeserializer.deserialize(
-                buffer, deserializeContext);
+            
deserializeConfig.measurementMetadataIndexNodeBufferDeserializer.deserialize(
+                buffer, deserializeConfig);
       } catch (Exception e) {
         logger.error(METADATA_INDEX_NODE_DESERIALIZE_ERROR, file);
         throw e;
@@ -487,8 +487,8 @@ public class TsFileSequenceReader implements AutoCloseable {
     try {
       // next layer MeasurementNode of the specific DeviceNode
       metadataIndexNode =
-          
deserializeContext.measurementMetadataIndexNodeDeserializer.deserialize(
-              buffer, deserializeContext);
+          
deserializeConfig.measurementMetadataIndexNodeBufferDeserializer.deserialize(
+              buffer, deserializeConfig);
     } catch (Exception e) {
       logger.error(METADATA_INDEX_NODE_DESERIALIZE_ERROR, file);
       throw e;
@@ -593,8 +593,8 @@ public class TsFileSequenceReader implements AutoCloseable {
     if 
(!metadataIndexNode.getNodeType().equals(MetadataIndexNodeType.LEAF_MEASUREMENT))
 {
       try {
         metadataIndexNode =
-            
deserializeContext.measurementMetadataIndexNodeDeserializer.deserialize(
-                buffer, deserializeContext);
+            
deserializeConfig.measurementMetadataIndexNodeBufferDeserializer.deserialize(
+                buffer, deserializeConfig);
       } catch (Exception e) {
         logger.error(METADATA_INDEX_NODE_DESERIALIZE_ERROR, file);
         throw e;
@@ -634,8 +634,8 @@ public class TsFileSequenceReader implements AutoCloseable {
       // next layer MeasurementNode of the specific DeviceNode
       try {
         measurementMetadataIndexNode =
-            
deserializeContext.measurementMetadataIndexNodeDeserializer.deserialize(
-                buffer, deserializeContext);
+            
deserializeConfig.measurementMetadataIndexNodeBufferDeserializer.deserialize(
+                buffer, deserializeConfig);
       } catch (Exception e) {
         logger.error(METADATA_INDEX_NODE_DESERIALIZE_ERROR, file);
         throw e;
@@ -836,8 +836,8 @@ public class TsFileSequenceReader implements AutoCloseable {
       }
       ByteBuffer buffer = 
readData(metadataIndexNode.getChildren().get(i).getOffset(), endOffset);
       MetadataIndexNode node =
-          
deserializeContext.measurementMetadataIndexNodeDeserializer.deserialize(
-              buffer, deserializeContext);
+          
deserializeConfig.measurementMetadataIndexNodeBufferDeserializer.deserialize(
+              buffer, deserializeConfig);
       deviceList.addAll(getAllDevices(node));
     }
     return deviceList;
@@ -878,8 +878,8 @@ public class TsFileSequenceReader implements AutoCloseable {
     try {
       ByteBuffer nextBuffer = readData(startOffset, endOffset);
       MetadataIndexNode deviceLeafNode =
-          deserializeContext.deviceMetadataIndexNodeDeserializer.deserialize(
-              nextBuffer, deserializeContext);
+          
deserializeConfig.deviceMetadataIndexNodeBufferDeserializer.deserialize(
+              nextBuffer, deserializeConfig);
       getDevicesOfLeafNode(deviceLeafNode, measurementNodeOffsetQueue);
     } catch (StopReadTsFileByInterruptException e) {
       throw e;
@@ -949,8 +949,8 @@ public class TsFileSequenceReader implements AutoCloseable {
         }
         ByteBuffer nextBuffer = readData(startOffset, endOffset);
         getAllDeviceLeafNodeOffset(
-            deserializeContext.deviceMetadataIndexNodeDeserializer.deserialize(
-                nextBuffer, deserializeContext),
+            
deserializeConfig.deviceMetadataIndexNodeBufferDeserializer.deserialize(
+                nextBuffer, deserializeConfig),
             leafDeviceNodeOffsets);
       }
     } catch (StopReadTsFileByInterruptException e) {
@@ -1069,7 +1069,7 @@ public class TsFileSequenceReader implements 
AutoCloseable {
       }
       boolean currentChildLevelIsDevice = 
MetadataIndexNodeType.INTERNAL_DEVICE.equals(type);
       MetadataIndexNode metadataIndexNode =
-          deserializeContext.deserilizeMetadataIndexNode(buffer, 
currentChildLevelIsDevice);
+          deserializeConfig.deserializeMetadataIndexNode(buffer, 
currentChildLevelIsDevice);
 
       int metadataIndexListSize = metadataIndexNode.getChildren().size();
       for (int i = 0; i < metadataIndexListSize; i++) {
@@ -1135,8 +1135,8 @@ public class TsFileSequenceReader implements 
AutoCloseable {
               measurementNode.getChildren().get(0).getOffset(),
               measurementNode.getChildren().get(1).getOffset());
       MetadataIndexNode metadataIndexNode =
-          
deserializeContext.measurementMetadataIndexNodeDeserializer.deserialize(
-              buffer, deserializeContext);
+          
deserializeConfig.measurementMetadataIndexNodeBufferDeserializer.deserialize(
+              buffer, deserializeConfig);
       return getTimeColumnMetadata(metadataIndexNode);
     }
     return null;
@@ -1186,8 +1186,8 @@ public class TsFileSequenceReader implements 
AutoCloseable {
       } else {
         // internal measurement node
         MetadataIndexNode nextLayerMeasurementNode =
-            
deserializeContext.measurementMetadataIndexNodeDeserializer.deserialize(
-                nextBuffer, deserializeContext);
+            
deserializeConfig.measurementMetadataIndexNodeBufferDeserializer.deserialize(
+                nextBuffer, deserializeConfig);
         timeseriesMetadataOffsetMap.putAll(
             getTimeseriesMetadataOffsetByDevice(
                 nextLayerMeasurementNode, excludedMeasurementIds, 
needChunkMetadata));
@@ -1244,8 +1244,8 @@ public class TsFileSequenceReader implements 
AutoCloseable {
       } else {
         // internal measurement node
         MetadataIndexNode nextLayerMeasurementNode =
-            
deserializeContext.measurementMetadataIndexNodeDeserializer.deserialize(
-                nextBuffer, deserializeContext);
+            
deserializeConfig.measurementMetadataIndexNodeBufferDeserializer.deserialize(
+                nextBuffer, deserializeConfig);
         getDeviceTimeseriesMetadata(
             timeseriesMetadataList,
             nextLayerMeasurementNode,
@@ -1288,7 +1288,7 @@ public class TsFileSequenceReader implements 
AutoCloseable {
         }
         boolean currentChildLevelIsDevice = 
MetadataIndexNodeType.INTERNAL_DEVICE.equals(type);
         MetadataIndexNode metadataIndexNode =
-            deserializeContext.deserilizeMetadataIndexNode(buffer, 
currentChildLevelIsDevice);
+            deserializeConfig.deserializeMetadataIndexNode(buffer, 
currentChildLevelIsDevice);
 
         int metadataIndexListSize = metadataIndexNode.getChildren().size();
         for (int i = 0; i < metadataIndexListSize; i++) {
@@ -1355,7 +1355,7 @@ public class TsFileSequenceReader implements 
AutoCloseable {
         }
         boolean currentChildLevelIsDevice = 
MetadataIndexNodeType.INTERNAL_DEVICE.equals(type);
         MetadataIndexNode metadataIndexNode =
-            MetadataIndexNode.deserializeFrom(
+            deserializeConfig.deserializeMetadataIndexNode(
                 tsFileInput.wrapAsInputStream(), currentChildLevelIsDevice);
         int metadataIndexListSize = metadataIndexNode.getChildren().size();
         for (int i = 0; i < metadataIndexListSize; i++) {
@@ -1495,8 +1495,8 @@ public class TsFileSequenceReader implements 
AutoCloseable {
             metadataIndex.getChildIndexEntry(deviceID, false);
         ByteBuffer buffer = readData(childIndexEntry.left.getOffset(), 
childIndexEntry.right);
         return getMetadataAndEndOffsetOfDeviceNode(
-            
deserializeContext.measurementMetadataIndexNodeDeserializer.deserialize(
-                buffer, deserializeContext),
+            
deserializeConfig.measurementMetadataIndexNodeBufferDeserializer.deserialize(
+                buffer, deserializeConfig),
             deviceID,
             exactSearch);
       } else {
@@ -1529,8 +1529,8 @@ public class TsFileSequenceReader implements 
AutoCloseable {
             metadataIndex.getChildIndexEntry(measurement, false);
         ByteBuffer buffer = readData(childIndexEntry.left.getOffset(), 
childIndexEntry.right);
         return getMetadataAndEndOffsetOfMeasurementNode(
-            
deserializeContext.measurementMetadataIndexNodeDeserializer.deserialize(
-                buffer, deserializeContext),
+            
deserializeConfig.measurementMetadataIndexNodeBufferDeserializer.deserialize(
+                buffer, deserializeConfig),
             measurement,
             exactSearch);
       } else {
@@ -2373,8 +2373,8 @@ public class TsFileSequenceReader implements 
AutoCloseable {
     try {
       // next layer MeasurementNode of the specific DeviceNode
       metadataIndexNode =
-          
deserializeContext.measurementMetadataIndexNodeDeserializer.deserialize(
-              buffer, deserializeContext);
+          
deserializeConfig.measurementMetadataIndexNodeBufferDeserializer.deserialize(
+              buffer, deserializeConfig);
     } catch (Exception e) {
       logger.error(METADATA_INDEX_NODE_DESERIALIZE_ERROR, file);
       throw e;
@@ -2541,12 +2541,12 @@ public class TsFileSequenceReader implements 
AutoCloseable {
     final ByteBuffer buffer = readData(startOffset, endOffset);
     if (isDeviceLevel) {
       metadataIndexNode =
-          deserializeContext.deviceMetadataIndexNodeDeserializer.deserialize(
-              buffer, deserializeContext);
+          
deserializeConfig.deviceMetadataIndexNodeBufferDeserializer.deserialize(
+              buffer, deserializeConfig);
     } else {
       metadataIndexNode =
-          
deserializeContext.measurementMetadataIndexNodeDeserializer.deserialize(
-              buffer, deserializeContext);
+          
deserializeConfig.measurementMetadataIndexNodeBufferDeserializer.deserialize(
+              buffer, deserializeConfig);
     }
     return metadataIndexNode;
   }
@@ -2671,8 +2671,8 @@ public class TsFileSequenceReader implements 
AutoCloseable {
       ByteBuffer buffer, Queue<Pair<Long, Long>> queue) throws IOException {
     try {
       final MetadataIndexNode metadataIndexNode =
-          
deserializeContext.measurementMetadataIndexNodeDeserializer.deserialize(
-              buffer, deserializeContext);
+          
deserializeConfig.measurementMetadataIndexNodeBufferDeserializer.deserialize(
+              buffer, deserializeConfig);
       final MetadataIndexNodeType metadataIndexNodeType = 
metadataIndexNode.getNodeType();
       final int metadataIndexListSize = metadataIndexNode.getChildren().size();
       for (int i = 0; i < metadataIndexListSize; ++i) {
@@ -2713,7 +2713,7 @@ public class TsFileSequenceReader implements 
AutoCloseable {
     return Objects.hash(file);
   }
 
-  public DeserializeContext getDeserializeContext() {
-    return deserializeContext;
+  public DeserializeConfig getDeserializeContext() {
+    return deserializeConfig;
   }
 }
diff --git 
a/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReaderTimeseriesMetadataIterator.java
 
b/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReaderTimeseriesMetadataIterator.java
index 933f3f96..9fa1c311 100644
--- 
a/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReaderTimeseriesMetadataIterator.java
+++ 
b/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReaderTimeseriesMetadataIterator.java
@@ -19,7 +19,7 @@
 
 package org.apache.tsfile.read;
 
-import org.apache.tsfile.compatibility.DeserializeContext;
+import org.apache.tsfile.compatibility.DeserializeConfig;
 import 
org.apache.tsfile.exception.TsFileSequenceReaderTimeseriesMetadataIteratorException;
 import org.apache.tsfile.file.IMetadataIndexEntry;
 import org.apache.tsfile.file.metadata.DeviceMetadataIndexEntry;
@@ -51,7 +51,7 @@ public class TsFileSequenceReaderTimeseriesMetadataIterator
   private final Deque<MetadataIndexEntryInfo> metadataIndexEntryStack = new 
ArrayDeque<>();
   private IDeviceID currentDeviceId;
   private int currentTimeseriesMetadataCount = 0;
-  private DeserializeContext deserializeContext;
+  private DeserializeConfig deserializeConfig;
 
   public TsFileSequenceReaderTimeseriesMetadataIterator(
       TsFileSequenceReader reader, boolean needChunkMetadata, int 
timeseriesBatchReadNumber)
@@ -59,7 +59,7 @@ public class TsFileSequenceReaderTimeseriesMetadataIterator
     this.reader = reader;
     this.needChunkMetadata = needChunkMetadata;
     this.timeseriesBatchReadNumber = timeseriesBatchReadNumber;
-    this.deserializeContext = new DeserializeContext();
+    this.deserializeConfig = new DeserializeConfig();
 
     if (this.reader.tsFileMetaData == null) {
       this.reader.readFileMetadata();
@@ -227,7 +227,7 @@ public class TsFileSequenceReaderTimeseriesMetadataIterator
 
     boolean currentChildLevelIsDevice = 
MetadataIndexNodeType.INTERNAL_DEVICE.equals(type);
     final MetadataIndexNode metadataIndexNode =
-        deserializeContext.deserilizeMetadataIndexNode(
+        deserializeConfig.deserializeMetadataIndexNode(
             reader.readData(metadataIndexEntry.getOffset(), endOffset), 
currentChildLevelIsDevice);
     MetadataIndexNodeType metadataIndexNodeType = 
metadataIndexNode.getNodeType();
     List<IMetadataIndexEntry> children = metadataIndexNode.getChildren();
diff --git 
a/tsfile/src/test/java/org/apache/tsfile/compatibility/CompatibilityTest.java 
b/tsfile/src/test/java/org/apache/tsfile/compatibility/CompatibilityTest.java
new file mode 100644
index 00000000..9df39ded
--- /dev/null
+++ 
b/tsfile/src/test/java/org/apache/tsfile/compatibility/CompatibilityTest.java
@@ -0,0 +1,55 @@
+package org.apache.tsfile.compatibility;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.IOException;
+import org.apache.tsfile.read.TsFileReader;
+import org.apache.tsfile.read.TsFileSequenceReader;
+import org.apache.tsfile.read.common.Path;
+import org.apache.tsfile.read.common.RowRecord;
+import org.apache.tsfile.read.expression.QueryExpression;
+import org.apache.tsfile.read.query.dataset.QueryDataSet;
+import org.junit.Test;
+
+public class CompatibilityTest {
+
+  private String fileName = "target" + File.separator + "test-classes" + 
File.separator +
+      "v3TsFile";
+
+  /**
+   * The file is generated by the TsFileWriter in version 3.
+   */
+  @Test
+  public void testReadV3() {
+    readOneRow();
+  }
+
+  private void readOneRow() {
+    readOneRow(5);
+  }
+
+  private void readOneRow(int s2Value) {
+    try {
+      TsFileReader tsFileReader = new TsFileReader(new 
TsFileSequenceReader(fileName));
+      QueryDataSet dataSet =
+          tsFileReader.query(
+              QueryExpression.create()
+                  .addSelectedPath(new Path("d1", "s1", true))
+                  .addSelectedPath(new Path("d1", "s2", true))
+                  .addSelectedPath(new Path("d1", "s3", true)));
+      while (dataSet.hasNext()) {
+        RowRecord result = dataSet.next();
+        assertEquals(2, result.getFields().size());
+        assertEquals(10000, result.getTimestamp());
+        assertEquals(5.0f, result.getFields().get(0).getFloatV(), 0.00001);
+        assertEquals(s2Value, result.getFields().get(1).getIntV());
+      }
+      tsFileReader.close();
+    } catch (IOException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+}
diff --git 
a/tsfile/src/test/java/org/apache/tsfile/file/metadata/TsFileMetadataTest.java 
b/tsfile/src/test/java/org/apache/tsfile/file/metadata/TsFileMetadataTest.java
index fed04818..cfac37e8 100644
--- 
a/tsfile/src/test/java/org/apache/tsfile/file/metadata/TsFileMetadataTest.java
+++ 
b/tsfile/src/test/java/org/apache/tsfile/file/metadata/TsFileMetadataTest.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tsfile.file.metadata;
 
-import org.apache.tsfile.compatibility.DeserializeContext;
+import org.apache.tsfile.compatibility.DeserializeConfig;
 import org.apache.tsfile.constant.TestConstant;
 import org.apache.tsfile.file.metadata.utils.TestHelper;
 import org.apache.tsfile.file.metadata.utils.Utils;
@@ -61,14 +61,14 @@ public class TsFileMetadataTest {
   private TsFileMetadata deSerialized() {
     FileInputStream fileInputStream = null;
     TsFileMetadata metaData = null;
-    DeserializeContext deserializeContext = new DeserializeContext();
+    DeserializeConfig deserializeConfig = new DeserializeConfig();
     try {
       fileInputStream = new FileInputStream(new File(PATH));
       FileChannel channel = fileInputStream.getChannel();
       ByteBuffer buffer = ByteBuffer.allocate((int) channel.size());
       channel.read(buffer);
       buffer.rewind();
-      metaData = TsFileMetadata.deserializeFrom(buffer, deserializeContext);
+      metaData = TsFileMetadata.deserializeFrom(buffer, deserializeConfig);
       return metaData;
     } catch (IOException e) {
       e.printStackTrace();
diff --git a/tsfile/src/test/resources/v3TsFile 
b/tsfile/src/test/resources/v3TsFile
new file mode 100644
index 00000000..5502286b
Binary files /dev/null and b/tsfile/src/test/resources/v3TsFile differ


Reply via email to