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

jackietien pushed a commit to branch snapshot/2.0.0-250109
in repository https://gitbox.apache.org/repos/asf/tsfile.git

commit 1ad55931758e5ad86ca4882958c83f6dcbf78723
Author: shuwenwei <[email protected]>
AuthorDate: Thu Jan 9 12:15:49 2025 +0800

    add cache table schema map option (#369)
    
    * add cache table schema map option
    
    * modify method name
    
    * fix ut
---
 .../tsfile/compatibility/CompatibilityUtils.java   |  2 ++
 .../tsfile/compatibility/DeserializeConfig.java    |  4 ++-
 .../tsfile/file/metadata/TsFileMetadata.java       | 26 +++++++++++++--
 .../apache/tsfile/read/TsFileSequenceReader.java   | 39 ++++++++++++++++++++--
 .../tsfile/read/controller/IMetadataQuerier.java   |  3 ++
 .../read/controller/MetadataQuerierByFileImpl.java |  9 +++++
 .../read/query/executor/TableQueryExecutor.java    |  2 +-
 .../tsfile/read/v4/DeviceTableModelReader.java     | 10 +++---
 .../org/apache/tsfile/utils/TsFileSketchTool.java  |  9 ++---
 .../tsfile/file/metadata/TsFileMetadataTest.java   |  2 +-
 .../tsfile/read/TsFileSequenceReaderTest.java      | 37 ++++++++++++++++++++
 .../apache/tsfile/write/TsFileWriteApiTest.java    |  2 +-
 12 files changed, 123 insertions(+), 22 deletions(-)

diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/compatibility/CompatibilityUtils.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/compatibility/CompatibilityUtils.java
index ec0102c5..f8d2ca5d 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/compatibility/CompatibilityUtils.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/compatibility/CompatibilityUtils.java
@@ -42,6 +42,8 @@ public class CompatibilityUtils {
         org.apache.tsfile.common.conf.TSFileConfig.VERSION_NUMBER_V3;
     v3DeserializeConfig.tsFileMetadataBufferDeserializer =
         CompatibilityUtils::deserializeTsFileMetadataFromV3;
+    v3DeserializeConfig.cacheTableSchemaMapTsFileMetadataBufferDeserializer =
+        CompatibilityUtils::deserializeTsFileMetadataFromV3;
     v3DeserializeConfig.deviceIDBufferDeserializer =
         ((buffer, context) -> {
           final PlainDeviceID deviceID = PlainDeviceID.deserialize(buffer);
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/compatibility/DeserializeConfig.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/compatibility/DeserializeConfig.java
index b9228bd0..c11225f9 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/compatibility/DeserializeConfig.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/compatibility/DeserializeConfig.java
@@ -36,7 +36,9 @@ import java.nio.ByteBuffer;
 public class DeserializeConfig {
   public byte versionNumber = 
org.apache.tsfile.common.conf.TSFileConfig.VERSION_NUMBER;
   public BufferDeserializer<TsFileMetadata> tsFileMetadataBufferDeserializer =
-      TsFileMetadata::deserializeFrom;
+      TsFileMetadata::deserializeWithoutCacheTableSchemaMap;
+  public BufferDeserializer<TsFileMetadata> 
cacheTableSchemaMapTsFileMetadataBufferDeserializer =
+      TsFileMetadata::deserializeAndCacheTableSchemaMap;
 
   public BufferDeserializer<MetadataIndexNode> 
deviceMetadataIndexNodeBufferDeserializer =
       (buffer, context) -> MetadataIndexNode.deserializeFrom(buffer, true, 
context);
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 16f1da5d..d7ac19bb 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
@@ -46,6 +46,7 @@ public class TsFileMetadata {
   // List of <name, offset, childMetadataIndexType>
   private Map<String, MetadataIndexNode> tableMetadataIndexNodeMap;
   private Map<String, TableSchema> tableSchemaMap;
+  private boolean hasTableSchemaMapCache;
   private Map<String, String> tsFileProperties;
 
   // offset of MetaMarker.SEPARATOR
@@ -57,13 +58,24 @@ public class TsFileMetadata {
 
   private String encryptType;
 
+  public static TsFileMetadata deserializeAndCacheTableSchemaMap(
+      ByteBuffer buffer, DeserializeConfig context) {
+    return deserializeFrom(buffer, context, true);
+  }
+
+  public static TsFileMetadata deserializeWithoutCacheTableSchemaMap(
+      ByteBuffer buffer, DeserializeConfig context) {
+    return deserializeFrom(buffer, context, false);
+  }
+
   /**
    * deserialize data from the buffer.
    *
    * @param buffer -buffer use to deserialize
    * @return -an instance of TsFileMetaData
    */
-  public static TsFileMetadata deserializeFrom(ByteBuffer buffer, 
DeserializeConfig context) {
+  public static TsFileMetadata deserializeFrom(
+      ByteBuffer buffer, DeserializeConfig context, boolean 
needTableSchemaMap) {
     TsFileMetadata fileMetaData = new TsFileMetadata();
 
     int startPos = buffer.position();
@@ -84,10 +96,13 @@ public class TsFileMetadata {
     for (int i = 0; i < tableSchemaNum; i++) {
       String tableName = ReadWriteIOUtils.readVarIntString(buffer);
       TableSchema tableSchema = 
context.tableSchemaBufferDeserializer.deserialize(buffer, context);
-      tableSchema.setTableName(tableName);
-      tableSchemaMap.put(tableName, tableSchema);
+      if (needTableSchemaMap) {
+        tableSchema.setTableName(tableName);
+        tableSchemaMap.put(tableName, tableSchema);
+      }
     }
     fileMetaData.setTableSchemaMap(tableSchemaMap);
+    fileMetaData.hasTableSchemaMapCache = needTableSchemaMap;
 
     // metaOffset
     long metaOffset = ReadWriteIOUtils.readLong(buffer);
@@ -267,6 +282,7 @@ public class TsFileMetadata {
 
   public void setTableSchemaMap(Map<String, TableSchema> tableSchemaMap) {
     this.tableSchemaMap = tableSchemaMap;
+    this.hasTableSchemaMapCache = true;
   }
 
   public Map<String, MetadataIndexNode> getTableMetadataIndexNodeMap() {
@@ -281,6 +297,10 @@ public class TsFileMetadata {
     return metadataIndexNode;
   }
 
+  public boolean hasTableSchemaMapCache() {
+    return hasTableSchemaMapCache;
+  }
+
   public Map<String, TableSchema> getTableSchemaMap() {
     return tableSchemaMap;
   }
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 127630f3..3f7a171b 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
@@ -22,6 +22,7 @@ package org.apache.tsfile.read;
 import org.apache.tsfile.common.conf.TSFileConfig;
 import org.apache.tsfile.common.conf.TSFileDescriptor;
 import org.apache.tsfile.common.constant.TsFileConstant;
+import org.apache.tsfile.compatibility.BufferDeserializer;
 import org.apache.tsfile.compatibility.CompatibilityUtils;
 import org.apache.tsfile.compatibility.DeserializeConfig;
 import org.apache.tsfile.compress.IUnCompressor;
@@ -52,6 +53,7 @@ import org.apache.tsfile.file.metadata.ITimeSeriesMetadata;
 import org.apache.tsfile.file.metadata.MeasurementMetadataIndexEntry;
 import org.apache.tsfile.file.metadata.MetadataIndexNode;
 import org.apache.tsfile.file.metadata.TableDeviceMetadata;
+import org.apache.tsfile.file.metadata.TableSchema;
 import org.apache.tsfile.file.metadata.TimeseriesMetadata;
 import org.apache.tsfile.file.metadata.TsFileMetadata;
 import org.apache.tsfile.file.metadata.enums.CompressionType;
@@ -134,6 +136,7 @@ public class TsFileSequenceReader implements AutoCloseable {
   private byte fileVersion;
 
   private DeserializeConfig deserializeConfig = new DeserializeConfig();
+  private volatile boolean cacheTableSchemaMap = false;
 
   /**
    * Create a file reader of the given file. The reader will read the tail of 
the file to get the
@@ -285,6 +288,10 @@ public class TsFileSequenceReader implements AutoCloseable 
{
     }
   }
 
+  public void setEnableCacheTableSchemaMap() {
+    this.cacheTableSchemaMap = true;
+  }
+
   public void loadMetadataSize() throws IOException {
     loadMetadataSize(null);
   }
@@ -394,9 +401,7 @@ public class TsFileSequenceReader implements AutoCloseable {
       if (tsFileMetaData == null) {
         synchronized (this) {
           if (tsFileMetaData == null) {
-            tsFileMetaData =
-                deserializeConfig.tsFileMetadataBufferDeserializer.deserialize(
-                    readData(fileMetadataPos, fileMetadataSize, 
ioSizeRecorder), deserializeConfig);
+            tsFileMetaData = forceReadFileMetadata(cacheTableSchemaMap, 
ioSizeRecorder);
           }
         }
       }
@@ -409,6 +414,34 @@ public class TsFileSequenceReader implements AutoCloseable 
{
     return tsFileMetaData;
   }
 
+  public Map<String, TableSchema> getTableSchemaMap() throws IOException {
+    return getTableSchemaMap(null);
+  }
+
+  public Map<String, TableSchema> getTableSchemaMap(LongConsumer 
ioSizeRecorder)
+      throws IOException {
+    if (tsFileMetaData != null && tsFileMetaData.hasTableSchemaMapCache()) {
+      return tsFileMetaData.getTableSchemaMap();
+    }
+    TsFileMetadata tempTsFileMetadata = forceReadFileMetadata(true, 
ioSizeRecorder);
+    if (cacheTableSchemaMap) {
+      synchronized (this) {
+        this.tsFileMetaData = tempTsFileMetadata;
+      }
+    }
+    return tempTsFileMetadata.getTableSchemaMap();
+  }
+
+  private TsFileMetadata forceReadFileMetadata(
+      boolean needTableSchemaMap, LongConsumer ioSizeRecorder) throws 
IOException {
+    ByteBuffer buffer = readData(fileMetadataPos, fileMetadataSize, 
ioSizeRecorder);
+    BufferDeserializer<TsFileMetadata> deserializer =
+        needTableSchemaMap
+            ? 
deserializeConfig.cacheTableSchemaMapTsFileMetadataBufferDeserializer
+            : deserializeConfig.tsFileMetadataBufferDeserializer;
+    return deserializer.deserialize(buffer, deserializeConfig);
+  }
+
   /**
    * This function does not modify the position of the file reader.
    *
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/read/controller/IMetadataQuerier.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/read/controller/IMetadataQuerier.java
index b6d9654a..3503e49e 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/read/controller/IMetadataQuerier.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/read/controller/IMetadataQuerier.java
@@ -24,6 +24,7 @@ import 
org.apache.tsfile.exception.write.NoMeasurementException;
 import org.apache.tsfile.file.metadata.IChunkMetadata;
 import org.apache.tsfile.file.metadata.IDeviceID;
 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.read.common.Path;
 import org.apache.tsfile.read.common.TimeRange;
@@ -55,6 +56,8 @@ public interface IMetadataQuerier {
 
   TsFileMetadata getWholeFileMetadata();
 
+  Map<String, TableSchema> getTableSchemaMap();
+
   /**
    * this will load all chunk metadata of given paths into cache.
    *
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/read/controller/MetadataQuerierByFileImpl.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/read/controller/MetadataQuerierByFileImpl.java
index 47888d01..ae7fb9ee 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/read/controller/MetadataQuerierByFileImpl.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/read/controller/MetadataQuerierByFileImpl.java
@@ -27,6 +27,7 @@ import org.apache.tsfile.file.metadata.IChunkMetadata;
 import org.apache.tsfile.file.metadata.IDeviceID;
 import org.apache.tsfile.file.metadata.ITimeSeriesMetadata;
 import org.apache.tsfile.file.metadata.MetadataIndexNode;
+import org.apache.tsfile.file.metadata.TableSchema;
 import org.apache.tsfile.file.metadata.TimeseriesMetadata;
 import org.apache.tsfile.file.metadata.TsFileMetadata;
 import org.apache.tsfile.read.TsFileSequenceReader;
@@ -60,11 +61,14 @@ public class MetadataQuerierByFileImpl implements 
IMetadataQuerier {
   private LRUCache<Pair<IDeviceID, String>, List<IChunkMetadata>> 
deviceIdChunkMetadataCache;
 
   private TsFileSequenceReader tsFileReader;
+  private Map<String, TableSchema> tableSchemaMap;
 
   /** Constructor of MetadataQuerierByFileImpl. */
   public MetadataQuerierByFileImpl(TsFileSequenceReader tsFileReader) throws 
IOException {
     this.tsFileReader = tsFileReader;
+    this.tsFileReader.setEnableCacheTableSchemaMap();
     this.fileMetaData = tsFileReader.readFileMetadata();
+    this.tableSchemaMap = tsFileReader.getTableSchemaMap();
     deviceIdChunkMetadataCache =
         new LRUCache<Pair<IDeviceID, String>, 
List<IChunkMetadata>>(CACHED_ENTRY_NUMBER) {
           @Override
@@ -127,6 +131,11 @@ public class MetadataQuerierByFileImpl implements 
IMetadataQuerier {
     return fileMetaData;
   }
 
+  @Override
+  public Map<String, TableSchema> getTableSchemaMap() {
+    return tableSchemaMap;
+  }
+
   @Override
   @SuppressWarnings("squid:S3776") // Suppress high Cognitive Complexity 
warning
   public void loadChunkMetaDatas(List<Path> paths) throws IOException {
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/read/query/executor/TableQueryExecutor.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/read/query/executor/TableQueryExecutor.java
index 82c59890..8d178aa4 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/read/query/executor/TableQueryExecutor.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/read/query/executor/TableQueryExecutor.java
@@ -76,7 +76,7 @@ public class TableQueryExecutor {
       throws ReadProcessException {
     TsFileMetadata fileMetadata = metadataQuerier.getWholeFileMetadata();
     MetadataIndexNode tableRoot = 
fileMetadata.getTableMetadataIndexNode(tableName);
-    TableSchema tableSchema = fileMetadata.getTableSchemaMap().get(tableName);
+    TableSchema tableSchema = 
metadataQuerier.getTableSchemaMap().get(tableName);
     if (tableRoot == null || tableSchema == null) {
       return new EmptyTsBlockReader();
     }
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 f9c9870a..894353fa 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
@@ -25,7 +25,6 @@ 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.TableSchema;
-import org.apache.tsfile.file.metadata.TsFileMetadata;
 import org.apache.tsfile.read.TsFileSequenceReader;
 import org.apache.tsfile.read.controller.CachedChunkLoaderImpl;
 import org.apache.tsfile.read.controller.IChunkLoader;
@@ -57,6 +56,7 @@ public class DeviceTableModelReader implements ITsFileReader {
 
   public DeviceTableModelReader(File file) throws IOException {
     this.fileReader = new TsFileSequenceReader(file.getPath());
+    this.fileReader.setEnableCacheTableSchemaMap();
     this.metadataQuerier = new MetadataQuerierByFileImpl(fileReader);
     this.chunkLoader = new CachedChunkLoaderImpl(fileReader);
     this.queryExecutor =
@@ -66,14 +66,13 @@ public class DeviceTableModelReader implements 
ITsFileReader {
 
   @TsFileApi
   public List<TableSchema> getAllTableSchema() throws IOException {
-    Map<String, TableSchema> tableSchemaMap = 
fileReader.readFileMetadata().getTableSchemaMap();
+    Map<String, TableSchema> tableSchemaMap = fileReader.getTableSchemaMap();
     return new ArrayList<>(tableSchemaMap.values());
   }
 
   @TsFileApi
   public Optional<TableSchema> getTableSchemas(String tableName) throws 
IOException {
-    TsFileMetadata tsFileMetadata = fileReader.readFileMetadata();
-    Map<String, TableSchema> tableSchemaMap = 
tsFileMetadata.getTableSchemaMap();
+    Map<String, TableSchema> tableSchemaMap = fileReader.getTableSchemaMap();
     return Optional.ofNullable(tableSchemaMap.get(tableName.toLowerCase()));
   }
 
@@ -81,8 +80,7 @@ public class DeviceTableModelReader implements ITsFileReader {
   public ResultSet query(String tableName, List<String> columnNames, long 
startTime, long endTime)
       throws IOException, NoTableException, NoMeasurementException, 
ReadProcessException {
     String lowerCaseTableName = tableName.toLowerCase();
-    TsFileMetadata tsFileMetadata = fileReader.readFileMetadata();
-    TableSchema tableSchema = 
tsFileMetadata.getTableSchemaMap().get(lowerCaseTableName);
+    TableSchema tableSchema = 
fileReader.getTableSchemaMap().get(lowerCaseTableName);
     if (tableSchema == null) {
       throw new NoTableException(tableName);
     }
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/utils/TsFileSketchTool.java 
b/java/tsfile/src/main/java/org/apache/tsfile/utils/TsFileSketchTool.java
index e7ce355a..2bf2fd5e 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/utils/TsFileSketchTool.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/utils/TsFileSketchTool.java
@@ -202,13 +202,10 @@ public class TsFileSketchTool {
       }
 
       // table schema
-      printlnBoth(
-          pw,
-          String.format("%20s", pos)
-              + "|\tTableSchemaCnt="
-              + tsFileMetaData.getTableSchemaMap().size());
+      Map<String, TableSchema> tableSchemaMap = reader.getTableSchemaMap();
+      printlnBoth(pw, String.format("%20s", pos) + "|\tTableSchemaCnt=" + 
tableSchemaMap.size());
       pos += Integer.BYTES;
-      for (Entry<String, TableSchema> entry : 
tsFileMetaData.getTableSchemaMap().entrySet()) {
+      for (Entry<String, TableSchema> entry : tableSchemaMap.entrySet()) {
         final String tableName = entry.getKey();
         final TableSchema tableSchema = entry.getValue();
 
diff --git 
a/java/tsfile/src/test/java/org/apache/tsfile/file/metadata/TsFileMetadataTest.java
 
b/java/tsfile/src/test/java/org/apache/tsfile/file/metadata/TsFileMetadataTest.java
index 03e22e27..dcf34391 100644
--- 
a/java/tsfile/src/test/java/org/apache/tsfile/file/metadata/TsFileMetadataTest.java
+++ 
b/java/tsfile/src/test/java/org/apache/tsfile/file/metadata/TsFileMetadataTest.java
@@ -72,7 +72,7 @@ public class TsFileMetadataTest {
       ByteBuffer buffer = ByteBuffer.allocate((int) channel.size());
       channel.read(buffer);
       buffer.rewind();
-      metaData = TsFileMetadata.deserializeFrom(buffer, deserializeConfig);
+      metaData = TsFileMetadata.deserializeAndCacheTableSchemaMap(buffer, 
deserializeConfig);
       return metaData;
     } catch (IOException e) {
       e.printStackTrace();
diff --git 
a/java/tsfile/src/test/java/org/apache/tsfile/read/TsFileSequenceReaderTest.java
 
b/java/tsfile/src/test/java/org/apache/tsfile/read/TsFileSequenceReaderTest.java
index 14e97de3..854e80ac 100644
--- 
a/java/tsfile/src/test/java/org/apache/tsfile/read/TsFileSequenceReaderTest.java
+++ 
b/java/tsfile/src/test/java/org/apache/tsfile/read/TsFileSequenceReaderTest.java
@@ -32,6 +32,7 @@ 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.IDeviceID.Factory;
+import org.apache.tsfile.file.metadata.TableSchema;
 import org.apache.tsfile.file.metadata.enums.TSEncoding;
 import org.apache.tsfile.read.common.Path;
 import org.apache.tsfile.utils.BloomFilter;
@@ -40,10 +41,13 @@ import org.apache.tsfile.utils.Pair;
 import org.apache.tsfile.utils.TsFileGeneratorUtils;
 import org.apache.tsfile.write.TsFileWriter;
 import org.apache.tsfile.write.record.TSRecord;
+import org.apache.tsfile.write.record.Tablet;
 import org.apache.tsfile.write.record.datapoint.DoubleDataPoint;
 import org.apache.tsfile.write.schema.IMeasurementSchema;
 import org.apache.tsfile.write.schema.MeasurementSchema;
 import org.apache.tsfile.write.schema.Schema;
+import org.apache.tsfile.write.v4.ITsFileWriter;
+import org.apache.tsfile.write.v4.TsFileWriterBuilder;
 
 import org.junit.After;
 import org.junit.Assert;
@@ -53,7 +57,9 @@ import org.junit.Test;
 import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
+import java.nio.file.Files;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -225,4 +231,35 @@ public class TsFileSequenceReaderTest {
           reader.selfCheck(new Schema(), new ArrayList<>(), false));
     }
   }
+
+  @Test
+  public void testGetTableSchemaMap() throws IOException, 
WriteProcessException {
+    File file = new File(FILE_PATH);
+    try {
+      tsFile.close();
+      Files.deleteIfExists(file.toPath());
+    } catch (IOException ignored) {
+    }
+    TableSchema tableSchema =
+        new TableSchema(
+            "t1",
+            Collections.singletonList(new MeasurementSchema("s1", 
TSDataType.INT32)),
+            Collections.singletonList(Tablet.ColumnCategory.FIELD));
+    try (ITsFileWriter writer =
+        new TsFileWriterBuilder().tableSchema(tableSchema).file(file).build()) 
{
+      Tablet tablet =
+          new Tablet(Collections.singletonList("s1"), 
Collections.singletonList(TSDataType.INT32));
+      tablet.addTimestamp(0, 1);
+      tablet.addValue("s1", 0, 1);
+      writer.write(tablet);
+    }
+    try (TsFileSequenceReader reader = new TsFileSequenceReader(FILE_PATH)) {
+      Assert.assertFalse(reader.readFileMetadata().hasTableSchemaMapCache());
+      Assert.assertEquals(1, reader.getTableSchemaMap().size());
+      Assert.assertFalse(reader.readFileMetadata().hasTableSchemaMapCache());
+      reader.setEnableCacheTableSchemaMap();
+      Assert.assertEquals(1, reader.getTableSchemaMap().size());
+      Assert.assertTrue(reader.readFileMetadata().hasTableSchemaMapCache());
+    }
+  }
 }
diff --git 
a/java/tsfile/src/test/java/org/apache/tsfile/write/TsFileWriteApiTest.java 
b/java/tsfile/src/test/java/org/apache/tsfile/write/TsFileWriteApiTest.java
index 160866e4..c5ecab75 100644
--- a/java/tsfile/src/test/java/org/apache/tsfile/write/TsFileWriteApiTest.java
+++ b/java/tsfile/src/test/java/org/apache/tsfile/write/TsFileWriteApiTest.java
@@ -923,7 +923,7 @@ public class TsFileWriteApiTest {
       writer.writeTable(tablet);
     }
     try (TsFileSequenceReader reader = new TsFileSequenceReader(f.getPath())) {
-      Map<String, TableSchema> tableSchemaMap = 
reader.readFileMetadata().getTableSchemaMap();
+      Map<String, TableSchema> tableSchemaMap = reader.getTableSchemaMap();
       TableSchema tableSchemaInTsFile = tableSchemaMap.get("table1");
       Assert.assertNotNull(tableSchemaInTsFile);
       for (IMeasurementSchema columnSchema : 
tableSchemaInTsFile.getColumnSchemas()) {

Reply via email to