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 bf685d28 upgrade convertion from PlainDeviceId to StringArrayDeviceId
bf685d28 is described below

commit bf685d2800bf47a218c9696947045daa63e0eda9
Author: Tian Jiang <[email protected]>
AuthorDate: Mon Apr 15 12:27:06 2024 +0800

    upgrade convertion from PlainDeviceId to StringArrayDeviceId
---
 .../apache/tsfile/common/conf/TSFileConfig.java    |  2 +
 .../tsfile/compatibility/DeserializeConfig.java    | 15 +++----
 .../file/metadata/DeviceMetadataIndexEntry.java    |  5 +--
 .../tsfile/file/metadata/MetadataIndexNode.java    |  5 +--
 .../apache/tsfile/file/metadata/PlainDeviceID.java |  5 +--
 .../tsfile/file/metadata/StringArrayDeviceID.java  | 44 +++++++++++++++++++-
 .../tsfile/file/metadata/TsFileMetadata.java       | 10 ++++-
 .../apache/tsfile/read/TsFileSequenceReader.java   | 42 ++++++++++---------
 .../java/org/apache/tsfile/read/common/Path.java   | 45 ++++++++++++---------
 .../read/query/executor/TableQueryExecutor.java    |  2 +-
 .../java/org/apache/tsfile/write/TsFileWriter.java | 16 ++++----
 .../org/apache/tsfile/write/schema/Schema.java     |  6 +--
 .../apache/tsfile/write/writer/TsFileIOWriter.java |  4 +-
 .../tsfile/compatibility/CompatibilityTest.java    | 20 ++++-----
 .../tsfile/file/metadata/utils/TestHelper.java     |  6 +--
 .../apache/tsfile/file/metadata/utils/Utils.java   | 10 +++--
 .../org/apache/tsfile/read/GetAllDevicesTest.java  | 12 +++---
 ...easurementChunkMetadataListMapIteratorTest.java |  2 +-
 .../org/apache/tsfile/read/TsFileReaderTest.java   |  2 +-
 .../org/apache/tsfile/read/common/PathTest.java    | 47 +++++++++++-----------
 .../read/filter/IExpressionOptimizerTest.java      | 32 +++++++--------
 .../org/apache/tsfile/utils/FileGenerator.java     |  1 -
 .../java/org/apache/tsfile/utils/RecordUtils.java  |  5 +--
 .../tsfile/write/MetadataIndexConstructorTest.java |  2 -
 .../apache/tsfile/write/TsFileIOWriterTest.java    |  6 +--
 .../org/apache/tsfile/write/TsFileWriterTest.java  |  8 ++--
 .../java/org/apache/tsfile/write/WriteTest.java    |  6 +--
 .../writer/TsFileIOWriterMemoryControlTest.java    |  1 -
 28 files changed, 202 insertions(+), 159 deletions(-)

diff --git 
a/tsfile/src/main/java/org/apache/tsfile/common/conf/TSFileConfig.java 
b/tsfile/src/main/java/org/apache/tsfile/common/conf/TSFileConfig.java
index c4c720dc..3c0a69f1 100644
--- a/tsfile/src/main/java/org/apache/tsfile/common/conf/TSFileConfig.java
+++ b/tsfile/src/main/java/org/apache/tsfile/common/conf/TSFileConfig.java
@@ -73,6 +73,8 @@ public class TSFileConfig implements Serializable {
 
   /** The primitive array capacity threshold. */
   public static final int ARRAY_CAPACITY_THRESHOLD = 1000;
+  // TODO: configurable but unchangeable
+  public static final int DEFAULT_SEGMENT_NUM_FOR_TABLE_NAME = 3;
   /** Memory size threshold for flushing to disk, default value is 128MB. */
   private int groupSizeInByte = 128 * 1024 * 1024;
   /** The memory size for each series writer to pack page, default value is 
64KB. */
diff --git 
a/tsfile/src/main/java/org/apache/tsfile/compatibility/DeserializeConfig.java 
b/tsfile/src/main/java/org/apache/tsfile/compatibility/DeserializeConfig.java
index ac0b8afa..6b006b08 100644
--- 
a/tsfile/src/main/java/org/apache/tsfile/compatibility/DeserializeConfig.java
+++ 
b/tsfile/src/main/java/org/apache/tsfile/compatibility/DeserializeConfig.java
@@ -1,7 +1,5 @@
 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;
@@ -12,10 +10,13 @@ import org.apache.tsfile.file.metadata.TableSchema;
 import org.apache.tsfile.file.metadata.TsFileMetadata;
 import org.apache.tsfile.write.schema.MeasurementSchema;
 
+import java.io.IOException;
+import java.io.InputStream;
 import java.nio.ByteBuffer;
 
 public class DeserializeConfig {
-  public BufferDeserializer<TsFileMetadata> tsFileMetadataBufferDeserializer = 
TsFileMetadata::deserializeFrom;
+  public BufferDeserializer<TsFileMetadata> tsFileMetadataBufferDeserializer =
+      TsFileMetadata::deserializeFrom;
 
   public BufferDeserializer<MetadataIndexNode> 
deviceMetadataIndexNodeBufferDeserializer =
       (buffer, context) -> MetadataIndexNode.deserializeFrom(buffer, true, 
context);
@@ -54,8 +55,8 @@ public class DeserializeConfig {
     }
   }
 
-  public IMetadataIndexEntry deserializeMetadataIndexEntry(ByteBuffer buffer,
-      boolean isDeviceLevel) {
+  public IMetadataIndexEntry deserializeMetadataIndexEntry(
+      ByteBuffer buffer, boolean isDeviceLevel) {
     if (isDeviceLevel) {
       return deviceMetadataIndexEntryBufferDeserializer.deserialize(buffer, 
this);
     } else {
@@ -72,8 +73,8 @@ public class DeserializeConfig {
     }
   }
 
-  public IMetadataIndexEntry deserializeMetadataIndexEntry(InputStream stream,
-      boolean isDeviceLevel) throws IOException {
+  public IMetadataIndexEntry deserializeMetadataIndexEntry(
+      InputStream stream, boolean isDeviceLevel) throws IOException {
     if (isDeviceLevel) {
       return deviceMetadataIndexEntryStreamDeserializer.deserialize(stream, 
this);
     } else {
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 d483bc5d..bf5d7248 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
@@ -81,9 +81,8 @@ public class DeviceMetadataIndexEntry implements 
IMetadataIndexEntry {
     return new DeviceMetadataIndexEntry(device, offset);
   }
 
-  public static DeviceMetadataIndexEntry deserializeFrom(InputStream 
inputStream,
-      DeserializeConfig config)
-      throws IOException {
+  public static DeviceMetadataIndexEntry deserializeFrom(
+      InputStream inputStream, DeserializeConfig config) throws IOException {
     IDeviceID device = 
config.deviceIDStreamDeserializer.deserialize(inputStream, config);
     long offset = ReadWriteIOUtils.readLong(inputStream);
     return new DeviceMetadataIndexEntry(device, offset);
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 e55cf490..693b4ffb 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
@@ -112,9 +112,8 @@ public class MetadataIndexNode {
     return new MetadataIndexNode(children, offset, nodeType);
   }
 
-  public static MetadataIndexNode deserializeFrom(InputStream inputStream, 
boolean isDeviceLevel,
-      DeserializeConfig config)
-      throws IOException {
+  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++) {
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 61d32dcf..4a96b0e4 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
@@ -19,6 +19,7 @@
 
 package org.apache.tsfile.file.metadata;
 
+import org.apache.tsfile.common.conf.TSFileConfig;
 import org.apache.tsfile.common.constant.TsFileConstant;
 import org.apache.tsfile.utils.RamUsageEstimator;
 import org.apache.tsfile.utils.ReadWriteIOUtils;
@@ -35,8 +36,6 @@ import static 
org.apache.tsfile.utils.RamUsageEstimator.sizeOfCharArray;
 /** Using device id path as id. */
 public class PlainDeviceID implements IDeviceID {
 
-  // TODO: configurable but unchangeable
-  private static final int DEFAULT_SEGMENT_NUM_FOR_TABLE_NAME = 3;
   private static final long INSTANCE_SIZE =
       RamUsageEstimator.shallowSizeOfInstance(PlainDeviceID.class)
           + RamUsageEstimator.shallowSizeOfInstance(String.class)
@@ -140,7 +139,7 @@ public class PlainDeviceID implements IDeviceID {
       if (deviceID.charAt(i) == TsFileConstant.PATH_SEPARATOR_CHAR) {
         lastSeparatorPos = i;
         separatorNum++;
-        if (separatorNum == DEFAULT_SEGMENT_NUM_FOR_TABLE_NAME) {
+        if (separatorNum == TSFileConfig.DEFAULT_SEGMENT_NUM_FOR_TABLE_NAME) {
           break;
         }
       }
diff --git 
a/tsfile/src/main/java/org/apache/tsfile/file/metadata/StringArrayDeviceID.java 
b/tsfile/src/main/java/org/apache/tsfile/file/metadata/StringArrayDeviceID.java
index 7f13cb18..a19b26d2 100644
--- 
a/tsfile/src/main/java/org/apache/tsfile/file/metadata/StringArrayDeviceID.java
+++ 
b/tsfile/src/main/java/org/apache/tsfile/file/metadata/StringArrayDeviceID.java
@@ -64,12 +64,52 @@ public class StringArrayDeviceID implements IDeviceID {
   // or we can just use a tuple like Relational DB.
   private final String[] segments;
 
-  public StringArrayDeviceID(String[] segments) {
+  public StringArrayDeviceID(String... segments) {
     this.segments = segments;
   }
 
   public StringArrayDeviceID(String deviceIdString) {
-    this.segments = 
deviceIdString.split(TsFileConstant.PATH_SEPARATER_NO_REGEX);
+    this.segments = splitDeviceIdString(deviceIdString);
+  }
+
+  @SuppressWarnings("java:S125") // confusing comments with codes
+  private static String[] splitDeviceIdString(String deviceIdString) {
+    int lastSeparatorPos = -1;
+    int currPos = 0;
+    int segmentCnt = 1;
+    // split the string with '.', stop when finding enough segments to form a 
table name
+    // String.split is not used here to avoid unnecessary string copy
+    for (; currPos < deviceIdString.length()
+        && segmentCnt < TSFileConfig.DEFAULT_SEGMENT_NUM_FOR_TABLE_NAME + 1; 
currPos++) {
+      if (deviceIdString.charAt(currPos) == 
TsFileConstant.PATH_SEPARATOR_CHAR) {
+        lastSeparatorPos = currPos;
+        segmentCnt++;
+      }
+    }
+
+    String tableName;
+    String[] segments;
+    // assuming DEFAULT_SEGMENT_NUM_FOR_TABLE_NAME = 3
+    if (segmentCnt < TSFileConfig.DEFAULT_SEGMENT_NUM_FOR_TABLE_NAME + 1) {
+      // "root" -> {"", "root"}
+      // "root.a" -> {"root", "a"}
+      // "root.a.b" -> {"root.a", "b"}
+      tableName = segmentCnt == 1 ? "" : deviceIdString.substring(0, 
lastSeparatorPos);
+      segments = new String[2];
+      segments[0] = tableName;
+      segments[1] = deviceIdString.substring(lastSeparatorPos + 1);
+    } else {
+      // "root.a.b.c" -> {"root.a.b", "c"}
+      // "root.a.b.c.d" -> {"root.a.b", "c", "d"}
+      tableName = deviceIdString.substring(0, lastSeparatorPos);
+      String[] idSegments = deviceIdString.substring(lastSeparatorPos + 1)
+          .split(TsFileConstant.PATH_SEPARATER_NO_REGEX);
+      segments = new String[idSegments.length + 1];
+      segments[0] = tableName;
+      System.arraycopy(idSegments, 0, segments, 1, idSegments.length);
+    }
+
+    return segments;
   }
 
   public static Deserializer getDESERIALIZER() {
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 dd339f03..b38909bf 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,6 @@
 
 package org.apache.tsfile.file.metadata;
 
-import java.util.TreeMap;
 import org.apache.tsfile.compatibility.DeserializeConfig;
 import org.apache.tsfile.utils.BloomFilter;
 import org.apache.tsfile.utils.ReadWriteForEncodingUtils;
@@ -31,6 +30,7 @@ import java.nio.ByteBuffer;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.TreeMap;
 
 /** TSFileMetaData collects all metadata info and saves in its data structure. 
*/
 public class TsFileMetadata {
@@ -169,6 +169,14 @@ public class TsFileMetadata {
     return tableMetadataIndexNodeMap;
   }
 
+  public MetadataIndexNode getTableMetadataIndexNode(String tableName) {
+    MetadataIndexNode metadataIndexNode = 
tableMetadataIndexNodeMap.get(tableName);
+    if (metadataIndexNode == null) {
+      metadataIndexNode = tableMetadataIndexNodeMap.get("");
+    }
+    return metadataIndexNode;
+  }
+
   public Map<String, TableSchema> getTableSchemaMap() {
     return tableSchemaMap;
   }
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 646b284b..1e656910 100644
--- a/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReader.java
+++ b/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReader.java
@@ -409,7 +409,7 @@ public class TsFileSequenceReader implements AutoCloseable {
       IDeviceID device, String measurement, boolean ignoreNotExists) throws 
IOException {
     readFileMetadata();
     MetadataIndexNode deviceMetadataIndexNode =
-        
tsFileMetaData.getTableMetadataIndexNodeMap().get(device.getTableName());
+        tsFileMetaData.getTableMetadataIndexNode(device.getTableName());
     Pair<IMetadataIndexEntry, Long> metadataIndexPair =
         getMetadataAndEndOffsetOfDeviceNode(deviceMetadataIndexNode, device, 
true);
     if (metadataIndexPair == null) {
@@ -472,14 +472,14 @@ public class TsFileSequenceReader implements 
AutoCloseable {
       throws IOException {
     readFileMetadata();
     MetadataIndexNode deviceMetadataIndexNode =
-        
tsFileMetaData.getTableMetadataIndexNodeMap().get(path.getIDeviceID().getTableName());
+        
tsFileMetaData.getTableMetadataIndexNode(path.getIDeviceID().getTableName());
     Pair<IMetadataIndexEntry, Long> metadataIndexPair =
         getMetadataAndEndOffsetOfDeviceNode(deviceMetadataIndexNode, 
path.getIDeviceID(), true);
     if (metadataIndexPair == null) {
       if (ignoreNotExists) {
         return null;
       }
-      throw new IOException("Device {" + path.getDevice() + "} is not in 
tsFileMetaData");
+      throw new IOException("Device {" + path.getDeviceString() + "} is not in 
tsFileMetaData");
     }
     ByteBuffer buffer = readData(metadataIndexPair.left.getOffset(), 
metadataIndexPair.right);
     MetadataIndexNode metadataIndexNode;
@@ -582,7 +582,7 @@ public class TsFileSequenceReader implements AutoCloseable {
       IDeviceID device, String measurement) throws IOException {
     readFileMetadata();
     MetadataIndexNode deviceMetadataIndexNode =
-        
tsFileMetaData.getTableMetadataIndexNodeMap().get(device.getTableName());
+        tsFileMetaData.getTableMetadataIndexNode(device.getTableName());
     Pair<IMetadataIndexEntry, Long> metadataIndexPair =
         getMetadataAndEndOffsetOfDeviceNode(deviceMetadataIndexNode, device, 
true);
     if (metadataIndexPair == null) {
@@ -606,11 +606,11 @@ public class TsFileSequenceReader implements 
AutoCloseable {
   }
 
   private MetadataIndexNode getTableRootNode(String tableName) throws 
IOException {
-    MetadataIndexNode metadataIndexNode = 
tsFileMetaData.getTableMetadataIndexNodeMap()
-        .get(tableName);
+    MetadataIndexNode metadataIndexNode =
+        tsFileMetaData.getTableMetadataIndexNode(tableName);
     if (metadataIndexNode == null && fileVersion < 
TSFileConfig.VERSION_NUMBER) {
       // this file if from an old version, and all its metadata should have an 
anonymous root
-      metadataIndexNode = 
tsFileMetaData.getTableMetadataIndexNodeMap().get("");
+      metadataIndexNode = tsFileMetaData.getTableMetadataIndexNode("");
     }
     return metadataIndexNode;
   }
@@ -625,10 +625,7 @@ public class TsFileSequenceReader implements AutoCloseable 
{
   private MetadataIndexNode getDeviceRootNode(IDeviceID deviceID, 
MetadataIndexNode startNode)
       throws IOException {
     readFileMetadata();
-    startNode =
-        startNode != null
-            ? startNode
-            : getTableRootNode(deviceID.getTableName());
+    startNode = startNode != null ? startNode : 
getTableRootNode(deviceID.getTableName());
 
     MetadataIndexNode measurementMetadataIndexNode;
     ByteBuffer buffer;
@@ -846,7 +843,7 @@ public class TsFileSequenceReader implements AutoCloseable {
       }
       ByteBuffer buffer = 
readData(metadataIndexNode.getChildren().get(i).getOffset(), endOffset);
       MetadataIndexNode node =
-          
deserializeConfig.measurementMetadataIndexNodeBufferDeserializer.deserialize(
+          
deserializeConfig.deviceMetadataIndexNodeBufferDeserializer.deserialize(
               buffer, deserializeConfig);
       deviceList.addAll(getAllDevices(node));
     }
@@ -1436,7 +1433,7 @@ public class TsFileSequenceReader implements 
AutoCloseable {
   private List<TimeseriesMetadata> 
getDeviceTimeseriesMetadataWithoutChunkMetadata(IDeviceID device)
       throws IOException {
     MetadataIndexNode metadataIndexNode =
-        
tsFileMetaData.getTableMetadataIndexNodeMap().get(device.getTableName());
+        tsFileMetaData.getTableMetadataIndexNode(device.getTableName());
     Pair<IMetadataIndexEntry, Long> metadataIndexPair =
         getMetadataAndEndOffsetOfDeviceNode(metadataIndexNode, device, true);
     if (metadataIndexPair == null) {
@@ -1462,7 +1459,7 @@ public class TsFileSequenceReader implements 
AutoCloseable {
   private List<TimeseriesMetadata> getDeviceTimeseriesMetadata(IDeviceID 
device)
       throws IOException {
     MetadataIndexNode metadataIndexNode =
-        
tsFileMetaData.getTableMetadataIndexNodeMap().get(device.getTableName());
+        tsFileMetaData.getTableMetadataIndexNode(device.getTableName());
     Pair<IMetadataIndexEntry, Long> metadataIndexPair =
         getMetadataAndEndOffsetOfDeviceNode(metadataIndexNode, device, true);
     if (metadataIndexPair == null) {
@@ -1508,7 +1505,7 @@ public class TsFileSequenceReader implements 
AutoCloseable {
             metadataIndex.getChildIndexEntry(deviceID, false);
         ByteBuffer buffer = readData(childIndexEntry.left.getOffset(), 
childIndexEntry.right);
         return getMetadataAndEndOffsetOfDeviceNode(
-            
deserializeConfig.measurementMetadataIndexNodeBufferDeserializer.deserialize(
+            
deserializeConfig.deviceMetadataIndexNodeBufferDeserializer.deserialize(
                 buffer, deserializeConfig),
             deviceID,
             exactSearch);
@@ -2307,13 +2304,12 @@ public class TsFileSequenceReader implements 
AutoCloseable {
   /**
    * get ChunkMetaDatas of given path, and throw exception if path not exists
    *
-   * @param path timeseries path
    * @return List of ChunkMetaData
    */
-  public List<ChunkMetadata> getChunkMetadataList(Path path, boolean 
ignoreNotExists)
+  public List<ChunkMetadata> getChunkMetadataList(IDeviceID deviceID, String 
measurement, boolean ignoreNotExists)
       throws IOException {
     TimeseriesMetadata timeseriesMetaData =
-        readTimeseriesMetadata(path.getIDeviceID(), path.getMeasurement(), 
ignoreNotExists);
+        readTimeseriesMetadata(deviceID, measurement, ignoreNotExists);
     if (timeseriesMetaData == null) {
       return Collections.emptyList();
     }
@@ -2322,6 +2318,12 @@ public class TsFileSequenceReader implements 
AutoCloseable {
     return chunkMetadataList;
   }
 
+  @Deprecated
+  public List<ChunkMetadata> getChunkMetadataList(Path path, boolean 
ignoreNotExists)
+      throws IOException {
+    return getChunkMetadataList(path.getIDeviceID(), path.getMeasurement(), 
ignoreNotExists);
+  }
+
   // This method is only used for TsFile
   public List<IChunkMetadata> getIChunkMetadataList(Path path) throws 
IOException {
     ITimeSeriesMetadata timeseriesMetaData = readITimeseriesMetadata(path, 
true);
@@ -2374,7 +2376,7 @@ public class TsFileSequenceReader implements 
AutoCloseable {
   public List<AlignedChunkMetadata> getAlignedChunkMetadata(IDeviceID device) 
throws IOException {
     readFileMetadata();
     MetadataIndexNode deviceMetadataIndexNode =
-        
tsFileMetaData.getTableMetadataIndexNodeMap().get(device.getTableName());
+        tsFileMetaData.getTableMetadataIndexNode(device.getTableName());
     Pair<IMetadataIndexEntry, Long> metadataIndexPair =
         getMetadataAndEndOffsetOfDeviceNode(deviceMetadataIndexNode, device, 
true);
     if (metadataIndexPair == null) {
@@ -2619,7 +2621,7 @@ public class TsFileSequenceReader implements 
AutoCloseable {
     readFileMetadata();
 
     MetadataIndexNode metadataIndexNode =
-        
tsFileMetaData.getTableMetadataIndexNodeMap().get(device.getTableName());
+        tsFileMetaData.getTableMetadataIndexNode(device.getTableName());
     Pair<IMetadataIndexEntry, Long> metadataIndexPair =
         getMetadataAndEndOffsetOfDeviceNode(metadataIndexNode, device, true);
 
diff --git a/tsfile/src/main/java/org/apache/tsfile/read/common/Path.java 
b/tsfile/src/main/java/org/apache/tsfile/read/common/Path.java
index 2d6bc9d2..a188c539 100644
--- a/tsfile/src/main/java/org/apache/tsfile/read/common/Path.java
+++ b/tsfile/src/main/java/org/apache/tsfile/read/common/Path.java
@@ -19,9 +19,12 @@
 
 package org.apache.tsfile.read.common;
 
+import org.apache.tsfile.common.conf.TSFileConfig;
 import org.apache.tsfile.common.constant.TsFileConstant;
 import org.apache.tsfile.exception.PathParseException;
 import org.apache.tsfile.file.metadata.IDeviceID;
+import org.apache.tsfile.file.metadata.IDeviceID.Deserializer;
+import org.apache.tsfile.file.metadata.IDeviceID.Factory;
 import org.apache.tsfile.file.metadata.StringArrayDeviceID;
 import org.apache.tsfile.read.common.parser.PathNodesGenerator;
 import org.apache.tsfile.utils.PublicBAOS;
@@ -46,7 +49,7 @@ public class Path implements Serializable, Comparable<Path> {
 
   private static final long serialVersionUID = 3405277066329298200L;
   private String measurement;
-  protected String device;
+  protected IDeviceID device;
   protected String fullPath;
   private static final String ILLEGAL_PATH_ARGUMENT = "Path parameter is null";
 
@@ -79,26 +82,28 @@ public class Path implements Serializable, Comparable<Path> 
{
     if (!needSplit) {
       // no split, we don't use antlr to check here.
       fullPath = pathSc;
-      device = pathSc;
+      device = Factory.DEFAULT_FACTORY.create(pathSc);
     } else {
       if (pathSc.length() > 0) {
         String[] nodes = PathNodesGenerator.splitPathToNodes(pathSc);
-        device = "";
+        device = Factory.DEFAULT_FACTORY.create("");
         if (nodes.length > 1) {
-          device = transformNodesToString(nodes, nodes.length - 1);
+          device = 
Factory.DEFAULT_FACTORY.create(transformNodesToString(nodes, nodes.length - 1));
         }
         measurement = nodes[nodes.length - 1];
-        fullPath = transformNodesToString(nodes, nodes.length);
+        fullPath = this.device.toString() + TsFileConstant.PATH_SEPARATOR + 
measurement;
       } else {
         fullPath = pathSc;
-        device = "";
+        device = Factory.DEFAULT_FACTORY.create("");
         measurement = pathSc;
       }
     }
   }
 
   public Path(IDeviceID device, String measurement, boolean needCheck) {
-    this(device.toString(), measurement, needCheck);
+    this.device = device;
+    this.measurement = measurement;
+    this.fullPath = this.device.toString() + TsFileConstant.PATH_SEPARATOR + 
measurement;
   }
 
   /**
@@ -114,7 +119,7 @@ public class Path implements Serializable, Comparable<Path> 
{
     }
     if (!needCheck) {
       this.measurement = measurement;
-      this.device = device;
+      this.device = Factory.DEFAULT_FACTORY.create(device);
       this.fullPath = device + TsFileConstant.PATH_SEPARATOR + measurement;
       return;
     }
@@ -122,22 +127,22 @@ public class Path implements Serializable, 
Comparable<Path> {
     if (!StringUtils.isEmpty(device) && !StringUtils.isEmpty(measurement)) {
       String path = device + TsFileConstant.PATH_SEPARATOR + measurement;
       String[] nodes = PathNodesGenerator.splitPathToNodes(path);
-      this.device = transformNodesToString(nodes, nodes.length - 1);
+      this.device = 
Factory.DEFAULT_FACTORY.create(transformNodesToString(nodes, nodes.length - 1));
       this.measurement = nodes[nodes.length - 1];
-      this.fullPath = transformNodesToString(nodes, nodes.length);
+      this.fullPath = this.device.toString() + TsFileConstant.PATH_SEPARATOR + 
measurement;
     } else if (!StringUtils.isEmpty(device)) {
       String[] deviceNodes = PathNodesGenerator.splitPathToNodes(device);
-      this.device = transformNodesToString(deviceNodes, deviceNodes.length);
+      this.device = 
Factory.DEFAULT_FACTORY.create(transformNodesToString(deviceNodes, 
deviceNodes.length));
       this.measurement = measurement;
       // for aligned path, sensor name for time column is ""
       this.fullPath = device + TsFileConstant.PATH_SEPARATOR + measurement;
     } else if (!StringUtils.isEmpty(measurement)) {
       String[] measurementNodes = 
PathNodesGenerator.splitPathToNodes(measurement);
       this.measurement = transformNodesToString(measurementNodes, 
measurementNodes.length);
-      this.device = device;
+      this.device = Factory.DEFAULT_FACTORY.create(device);
       this.fullPath = measurement;
     } else {
-      this.device = device;
+      this.device = Factory.DEFAULT_FACTORY.create(device);
       this.measurement = measurement;
       this.fullPath = "";
     }
@@ -147,12 +152,12 @@ public class Path implements Serializable, 
Comparable<Path> {
     return fullPath;
   }
 
-  public String getDevice() {
-    return device;
+  public String getDeviceString() {
+    return device.toString();
   }
 
   public IDeviceID getIDeviceID() {
-    return new 
StringArrayDeviceID(getDevice().split(TsFileConstant.PATH_SEPARATER_NO_REGEX));
+    return device;
   }
 
   public String getMeasurement() {
@@ -227,7 +232,7 @@ public class Path implements Serializable, Comparable<Path> 
{
       ReadWriteIOUtils.write((byte) 0, byteBuffer);
     } else {
       ReadWriteIOUtils.write((byte) 1, byteBuffer);
-      ReadWriteIOUtils.write(device, byteBuffer);
+      device.serialize(byteBuffer);
     }
     if (fullPath == null) {
       ReadWriteIOUtils.write((byte) 0, byteBuffer);
@@ -248,7 +253,7 @@ public class Path implements Serializable, Comparable<Path> 
{
       ReadWriteIOUtils.write((byte) 0, stream);
     } else {
       ReadWriteIOUtils.write((byte) 1, stream);
-      ReadWriteIOUtils.write(device, stream);
+      device.serialize(stream);
     }
     if (fullPath == null) {
       ReadWriteIOUtils.write((byte) 0, stream);
@@ -269,7 +274,7 @@ public class Path implements Serializable, Comparable<Path> 
{
       ReadWriteIOUtils.write((byte) 0, stream);
     } else {
       ReadWriteIOUtils.write((byte) 1, stream);
-      ReadWriteIOUtils.write(device, stream);
+      device.serialize(stream);
     }
     if (fullPath == null) {
       ReadWriteIOUtils.write((byte) 0, stream);
@@ -284,7 +289,7 @@ public class Path implements Serializable, Comparable<Path> 
{
     byte isNull = ReadWriteIOUtils.readByte(byteBuffer);
     path.measurement = isNull == 0 ? null : 
ReadWriteIOUtils.readString(byteBuffer);
     isNull = ReadWriteIOUtils.readByte(byteBuffer);
-    path.device = isNull == 0 ? null : ReadWriteIOUtils.readString(byteBuffer);
+    path.device = isNull == 0 ? null : 
Deserializer.DEFAULT_DESERIALIZER.deserializeFrom(byteBuffer);
     isNull = ReadWriteIOUtils.readByte(byteBuffer);
     path.fullPath = isNull == 0 ? null : 
ReadWriteIOUtils.readString(byteBuffer);
     return path;
diff --git 
a/tsfile/src/main/java/org/apache/tsfile/read/query/executor/TableQueryExecutor.java
 
b/tsfile/src/main/java/org/apache/tsfile/read/query/executor/TableQueryExecutor.java
index da1fe0c7..06fc6c0c 100644
--- 
a/tsfile/src/main/java/org/apache/tsfile/read/query/executor/TableQueryExecutor.java
+++ 
b/tsfile/src/main/java/org/apache/tsfile/read/query/executor/TableQueryExecutor.java
@@ -47,7 +47,7 @@ public class TableQueryExecutor {
       ExpressionTree measurementFilter)
       throws ReadProcessException {
     TsFileMetadata fileMetadata = metadataQuerier.getWholeFileMetadata();
-    MetadataIndexNode tableRoot = 
fileMetadata.getTableMetadataIndexNodeMap().get(tableName);
+    MetadataIndexNode tableRoot = 
fileMetadata.getTableMetadataIndexNode(tableName);
     TableSchema tableSchema = fileMetadata.getTableSchemaMap().get(tableName);
     if (tableRoot == null || tableSchema == null) {
       return new EmptyTsBlockReader();
diff --git a/tsfile/src/main/java/org/apache/tsfile/write/TsFileWriter.java 
b/tsfile/src/main/java/org/apache/tsfile/write/TsFileWriter.java
index bde0530f..6b4ef019 100644
--- a/tsfile/src/main/java/org/apache/tsfile/write/TsFileWriter.java
+++ b/tsfile/src/main/java/org/apache/tsfile/write/TsFileWriter.java
@@ -168,7 +168,7 @@ public class TsFileWriter implements AutoCloseable {
         IMeasurementSchema measurementSchema = entry.getValue();
         if (measurementSchema instanceof VectorMeasurementSchema) {
           final IDeviceID deviceID =
-              
IDeviceID.Factory.DEFAULT_FACTORY.create(entry.getKey().getDevice());
+              
IDeviceID.Factory.DEFAULT_FACTORY.create(entry.getKey().getDeviceString());
           MeasurementGroup group =
               measurementGroupMap.getOrDefault(deviceID, new 
MeasurementGroup(true));
           List<String> measurementList = 
measurementSchema.getSubMeasurementsList();
@@ -185,7 +185,7 @@ public class TsFileWriter implements AutoCloseable {
           measurementGroupMap.put(deviceID, group);
         } else {
           final IDeviceID deviceID =
-              
IDeviceID.Factory.DEFAULT_FACTORY.create(entry.getKey().getDevice());
+              
IDeviceID.Factory.DEFAULT_FACTORY.create(entry.getKey().getDeviceString());
           MeasurementGroup group =
               measurementGroupMap.getOrDefault(deviceID, new 
MeasurementGroup(false));
           group
@@ -238,7 +238,7 @@ public class TsFileWriter implements AutoCloseable {
   public void registerTimeseries(Path devicePath, MeasurementSchema 
measurementSchema)
       throws WriteProcessException {
     registerTimeseries(
-        IDeviceID.Factory.DEFAULT_FACTORY.create(devicePath.getDevice()), 
measurementSchema);
+        
IDeviceID.Factory.DEFAULT_FACTORY.create(devicePath.getDeviceString()), 
measurementSchema);
   }
 
   /** Register nonAligned timeseries by single. */
@@ -273,7 +273,7 @@ public class TsFileWriter implements AutoCloseable {
     for (MeasurementSchema schema : measurementSchemas) {
       try {
         registerTimeseries(
-            IDeviceID.Factory.DEFAULT_FACTORY.create(devicePath.getDevice()), 
schema);
+            
IDeviceID.Factory.DEFAULT_FACTORY.create(devicePath.getDeviceString()), schema);
       } catch (WriteProcessException e) {
         LOG.warn(e.getMessage());
       }
@@ -283,7 +283,7 @@ public class TsFileWriter implements AutoCloseable {
   public void registerAlignedTimeseries(Path devicePath, 
List<MeasurementSchema> measurementSchemas)
       throws WriteProcessException {
     registerAlignedTimeseries(
-        IDeviceID.Factory.DEFAULT_FACTORY.create(devicePath.getDevice()), 
measurementSchemas);
+        
IDeviceID.Factory.DEFAULT_FACTORY.create(devicePath.getDeviceString()), 
measurementSchemas);
   }
   /**
    * Register aligned timeseries. Once the device is registered for aligned 
timeseries, it cannot be
@@ -424,8 +424,7 @@ public class TsFileWriter implements AutoCloseable {
           .getMeasurementSchemaMap()
           .containsKey(measurementSchema.getMeasurementId())) {
         if (isAligned) {
-          throw new NoMeasurementException(
-                  measurementSchema.getMeasurementId());
+          throw new 
NoMeasurementException(measurementSchema.getMeasurementId());
         } else {
           measurementSchemas.remove(measurementSchema);
         }
@@ -446,8 +445,7 @@ public class TsFileWriter implements AutoCloseable {
     for (DataPoint dataPoint : dataPoints) {
       if 
(!measurementGroup.getMeasurementSchemaMap().containsKey(dataPoint.getMeasurementId()))
 {
         if (isAligned) {
-          throw new NoMeasurementException(
-                  dataPoint.getMeasurementId());
+          throw new NoMeasurementException(dataPoint.getMeasurementId());
         } else {
           LOG.warn(
               "Ignore nonAligned measurement "
diff --git a/tsfile/src/main/java/org/apache/tsfile/write/schema/Schema.java 
b/tsfile/src/main/java/org/apache/tsfile/write/schema/Schema.java
index 9aeb409d..7f09ce77 100644
--- a/tsfile/src/main/java/org/apache/tsfile/write/schema/Schema.java
+++ b/tsfile/src/main/java/org/apache/tsfile/write/schema/Schema.java
@@ -58,7 +58,7 @@ public class Schema implements Serializable {
   @Deprecated
   public void registerTimeseries(Path devicePath, MeasurementSchema 
measurementSchema) {
     registerTimeseries(
-        IDeviceID.Factory.DEFAULT_FACTORY.create(devicePath.getDevice()), 
measurementSchema);
+        
IDeviceID.Factory.DEFAULT_FACTORY.create(devicePath.getDeviceString()), 
measurementSchema);
   }
   // This method can only register nonAligned timeseries.
   public void registerTimeseries(IDeviceID deviceID, MeasurementSchema 
measurementSchema) {
@@ -71,7 +71,7 @@ public class Schema implements Serializable {
   @Deprecated
   public void registerMeasurementGroup(Path devicePath, MeasurementGroup 
measurementGroup) {
     this.registeredTimeseries.put(
-        IDeviceID.Factory.DEFAULT_FACTORY.create(devicePath.getDevice()), 
measurementGroup);
+        
IDeviceID.Factory.DEFAULT_FACTORY.create(devicePath.getDeviceString()), 
measurementGroup);
   }
 
   public void registerMeasurementGroup(IDeviceID deviceID, MeasurementGroup 
measurementGroup) {
@@ -118,7 +118,7 @@ public class Schema implements Serializable {
   @Deprecated
   public MeasurementGroup getSeriesSchema(Path devicePath) {
     return registeredTimeseries.get(
-        IDeviceID.Factory.DEFAULT_FACTORY.create(devicePath.getDevice()));
+        
IDeviceID.Factory.DEFAULT_FACTORY.create(devicePath.getDeviceString()));
   }
 
   public MeasurementGroup getSeriesSchema(IDeviceID devicePath) {
diff --git 
a/tsfile/src/main/java/org/apache/tsfile/write/writer/TsFileIOWriter.java 
b/tsfile/src/main/java/org/apache/tsfile/write/writer/TsFileIOWriter.java
index 8f107369..c7863f3b 100644
--- a/tsfile/src/main/java/org/apache/tsfile/write/writer/TsFileIOWriter.java
+++ b/tsfile/src/main/java/org/apache/tsfile/write/writer/TsFileIOWriter.java
@@ -686,12 +686,12 @@ public class TsFileIOWriter implements AutoCloseable {
     int writtenSize = 0;
     // [DeviceId] measurementId datatype size chunkMetadataBuffer
     if (lastSerializePath == null
-        || !seriesPath.getDevice().equals(lastSerializePath.getDevice())) {
+        || 
!seriesPath.getDeviceString().equals(lastSerializePath.getDeviceString())) {
       // mark the end position of last device
       endPosInCMTForDevice.add(tempOutput.getPosition());
       // serialize the device
       // for each device, we only serialize it once, in order to save io
-      writtenSize += ReadWriteIOUtils.write(seriesPath.getDevice(), 
tempOutput.wrapAsStream());
+      writtenSize += ReadWriteIOUtils.write(seriesPath.getDeviceString(), 
tempOutput.wrapAsStream());
     }
     if (isNewPath && !iChunkMetadataList.isEmpty()) {
       // serialize the public info of this measurement
diff --git 
a/tsfile/src/test/java/org/apache/tsfile/compatibility/CompatibilityTest.java 
b/tsfile/src/test/java/org/apache/tsfile/compatibility/CompatibilityTest.java
index c5fc613d..33016b3d 100644
--- 
a/tsfile/src/test/java/org/apache/tsfile/compatibility/CompatibilityTest.java
+++ 
b/tsfile/src/test/java/org/apache/tsfile/compatibility/CompatibilityTest.java
@@ -1,26 +1,26 @@
 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;
 
+import java.io.File;
+import java.io.IOException;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
 public class CompatibilityTest {
 
-  private String fileName = "target" + File.separator + "test-classes" + 
File.separator +
-      "v3TsFile";
+  private String fileName =
+      "target" + File.separator + "test-classes" + File.separator + "v3TsFile";
 
-  /**
-   * The file is generated by the TsFileWriterTest version 3.
-   */
+  /** The file is generated by the TsFileWriterTest version 3. */
   @Test
   public void testReadV3() {
     readOneRow();
diff --git 
a/tsfile/src/test/java/org/apache/tsfile/file/metadata/utils/TestHelper.java 
b/tsfile/src/test/java/org/apache/tsfile/file/metadata/utils/TestHelper.java
index 8506f2fd..c9ebdec9 100644
--- a/tsfile/src/test/java/org/apache/tsfile/file/metadata/utils/TestHelper.java
+++ b/tsfile/src/test/java/org/apache/tsfile/file/metadata/utils/TestHelper.java
@@ -22,9 +22,7 @@ import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.file.header.PageHeader;
 import org.apache.tsfile.file.header.PageHeaderTest;
 import org.apache.tsfile.file.metadata.DeviceMetadataIndexEntry;
-import org.apache.tsfile.file.metadata.IDeviceID;
 import org.apache.tsfile.file.metadata.IDeviceID.Factory;
-import org.apache.tsfile.file.metadata.MeasurementMetadataIndexEntry;
 import org.apache.tsfile.file.metadata.MetadataIndexNode;
 import org.apache.tsfile.file.metadata.TimeseriesMetadata;
 import org.apache.tsfile.file.metadata.TsFileMetadata;
@@ -52,8 +50,8 @@ public class TestHelper {
   private static MetadataIndexNode generateMetaDataIndex() {
     MetadataIndexNode metaDataIndex = new 
MetadataIndexNode(MetadataIndexNodeType.LEAF_DEVICE);
     for (int i = 0; i < 5; i++) {
-      metaDataIndex.addEntry(new 
DeviceMetadataIndexEntry(Factory.DEFAULT_FACTORY.create("d" + i),
-          (long) i * 5));
+      metaDataIndex.addEntry(
+          new DeviceMetadataIndexEntry(Factory.DEFAULT_FACTORY.create("d" + 
i), (long) i * 5));
     }
     return metaDataIndex;
   }
diff --git 
a/tsfile/src/test/java/org/apache/tsfile/file/metadata/utils/Utils.java 
b/tsfile/src/test/java/org/apache/tsfile/file/metadata/utils/Utils.java
index 81fdd718..91c2cbf2 100644
--- a/tsfile/src/test/java/org/apache/tsfile/file/metadata/utils/Utils.java
+++ b/tsfile/src/test/java/org/apache/tsfile/file/metadata/utils/Utils.java
@@ -51,11 +51,13 @@ public class Utils {
   public static boolean isFileMetaDataEqual(TsFileMetadata metadata1, 
TsFileMetadata metadata2) {
     if (Utils.isTwoObjectsNotNULL(metadata1, metadata2, "File MetaData")) {
       if (Utils.isTwoObjectsNotNULL(
-          
metadata1.getTableMetadataIndexNodeMap().get(TestHelper.TEST_TABLE_NAME),
-          
metadata2.getTableMetadataIndexNodeMap().get(TestHelper.TEST_TABLE_NAME),
+          metadata1.getTableMetadataIndexNode(TestHelper.TEST_TABLE_NAME),
+          metadata2.getTableMetadataIndexNode(TestHelper.TEST_TABLE_NAME),
           "Metadata " + "Index")) {
-        MetadataIndexNode metaDataIndex1 = 
metadata1.getTableMetadataIndexNodeMap().get(TestHelper.TEST_TABLE_NAME);
-        MetadataIndexNode metaDataIndex2 = 
metadata2.getTableMetadataIndexNodeMap().get(TestHelper.TEST_TABLE_NAME);
+        MetadataIndexNode metaDataIndex1 =
+            metadata1.getTableMetadataIndexNode(TestHelper.TEST_TABLE_NAME);
+        MetadataIndexNode metaDataIndex2 =
+            metadata2.getTableMetadataIndexNode(TestHelper.TEST_TABLE_NAME);
         return metaDataIndex1.getChildren().size() == 
metaDataIndex2.getChildren().size();
       }
     }
diff --git a/tsfile/src/test/java/org/apache/tsfile/read/GetAllDevicesTest.java 
b/tsfile/src/test/java/org/apache/tsfile/read/GetAllDevicesTest.java
index f979fcdc..aef1129b 100644
--- a/tsfile/src/test/java/org/apache/tsfile/read/GetAllDevicesTest.java
+++ b/tsfile/src/test/java/org/apache/tsfile/read/GetAllDevicesTest.java
@@ -19,7 +19,6 @@
 
 package org.apache.tsfile.read;
 
-import java.util.ArrayList;
 import org.apache.tsfile.common.conf.TSFileConfig;
 import org.apache.tsfile.common.conf.TSFileDescriptor;
 import org.apache.tsfile.file.metadata.IDeviceID;
@@ -31,6 +30,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.List;
 
 public class GetAllDevicesTest {
@@ -74,21 +74,19 @@ public class GetAllDevicesTest {
   public void testGetAllDevices(int deviceNum, int measurementNum) throws 
IOException {
     FileGenerator.generateFile(10000, deviceNum, measurementNum);
 
-
     try (TsFileSequenceReader fileReader = new 
TsFileSequenceReader(FILE_PATH)) {
       List<IDeviceID> sortedDeviceIds = new ArrayList<>();
       for (int i = 0; i < deviceNum; i++) {
-        sortedDeviceIds.add(IDeviceID.Factory.DEFAULT_FACTORY.create(
-            "d" + FileGenerator.generateIndexString(i, deviceNum)));
+        sortedDeviceIds.add(
+            IDeviceID.Factory.DEFAULT_FACTORY.create(
+                "d" + FileGenerator.generateIndexString(i, deviceNum)));
       }
       sortedDeviceIds.sort(null);
 
       List<IDeviceID> devices = fileReader.getAllDevices();
       Assert.assertEquals(deviceNum, devices.size());
       for (int i = 0; i < deviceNum; i++) {
-        Assert.assertEquals(
-            sortedDeviceIds.get(i),
-            devices.get(i));
+        Assert.assertEquals(sortedDeviceIds.get(i), devices.get(i));
       }
 
       FileGenerator.after();
diff --git 
a/tsfile/src/test/java/org/apache/tsfile/read/MeasurementChunkMetadataListMapIteratorTest.java
 
b/tsfile/src/test/java/org/apache/tsfile/read/MeasurementChunkMetadataListMapIteratorTest.java
index d0bcd9c8..5e6f37b6 100644
--- 
a/tsfile/src/test/java/org/apache/tsfile/read/MeasurementChunkMetadataListMapIteratorTest.java
+++ 
b/tsfile/src/test/java/org/apache/tsfile/read/MeasurementChunkMetadataListMapIteratorTest.java
@@ -134,7 +134,7 @@ public class MeasurementChunkMetadataListMapIteratorTest {
           expectedDeviceMeasurementChunkMetadataListMap
               .computeIfAbsent(device, d -> new HashMap<>())
               .computeIfAbsent(measurement, m -> new ArrayList<>())
-              .addAll(fileReader.getChunkMetadataList(new Path(device, 
measurement, true)));
+              .addAll(fileReader.getChunkMetadataList(device, measurement, 
false));
         }
       }
 
diff --git a/tsfile/src/test/java/org/apache/tsfile/read/TsFileReaderTest.java 
b/tsfile/src/test/java/org/apache/tsfile/read/TsFileReaderTest.java
index f7cb6e44..1ff19d7d 100644
--- a/tsfile/src/test/java/org/apache/tsfile/read/TsFileReaderTest.java
+++ b/tsfile/src/test/java/org/apache/tsfile/read/TsFileReaderTest.java
@@ -81,7 +81,7 @@ public class TsFileReaderTest {
 
     Path path = new Path("t", "id", true);
     tsFileWriter.registerTimeseries(
-        new Path(path.getDevice()),
+        new Path(path.getDeviceString()),
         new MeasurementSchema("id", TSDataType.INT32, TSEncoding.PLAIN, 
CompressionType.LZ4));
 
     for (int i = 0; i < 11000000; i++) {
diff --git a/tsfile/src/test/java/org/apache/tsfile/read/common/PathTest.java 
b/tsfile/src/test/java/org/apache/tsfile/read/common/PathTest.java
index 8df52416..4553127c 100644
--- a/tsfile/src/test/java/org/apache/tsfile/read/common/PathTest.java
+++ b/tsfile/src/test/java/org/apache/tsfile/read/common/PathTest.java
@@ -19,6 +19,7 @@
 package org.apache.tsfile.read.common;
 
 import org.apache.tsfile.exception.PathParseException;
+import org.apache.tsfile.file.metadata.StringArrayDeviceID;
 import org.apache.tsfile.read.common.parser.PathVisitor;
 
 import org.junit.Assert;
@@ -31,102 +32,102 @@ public class PathTest {
   public void testLegalPath() {
     // empty path
     Path a = new Path("", true);
-    Assert.assertEquals("", a.getDevice());
+    Assert.assertEquals(new StringArrayDeviceID("", ""), a.getIDeviceID());
     Assert.assertEquals("", a.getMeasurement());
 
     // empty device
     Path b = new Path("s1", true);
     Assert.assertEquals("s1", b.getMeasurement());
-    Assert.assertEquals("", b.getDevice());
+    Assert.assertEquals(new StringArrayDeviceID("", ""), b.getIDeviceID());
 
     // normal node
     Path c = new Path("root.sg.a", true);
-    Assert.assertEquals("root.sg", c.getDevice());
+    Assert.assertEquals("root.sg", c.getDeviceString());
     Assert.assertEquals("a", c.getMeasurement());
 
     // quoted node
     Path d = new Path("root.sg.`a.b`", true);
-    Assert.assertEquals("root.sg", d.getDevice());
+    Assert.assertEquals("root.sg", d.getDeviceString());
     Assert.assertEquals("`a.b`", d.getMeasurement());
 
     Path e = new Path("root.sg.`a.``b`", true);
-    Assert.assertEquals("root.sg", e.getDevice());
+    Assert.assertEquals("root.sg", e.getDeviceString());
     Assert.assertEquals("`a.``b`", e.getMeasurement());
 
     Path f = new Path("root.`sg\"`.`a.``b`", true);
-    Assert.assertEquals("root.`sg\"`", f.getDevice());
+    Assert.assertEquals("root.`sg\"`", f.getDeviceString());
     Assert.assertEquals("`a.``b`", f.getMeasurement());
 
     Path g = new Path("root.sg.`a.b\\\\`", true);
-    Assert.assertEquals("root.sg", g.getDevice());
+    Assert.assertEquals("root.sg", g.getDeviceString());
     Assert.assertEquals("`a.b\\\\`", g.getMeasurement());
 
     // quoted node of digits
     Path h = new Path("root.sg.`111`", true);
-    Assert.assertEquals("root.sg", h.getDevice());
+    Assert.assertEquals("root.sg", h.getDeviceString());
     Assert.assertEquals("`111`", h.getMeasurement());
 
     // quoted node of key word
     Path i = new Path("root.sg.`select`", true);
-    Assert.assertEquals("root.sg", i.getDevice());
+    Assert.assertEquals("root.sg", i.getDeviceString());
     Assert.assertEquals("select", i.getMeasurement());
 
     // wildcard
     Path j = new Path("root.sg.`a*b`", true);
-    Assert.assertEquals("root.sg", j.getDevice());
+    Assert.assertEquals("root.sg", j.getDeviceString());
     Assert.assertEquals("`a*b`", j.getMeasurement());
 
     Path k = new Path("root.sg.*", true);
-    Assert.assertEquals("root.sg", k.getDevice());
+    Assert.assertEquals("root.sg", k.getDeviceString());
     Assert.assertEquals("*", k.getMeasurement());
 
     Path l = new Path("root.sg.**", true);
-    Assert.assertEquals("root.sg", l.getDevice());
+    Assert.assertEquals("root.sg", l.getDeviceString());
     Assert.assertEquals("**", l.getMeasurement());
 
     // raw key word
     Path m = new Path("root.sg.select", true);
-    Assert.assertEquals("root.sg", m.getDevice());
+    Assert.assertEquals("root.sg", m.getDeviceString());
     Assert.assertEquals("select", m.getMeasurement());
 
     Path n = new Path("root.sg.device", true);
-    Assert.assertEquals("root.sg", n.getDevice());
+    Assert.assertEquals("root.sg", n.getDeviceString());
     Assert.assertEquals("device", n.getMeasurement());
 
     Path o = new Path("root.sg.drop_trigger", true);
-    Assert.assertEquals("root.sg", o.getDevice());
+    Assert.assertEquals("root.sg", o.getDeviceString());
     Assert.assertEquals("drop_trigger", o.getMeasurement());
 
     Path p = new Path("root.sg.and", true);
-    Assert.assertEquals("root.sg", p.getDevice());
+    Assert.assertEquals("root.sg", p.getDeviceString());
     Assert.assertEquals("and", p.getMeasurement());
 
     p = new Path("root.sg.or", true);
-    Assert.assertEquals("root.sg", p.getDevice());
+    Assert.assertEquals("root.sg", p.getDeviceString());
     Assert.assertEquals("or", p.getMeasurement());
 
     p = new Path("root.sg.not", true);
-    Assert.assertEquals("root.sg", p.getDevice());
+    Assert.assertEquals("root.sg", p.getDeviceString());
     Assert.assertEquals("not", p.getMeasurement());
 
     p = new Path("root.sg.null", true);
-    Assert.assertEquals("root.sg", p.getDevice());
+    Assert.assertEquals("root.sg", p.getDeviceString());
     Assert.assertEquals("null", p.getMeasurement());
 
     p = new Path("root.sg.contains", true);
-    Assert.assertEquals("root.sg", p.getDevice());
+    Assert.assertEquals("root.sg", p.getDeviceString());
     Assert.assertEquals("contains", p.getMeasurement());
 
     p = new Path("root.sg.`0000`", true);
-    Assert.assertEquals("root.sg", p.getDevice());
+    Assert.assertEquals("root.sg", p.getDeviceString());
     Assert.assertEquals("`0000`", p.getMeasurement());
 
     p = new Path("root.sg.`0e38`", true);
-    Assert.assertEquals("root.sg", p.getDevice());
+    Assert.assertEquals("root.sg", p.getDeviceString());
     Assert.assertEquals("`0e38`", p.getMeasurement());
 
     p = new Path("root.sg.`00.12`", true);
-    Assert.assertEquals("root.sg", p.getDevice());
+    Assert.assertEquals("root.sg", p.getDeviceString());
     Assert.assertEquals("`00.12`", p.getMeasurement());
   }
 
diff --git 
a/tsfile/src/test/java/org/apache/tsfile/read/filter/IExpressionOptimizerTest.java
 
b/tsfile/src/test/java/org/apache/tsfile/read/filter/IExpressionOptimizerTest.java
index cadc7c6c..72408dc8 100644
--- 
a/tsfile/src/test/java/org/apache/tsfile/read/filter/IExpressionOptimizerTest.java
+++ 
b/tsfile/src/test/java/org/apache/tsfile/read/filter/IExpressionOptimizerTest.java
@@ -128,8 +128,8 @@ public class IExpressionOptimizerTest {
             BinaryExpression.or(singleSeriesExp1, singleSeriesExp2), 
globalTimeFilter);
     try {
       String rightRet =
-          "[[d2.s1:((measurements[0] > 100 || measurements[0] < 50) && time < 
14001234)] "
-              + "|| [d1.s2:((measurements[0] > 100.5 || measurements[0] < 
50.6) "
+          "[[.d2.s1:((measurements[0] > 100 || measurements[0] < 50) && time < 
14001234)] "
+              + "|| [.d1.s2:((measurements[0] > 100.5 || measurements[0] < 
50.6) "
               + "&& time < 14001234)]]";
       IExpression regularFilter = expressionOptimizer.optimize(expression, 
selectedSeries);
       Assert.assertEquals(rightRet, regularFilter.toString());
@@ -155,9 +155,9 @@ public class IExpressionOptimizerTest {
             BinaryExpression.and(singleSeriesExp1, globalTimeFilter), 
globalTimeFilter2);
     try {
       String rightRet =
-          "[[[[d1.s1:time > 1] || "
-              + "[d2.s1:(time > 1 || ((measurements[0] > 100 || 
measurements[0] < 50) "
-              + "&& time < 14001234))]] || [d1.s2:time > 1]] || [d2.s2:time > 
1]]";
+          "[[[[.d1.s1:time > 1] || "
+              + "[.d2.s1:(time > 1 || ((measurements[0] > 100 || 
measurements[0] < 50) "
+              + "&& time < 14001234))]] || [.d1.s2:time > 1]] || [.d2.s2:time 
> 1]]";
       IExpression regularFilter = expressionOptimizer.optimize(expression, 
selectedSeries);
       Assert.assertEquals(rightRet, regularFilter.toString());
     } catch (QueryFilterOptimizationException e) {
@@ -178,7 +178,7 @@ public class IExpressionOptimizerTest {
 
     try {
       String rightRet =
-          "[d2.s1:((measurements[0] > 100 || measurements[0] < 50) && time < 
14001234)]";
+          "[.d2.s1:((measurements[0] > 100 || measurements[0] < 50) && time < 
14001234)]";
       IExpression regularFilter = expressionOptimizer.optimize(expression, 
selectedSeries);
       Assert.assertEquals(rightRet, regularFilter.toString());
     } catch (QueryFilterOptimizationException e) {
@@ -204,12 +204,12 @@ public class IExpressionOptimizerTest {
 
     try {
       String rightRet =
-          "[[[[d1.s1:time < 14001234] "
-              + "|| [d2.s1:(time < 14001234 || "
+          "[[[[.d1.s1:time < 14001234] "
+              + "|| [.d2.s1:(time < 14001234 || "
               + "(measurements[0] > 100 || measurements[0] < 50))]] "
-              + "|| [d1.s2:(time < 14001234 || "
+              + "|| [.d1.s2:(time < 14001234 || "
               + "(measurements[0] > 100.5 || measurements[0] < 50.6))]] "
-              + "|| [d2.s2:time < 14001234]]";
+              + "|| [.d2.s2:time < 14001234]]";
       IExpression regularFilter = expressionOptimizer.optimize(expression, 
selectedSeries);
       Assert.assertEquals(rightRet, regularFilter.toString());
     } catch (QueryFilterOptimizationException e) {
@@ -236,12 +236,12 @@ public class IExpressionOptimizerTest {
 
     try {
       String rightRet =
-          "[[[[d1.s1:(time < 14001234 && time > 14001000)] "
-              + "|| [d2.s1:((time < 14001234 && time > 14001000) "
+          "[[[[.d1.s1:(time < 14001234 && time > 14001000)] "
+              + "|| [.d2.s1:((time < 14001234 && time > 14001000) "
               + "|| (measurements[0] > 100 || measurements[0] < 50))]] "
-              + "|| [d1.s2:((time < 14001234 && time > 14001000) "
+              + "|| [.d1.s2:((time < 14001234 && time > 14001000) "
               + "|| (measurements[0] > 100.5 || measurements[0] < 50.6))]] "
-              + "|| [d2.s2:(time < 14001234 && time > 14001000)]]";
+              + "|| [.d2.s2:(time < 14001234 && time > 14001000)]]";
       IExpression regularFilter = expressionOptimizer.optimize(expression, 
selectedSeries);
       Assert.assertEquals(rightRet, regularFilter.toString());
     } catch (QueryFilterOptimizationException e) {
@@ -255,9 +255,9 @@ public class IExpressionOptimizerTest {
 
     try {
       String rightRet2 =
-          "[[d2.s1:((measurements[0] > 100 || measurements[0] < 50) "
+          "[[.d2.s1:((measurements[0] > 100 || measurements[0] < 50) "
               + "&& (time < 14001234 && time > 14001000))] || "
-              + "[d1.s2:((measurements[0] > 100.5 || measurements[0] < 50.6) "
+              + "[.d1.s2:((measurements[0] > 100.5 || measurements[0] < 50.6) "
               + "&& (time < 14001234 && time > 14001000))]]";
       IExpression regularFilter2 = expressionOptimizer.optimize(expression2, 
selectedSeries);
       Assert.assertEquals(rightRet2, regularFilter2.toString());
diff --git a/tsfile/src/test/java/org/apache/tsfile/utils/FileGenerator.java 
b/tsfile/src/test/java/org/apache/tsfile/utils/FileGenerator.java
index aacd775a..09f7d140 100755
--- a/tsfile/src/test/java/org/apache/tsfile/utils/FileGenerator.java
+++ b/tsfile/src/test/java/org/apache/tsfile/utils/FileGenerator.java
@@ -22,7 +22,6 @@ import org.apache.tsfile.common.conf.TSFileConfig;
 import org.apache.tsfile.common.conf.TSFileDescriptor;
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.exception.write.WriteProcessException;
-import org.apache.tsfile.file.metadata.IDeviceID;
 import org.apache.tsfile.file.metadata.IDeviceID.Factory;
 import org.apache.tsfile.file.metadata.enums.TSEncoding;
 import org.apache.tsfile.read.common.Path;
diff --git a/tsfile/src/test/java/org/apache/tsfile/utils/RecordUtils.java 
b/tsfile/src/test/java/org/apache/tsfile/utils/RecordUtils.java
index fb0d04b5..e27eacc6 100644
--- a/tsfile/src/test/java/org/apache/tsfile/utils/RecordUtils.java
+++ b/tsfile/src/test/java/org/apache/tsfile/utils/RecordUtils.java
@@ -20,9 +20,7 @@ package org.apache.tsfile.utils;
 
 import org.apache.tsfile.common.constant.JsonFormatConstant;
 import org.apache.tsfile.enums.TSDataType;
-import org.apache.tsfile.file.metadata.IDeviceID;
 import org.apache.tsfile.file.metadata.IDeviceID.Factory;
-import org.apache.tsfile.read.common.Path;
 import org.apache.tsfile.write.record.TSRecord;
 import org.apache.tsfile.write.record.datapoint.BooleanDataPoint;
 import org.apache.tsfile.write.record.datapoint.DoubleDataPoint;
@@ -70,7 +68,8 @@ public class RecordUtils {
     for (int i = 2; i < items.length - 1; i += 2) {
       // get measurementId and value
       measurementId = items[i].trim();
-      MeasurementGroup measurementGroup = 
schema.getSeriesSchema(Factory.DEFAULT_FACTORY.create(deviceId));
+      MeasurementGroup measurementGroup =
+          schema.getSeriesSchema(Factory.DEFAULT_FACTORY.create(deviceId));
       IMeasurementSchema measurementSchema =
           measurementGroup == null
               ? null
diff --git 
a/tsfile/src/test/java/org/apache/tsfile/write/MetadataIndexConstructorTest.java
 
b/tsfile/src/test/java/org/apache/tsfile/write/MetadataIndexConstructorTest.java
index d8da67bd..09d211fc 100644
--- 
a/tsfile/src/test/java/org/apache/tsfile/write/MetadataIndexConstructorTest.java
+++ 
b/tsfile/src/test/java/org/apache/tsfile/write/MetadataIndexConstructorTest.java
@@ -28,12 +28,10 @@ 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.PlainDeviceID;
 import org.apache.tsfile.file.metadata.TimeseriesMetadata;
 import org.apache.tsfile.file.metadata.TsFileMetadata;
 import org.apache.tsfile.file.metadata.enums.MetadataIndexNodeType;
 import org.apache.tsfile.file.metadata.enums.TSEncoding;
-import org.apache.tsfile.file.metadata.utils.TestHelper;
 import org.apache.tsfile.fileSystem.FSFactoryProducer;
 import org.apache.tsfile.read.TsFileSequenceReader;
 import org.apache.tsfile.read.common.Path;
diff --git 
a/tsfile/src/test/java/org/apache/tsfile/write/TsFileIOWriterTest.java 
b/tsfile/src/test/java/org/apache/tsfile/write/TsFileIOWriterTest.java
index afd04de7..f60d9cf5 100644
--- a/tsfile/src/test/java/org/apache/tsfile/write/TsFileIOWriterTest.java
+++ b/tsfile/src/test/java/org/apache/tsfile/write/TsFileIOWriterTest.java
@@ -27,7 +27,6 @@ import org.apache.tsfile.file.header.ChunkGroupHeader;
 import org.apache.tsfile.file.header.ChunkHeader;
 import org.apache.tsfile.file.metadata.IDeviceID;
 import org.apache.tsfile.file.metadata.MetadataIndexNode;
-import org.apache.tsfile.file.metadata.PlainDeviceID;
 import org.apache.tsfile.file.metadata.TimeseriesMetadata;
 import org.apache.tsfile.file.metadata.TsFileMetadata;
 import org.apache.tsfile.file.metadata.enums.TSEncoding;
@@ -155,10 +154,7 @@ public class TsFileIOWriterTest {
     for (Map.Entry<IDeviceID, List<TimeseriesMetadata>> entry :
         deviceTimeseriesMetadataMap.entrySet()) {
       for (TimeseriesMetadata timeseriesMetadata : entry.getValue()) {
-        String seriesPath =
-            entry.getKey()
-                + "."
-                + timeseriesMetadata.getMeasurementId();
+        String seriesPath = entry.getKey() + "." + 
timeseriesMetadata.getMeasurementId();
         Assert.assertFalse(pathSet.contains(seriesPath));
         pathSet.add(seriesPath);
       }
diff --git a/tsfile/src/test/java/org/apache/tsfile/write/TsFileWriterTest.java 
b/tsfile/src/test/java/org/apache/tsfile/write/TsFileWriterTest.java
index 1e18c3b5..7f3c278f 100644
--- a/tsfile/src/test/java/org/apache/tsfile/write/TsFileWriterTest.java
+++ b/tsfile/src/test/java/org/apache/tsfile/write/TsFileWriterTest.java
@@ -103,7 +103,7 @@ public class TsFileWriterTest {
           new Path("d1"),
           new MeasurementSchema("s1", TSDataType.FLOAT, TSEncoding.RLE, 
CompressionType.SNAPPY));
     } catch (WriteProcessException e) {
-      Assert.assertEquals("given nonAligned timeseries d1.s1 has been 
registered.", e.getMessage());
+      Assert.assertEquals("given nonAligned timeseries .d1.s1 has been 
registered.", e.getMessage());
     }
     try {
       List<MeasurementSchema> schemas = new ArrayList<>();
@@ -112,7 +112,7 @@ public class TsFileWriterTest {
       writer.registerAlignedTimeseries(new Path("d1"), schemas);
     } catch (WriteProcessException e) {
       Assert.assertEquals(
-          "given device d1 has been registered for nonAligned timeseries.", 
e.getMessage());
+          "given device .d1 has been registered for nonAligned timeseries.", 
e.getMessage());
     }
     List<MeasurementSchema> schemas = new ArrayList<>();
     schemas.add(
@@ -138,7 +138,7 @@ public class TsFileWriterTest {
       writer.registerAlignedTimeseries(new Path("d2"), measurementSchemas);
     } catch (WriteProcessException e) {
       Assert.assertEquals(
-          "given device d2 has been registered for aligned timeseries and 
should not be expanded.",
+          "given device .d2 has been registered for aligned timeseries and 
should not be expanded.",
           e.getMessage());
     }
     try {
@@ -147,7 +147,7 @@ public class TsFileWriterTest {
           new MeasurementSchema("s5", TSDataType.INT32, TSEncoding.RLE, 
CompressionType.SNAPPY));
     } catch (WriteProcessException e) {
       Assert.assertEquals(
-          "given device d2 has been registered for aligned timeseries.", 
e.getMessage());
+          "given device .d2 has been registered for aligned timeseries.", 
e.getMessage());
     }
 
     /*try {
diff --git a/tsfile/src/test/java/org/apache/tsfile/write/WriteTest.java 
b/tsfile/src/test/java/org/apache/tsfile/write/WriteTest.java
index 38c84309..d97ae61d 100755
--- a/tsfile/src/test/java/org/apache/tsfile/write/WriteTest.java
+++ b/tsfile/src/test/java/org/apache/tsfile/write/WriteTest.java
@@ -219,7 +219,7 @@ public class WriteTest {
     // add all measurement except the last one at before writing
     for (int i = 0; i < measurementArray.size() - 1; i++) {
       tsFileWriter.registerTimeseries(
-          new Path(pathArray.get(i).getDevice()), measurementArray.get(i));
+          new Path(pathArray.get(i).getDeviceString()), 
measurementArray.get(i));
     }
     while (true) {
       if (lineCount % stageSize == 0) {
@@ -235,7 +235,7 @@ public class WriteTest {
       }
       if (lineCount == ROW_COUNT / 2) {
         tsFileWriter.registerTimeseries(
-            new Path(pathArray.get(measurementArray.size() - 1).getDevice()),
+            new Path(pathArray.get(measurementArray.size() - 
1).getDeviceString()),
             measurementArray.get(measurementArray.size() - 1));
       }
       strings = getNextRecord(lineCount, stageState);
@@ -252,7 +252,7 @@ public class WriteTest {
     Path path = pathArray.get(measurementArray.size() - 1);
     MeasurementSchema dupTimeseries = 
measurementArray.get(measurementArray.size() - 1);
     try {
-      tsFileWriter.registerTimeseries(new Path(path.getDevice()), 
dupTimeseries);
+      tsFileWriter.registerTimeseries(new Path(path.getDeviceString()), 
dupTimeseries);
     } catch (WriteProcessException e) {
       assertEquals("given timeseries has exists! " + path, e.getMessage());
     }
diff --git 
a/tsfile/src/test/java/org/apache/tsfile/write/writer/TsFileIOWriterMemoryControlTest.java
 
b/tsfile/src/test/java/org/apache/tsfile/write/writer/TsFileIOWriterMemoryControlTest.java
index 3d2c9618..bb47294e 100644
--- 
a/tsfile/src/test/java/org/apache/tsfile/write/writer/TsFileIOWriterMemoryControlTest.java
+++ 
b/tsfile/src/test/java/org/apache/tsfile/write/writer/TsFileIOWriterMemoryControlTest.java
@@ -27,7 +27,6 @@ import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.file.metadata.ChunkMetadata;
 import org.apache.tsfile.file.metadata.IChunkMetadata;
 import org.apache.tsfile.file.metadata.IDeviceID;
-import org.apache.tsfile.file.metadata.PlainDeviceID;
 import org.apache.tsfile.file.metadata.TimeseriesMetadata;
 import org.apache.tsfile.file.metadata.enums.CompressionType;
 import org.apache.tsfile.file.metadata.enums.TSEncoding;

Reply via email to