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

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

commit 91734b313ae3917c44a0dd516785f5ee423eac5b
Author: Tian Jiang <[email protected]>
AuthorDate: Wed Jul 29 12:17:14 2026 +0800

    add property read-write interface
---
 .../apache/tsfile/read/TsFileSequenceReader.java   |  5 ++++
 .../tsfile/read/v4/DeviceTableModelReader.java     |  6 ++++
 .../org/apache/tsfile/read/v4/ITsFileReader.java   |  4 +++
 .../write/v4/AbstractTableModelTsFileWriter.java   |  6 ++++
 .../org/apache/tsfile/write/v4/ITsFileWriter.java  |  3 ++
 .../apache/tsfile/write/writer/TsFileIOWriter.java |  8 ++++++
 .../read/TsFileV4ReadWriteInterfacesTest.java      | 33 ++++++++++++++++++++++
 7 files changed, 65 insertions(+)

diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReader.java 
b/java/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReader.java
index 1fcabdab6..505b6aa8a 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReader.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReader.java
@@ -607,6 +607,11 @@ public class TsFileSequenceReader implements AutoCloseable 
{
     return getTableSchemaMap(null);
   }
 
+  /** Get the properties stored in the TsFile metadata. */
+  public Map<String, String> getTsFileProperties() throws IOException {
+    return readFileMetadata().getTsFileProperties();
+  }
+
   public Map<String, TableSchema> getTableSchemaMap(LongConsumer 
ioSizeRecorder)
       throws IOException {
     if (tsFileMetaData != null && tsFileMetaData.hasTableSchemaMapCache()) {
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/read/v4/DeviceTableModelReader.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/read/v4/DeviceTableModelReader.java
index e7749d42b..4dffbbc01 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/read/v4/DeviceTableModelReader.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/read/v4/DeviceTableModelReader.java
@@ -78,6 +78,12 @@ public class DeviceTableModelReader implements ITsFileReader 
{
     return Optional.ofNullable(tableSchemaMap.get(tableName.toLowerCase()));
   }
 
+  @Override
+  @TsFileApi
+  public Map<String, String> getTsFileProperties() throws IOException {
+    return fileReader.getTsFileProperties();
+  }
+
   @TsFileApi
   public ResultSet query(String tableName, List<String> columnNames, long 
startTime, long endTime)
       throws IOException, NoTableException, NoMeasurementException, 
ReadProcessException {
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/read/v4/ITsFileReader.java 
b/java/tsfile/src/main/java/org/apache/tsfile/read/v4/ITsFileReader.java
index 995f73f64..0ade853c7 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/read/v4/ITsFileReader.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/read/v4/ITsFileReader.java
@@ -29,6 +29,7 @@ import org.apache.tsfile.read.query.dataset.ResultSet;
 
 import java.io.IOException;
 import java.util.List;
+import java.util.Map;
 import java.util.Optional;
 
 public interface ITsFileReader extends AutoCloseable {
@@ -48,6 +49,9 @@ public interface ITsFileReader extends AutoCloseable {
   @TsFileApi
   List<TableSchema> getAllTableSchema() throws IOException;
 
+  @TsFileApi
+  Map<String, String> getTsFileProperties() throws IOException;
+
   @TsFileApi
   void close();
 }
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/write/v4/AbstractTableModelTsFileWriter.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/write/v4/AbstractTableModelTsFileWriter.java
index 94be1fdc1..2bb39ad57 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/write/v4/AbstractTableModelTsFileWriter.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/write/v4/AbstractTableModelTsFileWriter.java
@@ -259,6 +259,12 @@ abstract class AbstractTableModelTsFileWriter implements 
ITsFileWriter {
     return fileWriter.getSchema();
   }
 
+  @Override
+  @TsFileApi
+  public void addTsFileProperty(String key, String value) {
+    fileWriter.addTsFileProperty(key, value);
+  }
+
   /**
    * calling this method to write the last data remaining in memory and close 
the normal and error
    * OutputStream.
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/write/v4/ITsFileWriter.java 
b/java/tsfile/src/main/java/org/apache/tsfile/write/v4/ITsFileWriter.java
index 25ccb031b..15e5db30b 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/write/v4/ITsFileWriter.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/write/v4/ITsFileWriter.java
@@ -36,4 +36,7 @@ public interface ITsFileWriter extends AutoCloseable {
 
   @TsFileApi
   void write(TSRecord record) throws IOException, WriteProcessException;
+
+  @TsFileApi
+  void addTsFileProperty(String key, String value);
 }
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/write/writer/TsFileIOWriter.java 
b/java/tsfile/src/main/java/org/apache/tsfile/write/writer/TsFileIOWriter.java
index df6d99b20..a379e4314 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/write/writer/TsFileIOWriter.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/write/writer/TsFileIOWriter.java
@@ -143,6 +143,8 @@ public class TsFileIOWriter implements AutoCloseable {
 
   protected Map<String, Long> tableSizeMap = new HashMap<>();
 
+  private final Map<String, String> tsFileProperties = new HashMap<>();
+
   /** empty construct function. */
   protected TsFileIOWriter() {
     setEncryptParam(
@@ -246,6 +248,11 @@ public class TsFileIOWriter implements AutoCloseable {
     }
   }
 
+  /** Add a custom property to the TsFile metadata. */
+  public void addTsFileProperty(String key, String value) {
+    tsFileProperties.put(key, value);
+  }
+
   public void addFlushListener(FlushChunkMetadataListener listener) {
     flushListeners.add(listener);
   }
@@ -590,6 +597,7 @@ public class TsFileIOWriter implements AutoCloseable {
     tsFileMetadata.setTableSchemaMap(schema.getTableSchemaMap());
     tsFileMetadata.setMetaOffset(metaOffset);
     tsFileMetadata.setBloomFilter(filter);
+    tsFileProperties.forEach(tsFileMetadata::addProperty);
     tsFileMetadata.addProperty("encryptLevel", encryptLevel);
     tsFileMetadata.addProperty("encryptType", encryptType);
     tsFileMetadata.addProperty("encryptKey", encryptKey);
diff --git 
a/java/tsfile/src/test/java/org/apache/tsfile/read/TsFileV4ReadWriteInterfacesTest.java
 
b/java/tsfile/src/test/java/org/apache/tsfile/read/TsFileV4ReadWriteInterfacesTest.java
index 51aa64ce6..c8b0b5c0d 100644
--- 
a/java/tsfile/src/test/java/org/apache/tsfile/read/TsFileV4ReadWriteInterfacesTest.java
+++ 
b/java/tsfile/src/test/java/org/apache/tsfile/read/TsFileV4ReadWriteInterfacesTest.java
@@ -27,6 +27,7 @@ import org.apache.tsfile.file.metadata.IDeviceID;
 import org.apache.tsfile.file.metadata.StringArrayDeviceID;
 import org.apache.tsfile.file.metadata.TableSchema;
 import org.apache.tsfile.read.v4.DeviceTableModelReader;
+import org.apache.tsfile.read.v4.ITsFileReader;
 import org.apache.tsfile.utils.Pair;
 import org.apache.tsfile.utils.TsFileGeneratorForTest;
 import org.apache.tsfile.utils.TsFileGeneratorUtils;
@@ -49,6 +50,38 @@ import java.util.List;
 
 public class TsFileV4ReadWriteInterfacesTest {
 
+  @Test
+  public void testTsFileProperties() throws IOException {
+    String filePath = TsFileGeneratorForTest.getTestTsFilePath("properties", 
0, 0, 0);
+    File file = new File(filePath);
+    TableSchema tableSchema =
+        new TableSchema(
+            "t1",
+            Arrays.asList(new MeasurementSchema("s1", TSDataType.INT32)),
+            Arrays.asList(ColumnCategory.FIELD));
+
+    try {
+      try (ITsFileWriter writer =
+          new 
TsFileWriterBuilder().file(file).tableSchema(tableSchema).build()) {
+        writer.addTsFileProperty("creator", "TsFileV4ReadWriteInterfacesTest");
+        writer.addTsFileProperty("version", "1");
+      }
+
+      try (TsFileSequenceReader reader = new TsFileSequenceReader(filePath)) {
+        Assert.assertEquals(
+            "TsFileV4ReadWriteInterfacesTest", 
reader.getTsFileProperties().get("creator"));
+        Assert.assertEquals("1", reader.getTsFileProperties().get("version"));
+      }
+      try (ITsFileReader reader = new DeviceTableModelReader(file)) {
+        Assert.assertEquals(
+            "TsFileV4ReadWriteInterfacesTest", 
reader.getTsFileProperties().get("creator"));
+        Assert.assertEquals("1", reader.getTsFileProperties().get("version"));
+      }
+    } finally {
+      Files.deleteIfExists(file.toPath());
+    }
+  }
+
   @Test
   public void testWriteSomeColumns() throws IOException, WriteProcessException 
{
     String filePath = TsFileGeneratorForTest.getTestTsFilePath("db", 0, 0, 0);

Reply via email to