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);
