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

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


The following commit(s) were added to refs/heads/support_schema_evolution by 
this push:
     new 9b64b1c1 Fix that successive evolution may be overwritten
9b64b1c1 is described below

commit 9b64b1c1f7c0a83ff5313c4b7503e0ffab2a5545
Author: Tian Jiang <[email protected]>
AuthorDate: Tue Nov 25 18:54:38 2025 +0800

    Fix that successive evolution may be overwritten
---
 .../tsfile/file/metadata/TsFileMetadata.java       | 43 +++++++++----
 .../file/metadata/evolution/ColumnRename.java      |  7 +-
 .../file/metadata/evolution/SchemaEvolution.java   |  5 +-
 .../file/metadata/evolution/TableRename.java       |  7 +-
 .../metadata/evolution/TsFileSchemaRewriter.java   | 13 ++--
 .../org/apache/tsfile/utils/ReadWriteIOUtils.java  | 14 ++++
 .../evolution/TsFileSchemaEvolutionTest.java       | 74 ++++++++++++++++++++--
 .../evolution/TsFileSchemaRewriterTest.java        | 30 ++++++---
 8 files changed, 152 insertions(+), 41 deletions(-)

diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/TsFileMetadata.java 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/TsFileMetadata.java
index 040ec83b..5f4ea20b 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/TsFileMetadata.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/TsFileMetadata.java
@@ -19,8 +19,11 @@
 
 package org.apache.tsfile.file.metadata;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.stream.Collectors;
 import org.apache.tsfile.compatibility.DeserializeConfig;
 import org.apache.tsfile.encrypt.EncryptUtils;
 import org.apache.tsfile.exception.encrypt.EncryptException;
@@ -28,6 +31,7 @@ import 
org.apache.tsfile.file.metadata.evolution.EvolvedSchema;
 import org.apache.tsfile.file.metadata.evolution.SchemaEvolution;
 import org.apache.tsfile.file.metadata.evolution.SchemaEvolution.Builder;
 import org.apache.tsfile.utils.BloomFilter;
+import org.apache.tsfile.utils.Pair;
 import org.apache.tsfile.utils.ReadWriteForEncodingUtils;
 import org.apache.tsfile.utils.ReadWriteIOUtils;
 
@@ -49,7 +53,8 @@ public class TsFileMetadata {
   private Map<String, TableSchema> tableSchemaMap;
   private Map<String, TableSchema> evolvedTableSchemaMap;
   private boolean hasTableSchemaMapCache;
-  private Map<String, String> tsFileProperties;
+  private List<Pair<String, String>> tsFileProperties;
+  private Map<String, String> tsFilePropertyMap;
 
   // offset of MetaMarker.SEPARATOR
   private long metaOffset;
@@ -123,12 +128,16 @@ public class TsFileMetadata {
 
     if (buffer.hasRemaining()) {
       int propertiesSize = ReadWriteForEncodingUtils.readVarInt(buffer);
-      Map<String, String> propertiesMap = new LinkedHashMap<>();
+      List<Pair<String, String>> properties = new ArrayList<>();
+
       for (int i = 0; i < propertiesSize; i++) {
         String key = ReadWriteIOUtils.readVarIntString(buffer);
         String value = ReadWriteIOUtils.readVarIntString(buffer);
-        propertiesMap.put(key, value);
+        properties.add(new Pair<>(key, value));
       }
+
+      Map<String, String> propertiesMap = new HashMap<>(properties.size());
+      properties.stream().forEach(p -> propertiesMap.put(p.getLeft(), 
p.getRight()));
       // if the file is not encrypted, set the default value(for compatible 
reason)
       if (!propertiesMap.containsKey("encryptLevel") || 
propertiesMap.get("encryptLevel") == null) {
         propertiesMap.put("encryptLevel", "0");
@@ -169,18 +178,19 @@ public class TsFileMetadata {
         throw new EncryptException(
             "Unsupported encryptLevel: " + propertiesMap.get("encryptLevel"));
       }
-      fileMetaData.tsFileProperties = propertiesMap;
+      fileMetaData.tsFilePropertyMap = propertiesMap;
+      fileMetaData.tsFileProperties = properties;
 
-      fileMetaData.update(propertiesMap);
+      fileMetaData.update(properties);
     }
 
     return fileMetaData;
   }
 
   // update the TsFileMetadata according to schema evolutions defined in 
properties
-  private void update(Map<String, String> propertiesMap) {
+  private void update(List<Pair<String, String>> tsFileProperties) {
     Builder schemaEvolutionBuilder = new Builder();
-    tsFileProperties.entrySet().forEach(entry -> {
+    tsFileProperties.forEach(entry -> {
       SchemaEvolution evolution = schemaEvolutionBuilder.fromProperty(entry);
       if (evolution != null) {
         evolution.applyTo(this);
@@ -189,10 +199,15 @@ public class TsFileMetadata {
   }
 
   public void addProperty(String key, String value) {
+    if (tsFilePropertyMap == null) {
+      tsFilePropertyMap = new LinkedHashMap<>();
+    }
+    tsFilePropertyMap.put(key, value);
+
     if (tsFileProperties == null) {
-      tsFileProperties = new LinkedHashMap<>();
+      tsFileProperties = new ArrayList<>();
     }
-    tsFileProperties.put(key, value);
+    tsFileProperties.add(new Pair<>(key, value));
   }
 
   public String getEncryptType() {
@@ -259,9 +274,9 @@ public class TsFileMetadata {
         ReadWriteForEncodingUtils.writeVarInt(
             tsFileProperties != null ? tsFileProperties.size() : 0, 
outputStream);
     if (tsFileProperties != null) {
-      for (Entry<String, String> entry : tsFileProperties.entrySet()) {
-        byteLen += ReadWriteIOUtils.writeVar(entry.getKey(), outputStream);
-        byteLen += ReadWriteIOUtils.writeVar(entry.getValue(), outputStream);
+      for (Pair<String, String> entry : tsFileProperties) {
+        byteLen += ReadWriteIOUtils.writeVar(entry.getLeft(), outputStream);
+        byteLen += ReadWriteIOUtils.writeVar(entry.getRight(), outputStream);
       }
     }
 
@@ -319,6 +334,10 @@ public class TsFileMetadata {
   }
 
   public Map<String, String> getTsFileProperties() {
+    return tsFilePropertyMap;
+  }
+
+  public List<Pair<String, String>> getTsFilePropertyList() {
     return tsFileProperties;
   }
 
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/evolution/ColumnRename.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/evolution/ColumnRename.java
index 8272164b..e0b917a1 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/evolution/ColumnRename.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/evolution/ColumnRename.java
@@ -22,6 +22,7 @@ package org.apache.tsfile.file.metadata.evolution;
 import java.util.Map;
 import org.apache.tsfile.file.metadata.TableSchema;
 import org.apache.tsfile.file.metadata.TsFileMetadata;
+import org.apache.tsfile.utils.Pair;
 
 /**
  * A schema evolution operation that renames a column in a table schema.
@@ -61,9 +62,9 @@ public class ColumnRename implements SchemaEvolution {
     return nameAfter;
   }
 
-  public static ColumnRename fromProperty(Map.Entry<String, String> property) {
-    String key = property.getKey();
-    String nameAfter = property.getValue();
+  public static ColumnRename fromProperty(Pair<String, String> property) {
+    String key = property.getLeft();
+    String nameAfter = property.getRight();
 
     int i = KEY_PREFIX.length();
     int tableNameLengthStart = i;
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/evolution/SchemaEvolution.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/evolution/SchemaEvolution.java
index 74b2b77d..99ef47db 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/evolution/SchemaEvolution.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/evolution/SchemaEvolution.java
@@ -21,6 +21,7 @@ package org.apache.tsfile.file.metadata.evolution;
 
 import java.util.Map.Entry;
 import org.apache.tsfile.file.metadata.TsFileMetadata;
+import org.apache.tsfile.utils.Pair;
 
 /**
  * A schema evolution operation that can be applied to a TableSchemaMap.
@@ -58,8 +59,8 @@ public interface SchemaEvolution {
      * @return the SchemaEvolution instance, or null if the property key does 
not match any known
      *         schema evolution operation
      */
-    public SchemaEvolution fromProperty(Entry<String, String> property) {
-      String key = property.getKey();
+    public SchemaEvolution fromProperty(Pair<String, String> property) {
+      String key = property.getLeft();
 
       if (!key.startsWith(KEY_PREFIX)) {
         return null;
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/evolution/TableRename.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/evolution/TableRename.java
index 3f108358..4d6c65cc 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/evolution/TableRename.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/evolution/TableRename.java
@@ -23,6 +23,7 @@ import java.util.Map;
 import org.apache.tsfile.file.metadata.MetadataIndexNode;
 import org.apache.tsfile.file.metadata.TableSchema;
 import org.apache.tsfile.file.metadata.TsFileMetadata;
+import org.apache.tsfile.utils.Pair;
 
 /**
  * A schema evolution operation that renames a table in a schema map.
@@ -65,9 +66,9 @@ public class TableRename implements SchemaEvolution{
     return nameAfter;
   }
 
-  public static TableRename fromProperty(Map.Entry<String, String> property) {
-    String key = property.getKey();
-    String nameAfter = property.getValue();
+  public static TableRename fromProperty(Pair<String, String> property) {
+    String key = property.getLeft();
+    String nameAfter = property.getRight();
 
     String nameBefore = key.substring(TableRename.KEY_PREFIX.length());
 
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/evolution/TsFileSchemaRewriter.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/evolution/TsFileSchemaRewriter.java
index fb5be1fa..65851d48 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/evolution/TsFileSchemaRewriter.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/evolution/TsFileSchemaRewriter.java
@@ -33,6 +33,7 @@ import org.apache.tsfile.file.metadata.ColumnSchema;
 import org.apache.tsfile.file.metadata.TableSchema;
 import org.apache.tsfile.file.metadata.TsFileMetadata;
 import org.apache.tsfile.read.TsFileSequenceReader;
+import org.apache.tsfile.utils.Pair;
 import org.apache.tsfile.utils.PublicBAOS;
 import org.apache.tsfile.utils.ReadWriteIOUtils;
 import org.apache.tsfile.write.TsFileWriter;
@@ -67,7 +68,7 @@ public class TsFileSchemaRewriter {
    * @param newProperties the new properties to append
    * @throws IOException if an I/O error occurs
    */
-  public void appendProperties(Map<String, String> newProperties) throws 
IOException {
+  public void appendProperties(List<Pair<String, String>> newProperties) 
throws IOException {
     // read TsFileMetadata and its position
     TsFileMetadata tsFileMetadata;
     long metadataOffset;
@@ -78,8 +79,8 @@ public class TsFileSchemaRewriter {
 
     // calculate the position of properties and write new properties to a 
buffer
     int propertiesOffset = tsFileMetadata.getPropertiesOffset();
-    Map<String, String> mergedProperties = 
tsFileMetadata.getTsFileProperties();
-    mergedProperties.putAll(newProperties);
+    List<Pair<String, String>> mergedProperties = 
tsFileMetadata.getTsFilePropertyList();
+    mergedProperties.addAll(newProperties);
     PublicBAOS newPropertiesBuffer = new PublicBAOS(4096);
     DataOutputStream dataOutputStream = new 
DataOutputStream(newPropertiesBuffer);
     ReadWriteIOUtils.writeVar(mergedProperties, dataOutputStream);
@@ -127,12 +128,12 @@ public class TsFileSchemaRewriter {
     long start = System.currentTimeMillis();
     for (String file : files) {
       TsFileSchemaRewriter rewriter = new TsFileSchemaRewriter(file);
-      Map<String, String> newProperties = new LinkedHashMap<>();
+      List<Pair<String, String>> newProperties = new ArrayList<>();
       for (int i = 0; i < evolutionNum; i++) {
         SchemaEvolution evolution = new ColumnRename("t1", "s" + i, "s" + (i + 
1));
-        newProperties.put(
+        newProperties.add(new Pair<>(
             evolution.propertyKey(),
-            evolution.propertyValue()
+            evolution.propertyValue())
         );
       }
       rewriter.appendProperties(newProperties);
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/utils/ReadWriteIOUtils.java 
b/java/tsfile/src/main/java/org/apache/tsfile/utils/ReadWriteIOUtils.java
index 4c4261f1..9328ea66 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/utils/ReadWriteIOUtils.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/utils/ReadWriteIOUtils.java
@@ -178,6 +178,20 @@ public class ReadWriteIOUtils {
     return length;
   }
 
+  public static int writeVar(List<Pair<String, String>> propertyList, 
OutputStream stream) throws IOException {
+    if (propertyList == null) {
+      return ReadWriteForEncodingUtils.writeVarInt(NO_BYTE_TO_READ, stream);
+    }
+
+    int length = 0;
+    length += ReadWriteForEncodingUtils.writeVarInt(propertyList.size(), 
stream);
+    for (Pair<String, String> entry : propertyList) {
+      length += writeVar(entry.getLeft(), stream);
+      length += writeVar(entry.getRight(), stream);
+    }
+    return length;
+  }
+
   public static void write(List<Map<String, String>> maps, OutputStream 
stream) throws IOException {
     for (Map<String, String> map : maps) {
       write(map, stream);
diff --git 
a/java/tsfile/src/test/java/org/apache/tsfile/file/metadata/evolution/TsFileSchemaEvolutionTest.java
 
b/java/tsfile/src/test/java/org/apache/tsfile/file/metadata/evolution/TsFileSchemaEvolutionTest.java
index 90bf4513..8934b99f 100644
--- 
a/java/tsfile/src/test/java/org/apache/tsfile/file/metadata/evolution/TsFileSchemaEvolutionTest.java
+++ 
b/java/tsfile/src/test/java/org/apache/tsfile/file/metadata/evolution/TsFileSchemaEvolutionTest.java
@@ -33,7 +33,6 @@ import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.exception.read.ReadProcessException;
 import org.apache.tsfile.exception.write.NoMeasurementException;
 import org.apache.tsfile.exception.write.NoTableException;
-import org.apache.tsfile.file.metadata.IDeviceID;
 import org.apache.tsfile.file.metadata.IDeviceID.Factory;
 import org.apache.tsfile.file.metadata.TableSchema;
 import org.apache.tsfile.file.metadata.TimeseriesMetadata;
@@ -41,6 +40,7 @@ import org.apache.tsfile.read.TsFileSequenceReader;
 import org.apache.tsfile.read.query.dataset.ResultSet;
 import org.apache.tsfile.read.v4.ITsFileReader;
 import org.apache.tsfile.read.v4.TsFileReaderBuilder;
+import org.apache.tsfile.utils.Pair;
 import org.apache.tsfile.write.record.Tablet;
 import org.apache.tsfile.write.schema.IMeasurementSchema;
 import org.apache.tsfile.write.schema.MeasurementSchema;
@@ -130,7 +130,7 @@ public class TsFileSchemaEvolutionTest {
     // rename t1 -> t4
     TableRename tableRename = new TableRename("t1", "t4");
     TsFileSchemaRewriter rewriter = new TsFileSchemaRewriter(TEST_FILE_PATH);
-    
rewriter.appendProperties(Collections.singletonMap(tableRename.propertyKey(), 
tableRename.propertyValue()));
+    rewriter.appendProperties(Collections.singletonList(new 
Pair<>(tableRename.propertyKey(), tableRename.propertyValue())));
 
     // Verify the table has been renamed
     try (ITsFileReader reader = new TsFileReaderBuilder().file(new 
File(TEST_FILE_PATH)).build()) {
@@ -150,7 +150,7 @@ public class TsFileSchemaEvolutionTest {
 
     // rename t2 -> t1
     tableRename = new TableRename("t2", "t1");
-    
rewriter.appendProperties(Collections.singletonMap(tableRename.propertyKey(), 
tableRename.propertyValue()));
+    rewriter.appendProperties(Collections.singletonList(new 
Pair<>(tableRename.propertyKey(), tableRename.propertyValue())));
 
     // Verify the table has been renamed
     try (ITsFileReader reader = new TsFileReaderBuilder().file(new 
File(TEST_FILE_PATH)).build()) {
@@ -190,13 +190,77 @@ public class TsFileSchemaEvolutionTest {
     }
   }
 
+  @Test
+  public void testSuccessiveRename()
+      throws IOException, ReadProcessException, NoTableException, 
NoMeasurementException {
+    // rename t1 -> t4
+    TableRename tableRename = new TableRename("t1", "t4");
+    TsFileSchemaRewriter rewriter = new TsFileSchemaRewriter(TEST_FILE_PATH);
+    rewriter.appendProperties(Collections.singletonList(new 
Pair<>(tableRename.propertyKey(), tableRename.propertyValue())));
+    // rename t2 -> t1
+    tableRename = new TableRename("t2", "t1");
+    rewriter.appendProperties(Collections.singletonList(new 
Pair<>(tableRename.propertyKey(), tableRename.propertyValue())));
+    // rename t1 -> t5
+    tableRename = new TableRename("t1", "t5");
+    rewriter.appendProperties(Collections.singletonList(new 
Pair<>(tableRename.propertyKey(), tableRename.propertyValue())));
+
+    // (t1, t2, t3) -> (t4, t5, t3)
+    // Verify the table has been renamed
+    try (ITsFileReader reader = new TsFileReaderBuilder().file(new 
File(TEST_FILE_PATH)).build()) {
+      assertFalse(reader.getTableSchemas("t1").isPresent());
+      assertFalse(reader.getTableSchemas("t2").isPresent());
+      Optional<TableSchema> t = reader.getTableSchemas("t4");
+      assertTrue(t.isPresent());
+      TableSchema tableSchema = t.get();
+      assertEquals("t1", tableSchema.getTableName());
+      t = reader.getTableSchemas("t5");
+      assertTrue(t.isPresent());
+      tableSchema = t.get();
+      assertEquals("t2", tableSchema.getTableName());
+
+      assertThrows(NoTableException.class, () -> reader.query("t1", 
Arrays.asList("f1", "f2"), 0, 10));
+      assertThrows(NoTableException.class, () -> reader.query("t2", 
Arrays.asList("f1", "f2"), 0, 10));
+      ResultSet resultSet = reader.query("t4", Arrays.asList("f1", "f2"), 0, 
10);
+      assertTrue(resultSet.next());
+      assertEquals(3, resultSet.getInt("f1"));
+      assertEquals(4.0, resultSet.getDouble("f2"), 0.0001);
+      assertFalse(resultSet.next());
+      resultSet = reader.query("t5", Arrays.asList("f1", "f2"), 0, 10);
+      assertTrue(resultSet.next());
+      assertEquals(13, resultSet.getInt("f1"));
+      assertEquals(14.0, resultSet.getDouble("f2"), 0.0001);
+      assertFalse(resultSet.next());
+    }
+
+    // t3 is not affected
+    try (ITsFileReader reader = new TsFileReaderBuilder().file(new 
File(TEST_FILE_PATH)).build()) {
+      Optional<TableSchema> t1 = reader.getTableSchemas("t3");
+      assertTrue(t1.isPresent());
+      TableSchema tableSchema = t1.get();
+      assertEquals("t3", tableSchema.getTableName());
+
+      ResultSet resultSet = reader.query("t3", Arrays.asList("f1", "f2"), 0, 
10);
+      assertTrue(resultSet.next());
+      assertEquals(23, resultSet.getInt("f1"));
+      assertEquals(24.0, resultSet.getDouble("f2"), 0.0001);
+      assertFalse(resultSet.next());
+    }
+
+    // test read timeseries metadata
+    try (TsFileSequenceReader sequenceReader = new 
TsFileSequenceReader(TEST_FILE_PATH)) {
+      TimeseriesMetadata timeseriesMetadata = 
sequenceReader.readTimeseriesMetadata(
+          Factory.DEFAULT_FACTORY.create(new String[]{"t5", "t2-tag1", 
"t2-tag2"}), "f1", false);
+      assertEquals(13, timeseriesMetadata.getStatistics().getMaxValue());
+    }
+  }
+
   @Test
   public void testColumnRename()
       throws IOException, ReadProcessException, NoTableException, 
NoMeasurementException {
     // rename t1.f1 -> t1.f3
     SchemaEvolution evolution = new ColumnRename("t1", "f1", "f3");
     TsFileSchemaRewriter rewriter = new TsFileSchemaRewriter(TEST_FILE_PATH);
-    
rewriter.appendProperties(Collections.singletonMap(evolution.propertyKey(), 
evolution.propertyValue()));
+    rewriter.appendProperties(Collections.singletonList(new 
Pair<>(evolution.propertyKey(), evolution.propertyValue())));
 
     // Verify the column has been renamed
     try (ITsFileReader reader = new TsFileReaderBuilder().file(new 
File(TEST_FILE_PATH)).build()) {
@@ -217,7 +281,7 @@ public class TsFileSchemaEvolutionTest {
 
     // rename t1.f2 -> t1.f1
     evolution = new ColumnRename("t1", "f2", "f1");
-    
rewriter.appendProperties(Collections.singletonMap(evolution.propertyKey(), 
evolution.propertyValue()));
+    rewriter.appendProperties(Collections.singletonList(new 
Pair<>(evolution.propertyKey(), evolution.propertyValue())));
 
     // Verify the table has been renamed
     try (ITsFileReader reader = new TsFileReaderBuilder().file(new 
File(TEST_FILE_PATH)).build()) {
diff --git 
a/java/tsfile/src/test/java/org/apache/tsfile/file/metadata/evolution/TsFileSchemaRewriterTest.java
 
b/java/tsfile/src/test/java/org/apache/tsfile/file/metadata/evolution/TsFileSchemaRewriterTest.java
index ee47fd1f..a3bc23ea 100644
--- 
a/java/tsfile/src/test/java/org/apache/tsfile/file/metadata/evolution/TsFileSchemaRewriterTest.java
+++ 
b/java/tsfile/src/test/java/org/apache/tsfile/file/metadata/evolution/TsFileSchemaRewriterTest.java
@@ -22,9 +22,14 @@ package org.apache.tsfile.file.metadata.evolution;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.file.metadata.TsFileMetadata;
 import org.apache.tsfile.read.TsFileSequenceReader;
+import org.apache.tsfile.utils.Pair;
 import org.apache.tsfile.write.TsFileWriter;
 import org.apache.tsfile.write.record.TSRecord;
 import org.apache.tsfile.write.record.datapoint.IntDataPoint;
@@ -78,8 +83,8 @@ public class TsFileSchemaRewriterTest {
   public void testAppendSingleProperty() throws IOException {
     // Create rewriter and append a single property
     TsFileSchemaRewriter rewriter = new TsFileSchemaRewriter(TEST_FILE_PATH);
-    Map<String, String> newProperties = new HashMap<>();
-    newProperties.put("test_key", "test_value");
+    List<Pair<String, String>> newProperties = new ArrayList<>();
+    newProperties.add(new Pair<>("test_key", "test_value"));
     rewriter.appendProperties(newProperties);
 
     // Verify the property was added
@@ -97,7 +102,8 @@ public class TsFileSchemaRewriterTest {
     newProperties.put("key1", "value1");
     newProperties.put("key2", "value2");
     newProperties.put("key3", "value3");
-    rewriter.appendProperties(newProperties);
+    rewriter.appendProperties(newProperties.entrySet().stream().map(e -> new 
Pair<>(e.getKey(), e.getValue())).collect(
+        Collectors.toList()));
 
     // Verify all properties were added
     try (TsFileSequenceReader reader = new 
TsFileSequenceReader(TEST_FILE_PATH)) {
@@ -116,18 +122,21 @@ public class TsFileSchemaRewriterTest {
     // First append
     Map<String, String> firstProperties = new HashMap<>();
     firstProperties.put("key1", "value1");
-    rewriter.appendProperties(firstProperties);
+    rewriter.appendProperties(firstProperties.entrySet().stream().map(e -> new 
Pair<>(e.getKey(), e.getValue())).collect(
+        Collectors.toList()));
 
     // Second append
     Map<String, String> secondProperties = new HashMap<>();
     secondProperties.put("key2", "value2");
-    rewriter.appendProperties(secondProperties);
+    rewriter.appendProperties(secondProperties.entrySet().stream().map(e -> 
new Pair<>(e.getKey(), e.getValue())).collect(
+        Collectors.toList()));
 
     // Third append with update to existing property
     Map<String, String> thirdProperties = new HashMap<>();
     thirdProperties.put("key1", "new_value1");
     thirdProperties.put("key3", "value3");
-    rewriter.appendProperties(thirdProperties);
+    rewriter.appendProperties(thirdProperties.entrySet().stream().map(e -> new 
Pair<>(e.getKey(), e.getValue())).collect(
+        Collectors.toList()));
 
     // Verify final state
     try (TsFileSequenceReader reader = new 
TsFileSequenceReader(TEST_FILE_PATH)) {
@@ -142,8 +151,7 @@ public class TsFileSchemaRewriterTest {
   @Test
   public void testAppendEmptyProperties() throws IOException {
     TsFileSchemaRewriter rewriter = new TsFileSchemaRewriter(TEST_FILE_PATH);
-    Map<String, String> emptyProperties = new HashMap<>();
-    rewriter.appendProperties(emptyProperties);
+    rewriter.appendProperties(Collections.emptyList());
 
     // Verify file is still valid and only encryption-related properties were 
added
     try (TsFileSequenceReader reader = new 
TsFileSequenceReader(TEST_FILE_PATH)) {
@@ -161,7 +169,8 @@ public class TsFileSchemaRewriterTest {
     TsFileSchemaRewriter rewriter = new TsFileSchemaRewriter(nonExistentFile);
     Map<String, String> properties = new HashMap<>();
     properties.put("key", "value");
-    rewriter.appendProperties(properties);
+    rewriter.appendProperties(properties.entrySet().stream().map(e -> new 
Pair<>(e.getKey(), e.getValue())).collect(
+        Collectors.toList()));
   }
 
   @Test
@@ -178,7 +187,8 @@ public class TsFileSchemaRewriterTest {
       largeProperties.put("key" + i, value.toString());
     }
 
-    rewriter.appendProperties(largeProperties);
+    rewriter.appendProperties(largeProperties.entrySet().stream().map(e -> new 
Pair<>(e.getKey(), e.getValue())).collect(
+        Collectors.toList()));
 
     // Verify all properties were written correctly
     try (TsFileSequenceReader reader = new 
TsFileSequenceReader(TEST_FILE_PATH)) {

Reply via email to