You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tsfile.apache.org by ji...@apache.org on 2026/07/29 10:41:39 UTC
(tsfile) 01/03: add property read-write interface
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 <jt...@163.com>
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);