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

wangchao316 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new b954d0f  [IOTDB-2592] An exception occurred when using TsFile read API 
(#5105)
b954d0f is described below

commit b954d0f74f1f84c56cfb51a049c5a30bf77e8c4e
Author: liuminghui233 <[email protected]>
AuthorDate: Sat Feb 26 16:15:27 2022 +0800

    [IOTDB-2592] An exception occurred when using TsFile read API (#5105)
    
    [IOTDB-2592] An exception occurred when using TsFile read API (#5105)
---
 .../java/org/apache/iotdb/tsfile/Constant.java     |  2 +
 .../iotdb/tsfile/TsFileForceAppendWrite.java       |  1 +
 .../java/org/apache/iotdb/tsfile/TsFileRead.java   | 18 +++---
 .../tsfile/TsFileWriteAlignedWithTSRecord.java     | 16 ++++--
 .../iotdb/tsfile/TsFileWriteAlignedWithTablet.java | 28 +++++----
 .../iotdb/tsfile/TsFileWriteWithTSRecord.java      | 16 ++++--
 .../apache/iotdb/tsfile/TsFileWriteWithTablet.java | 16 ++++--
 .../iotdb/tsfile/read/TsFileSequenceReader.java    | 18 ++++++
 .../read/controller/CachedChunkLoaderImpl.java     | 67 +++++++++++++++++++---
 9 files changed, 139 insertions(+), 43 deletions(-)

diff --git a/example/tsfile/src/main/java/org/apache/iotdb/tsfile/Constant.java 
b/example/tsfile/src/main/java/org/apache/iotdb/tsfile/Constant.java
index 09f4213..3218470 100644
--- a/example/tsfile/src/main/java/org/apache/iotdb/tsfile/Constant.java
+++ b/example/tsfile/src/main/java/org/apache/iotdb/tsfile/Constant.java
@@ -28,4 +28,6 @@ public class Constant {
   static final String SENSOR_3 = "sensor_3";
 
   static final String DEVICE_PREFIX = "device_";
+  static final String DEVICE_1 = "root.sg.device_1";
+  static final String DEVICE_2 = "root.sg.device_2";
 }
diff --git 
a/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileForceAppendWrite.java
 
b/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileForceAppendWrite.java
index 6499b6c..b7e8644 100644
--- 
a/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileForceAppendWrite.java
+++ 
b/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileForceAppendWrite.java
@@ -46,6 +46,7 @@ public class TsFileForceAppendWrite {
     if (f.exists()) {
       Files.delete(f.toPath());
     }
+
     try (TsFileWriter tsFileWriter = new TsFileWriter(f)) {
 
       // add measurements into file schema
diff --git 
a/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileRead.java 
b/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileRead.java
index 9ce88fc..e82ac5f 100644
--- a/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileRead.java
+++ b/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileRead.java
@@ -33,6 +33,11 @@ import 
org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
 import java.io.IOException;
 import java.util.ArrayList;
 
+import static org.apache.iotdb.tsfile.Constant.DEVICE_1;
+import static org.apache.iotdb.tsfile.Constant.SENSOR_1;
+import static org.apache.iotdb.tsfile.Constant.SENSOR_2;
+import static org.apache.iotdb.tsfile.Constant.SENSOR_3;
+
 /**
  * The class is to show how to read TsFile file named "test.tsfile". The 
TsFile file "test.tsfile"
  * is generated from class TsFileWriteWithTSRecord or TsFileWriteWithTablet. 
Run
@@ -40,8 +45,6 @@ import java.util.ArrayList;
  */
 public class TsFileRead {
 
-  private static final String DEVICE1 = "device_1";
-
   private static void queryAndPrint(
       ArrayList<Path> paths, TsFileReader readTsFile, IExpression statement) 
throws IOException {
     QueryExpression queryExpression = QueryExpression.create(paths, statement);
@@ -63,9 +66,9 @@ public class TsFileRead {
 
       // use these paths(all measurements) for all the queries
       ArrayList<Path> paths = new ArrayList<>();
-      paths.add(new Path(DEVICE1, "sensor_1"));
-      paths.add(new Path(DEVICE1, "sensor_2"));
-      paths.add(new Path(DEVICE1, "sensor_3"));
+      paths.add(new Path(DEVICE_1, SENSOR_1));
+      paths.add(new Path(DEVICE_1, SENSOR_2));
+      paths.add(new Path(DEVICE_1, SENSOR_3));
 
       // no filter, should select 1 2 3 4 6 7 8
       queryAndPrint(paths, readTsFile, null);
@@ -79,7 +82,7 @@ public class TsFileRead {
 
       // value filter : device_1.sensor_2 <= 20, should select 1 2 4 6 7
       IExpression valueFilter =
-          new SingleSeriesExpression(new Path(DEVICE1, "sensor_2"), 
ValueFilter.ltEq(20L));
+          new SingleSeriesExpression(new Path(DEVICE_1, SENSOR_2), 
ValueFilter.ltEq(20L));
       queryAndPrint(paths, readTsFile, valueFilter);
 
       // time filter : 4 <= time <= 10, value filter : device_1.sensor_3 >= 
20, should select 4 7 8
@@ -87,8 +90,7 @@ public class TsFileRead {
           BinaryExpression.and(
               new GlobalTimeExpression(TimeFilter.gtEq(4L)),
               new GlobalTimeExpression(TimeFilter.ltEq(10L)));
-      valueFilter =
-          new SingleSeriesExpression(new Path(DEVICE1, "sensor_3"), 
ValueFilter.gtEq(20L));
+      valueFilter = new SingleSeriesExpression(new Path(DEVICE_1, SENSOR_3), 
ValueFilter.gtEq(20L));
       IExpression finalFilter = BinaryExpression.and(timeFilter, valueFilter);
       queryAndPrint(paths, readTsFile, finalFilter);
     }
diff --git 
a/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteAlignedWithTSRecord.java
 
b/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteAlignedWithTSRecord.java
index a6dd75a..a9186b6 100644
--- 
a/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteAlignedWithTSRecord.java
+++ 
b/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteAlignedWithTSRecord.java
@@ -38,6 +38,11 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
+import static org.apache.iotdb.tsfile.Constant.DEVICE_1;
+import static org.apache.iotdb.tsfile.Constant.SENSOR_1;
+import static org.apache.iotdb.tsfile.Constant.SENSOR_2;
+import static org.apache.iotdb.tsfile.Constant.SENSOR_3;
+
 public class TsFileWriteAlignedWithTSRecord {
   private static final Logger logger =
       LoggerFactory.getLogger(TsFileWriteAlignedWithTSRecord.class);
@@ -47,21 +52,22 @@ public class TsFileWriteAlignedWithTSRecord {
     if (f.exists() && !f.delete()) {
       throw new RuntimeException("can not delete " + f.getAbsolutePath());
     }
+
     try (TsFileWriter tsFileWriter = new TsFileWriter(f)) {
       List<MeasurementSchema> measurementSchemas = new ArrayList<>();
-      measurementSchemas.add(new MeasurementSchema("s1", TSDataType.INT64, 
TSEncoding.RLE));
-      measurementSchemas.add(new MeasurementSchema("s2", TSDataType.INT64, 
TSEncoding.RLE));
-      measurementSchemas.add(new MeasurementSchema("s3", TSDataType.INT64, 
TSEncoding.RLE));
+      measurementSchemas.add(new MeasurementSchema(SENSOR_1, TSDataType.INT64, 
TSEncoding.RLE));
+      measurementSchemas.add(new MeasurementSchema(SENSOR_2, TSDataType.INT64, 
TSEncoding.RLE));
+      measurementSchemas.add(new MeasurementSchema(SENSOR_3, TSDataType.INT64, 
TSEncoding.RLE));
 
       // register timeseries
-      tsFileWriter.registerAlignedTimeseries(new Path("root.sg.d1"), 
measurementSchemas);
+      tsFileWriter.registerAlignedTimeseries(new Path(DEVICE_1), 
measurementSchemas);
 
       List<IMeasurementSchema> writeMeasurementScheams = new ArrayList<>();
       // example1
       writeMeasurementScheams.add(measurementSchemas.get(0));
       writeMeasurementScheams.add(measurementSchemas.get(1));
       writeMeasurementScheams.add(measurementSchemas.get(2));
-      writeAligned(tsFileWriter, "root.sg.d1", writeMeasurementScheams, 
1000000, 0, 0);
+      writeAligned(tsFileWriter, DEVICE_1, writeMeasurementScheams, 1000000, 
0, 0);
     } catch (WriteProcessException e) {
       logger.error("write TSRecord failed", e);
     }
diff --git 
a/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteAlignedWithTablet.java
 
b/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteAlignedWithTablet.java
index ecce114..bd14059 100644
--- 
a/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteAlignedWithTablet.java
+++ 
b/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteAlignedWithTablet.java
@@ -36,30 +36,36 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
+import static org.apache.iotdb.tsfile.Constant.DEVICE_1;
+import static org.apache.iotdb.tsfile.Constant.DEVICE_2;
+import static org.apache.iotdb.tsfile.Constant.SENSOR_1;
+import static org.apache.iotdb.tsfile.Constant.SENSOR_2;
+import static org.apache.iotdb.tsfile.Constant.SENSOR_3;
+
 public class TsFileWriteAlignedWithTablet {
   private static final Logger logger = 
LoggerFactory.getLogger(TsFileWriteAlignedWithTablet.class);
-  private static final String deviceId = "root.sg.d1";
 
   public static void main(String[] args) throws IOException {
     File f = FSFactoryProducer.getFSFactory().getFile("alignedTablet.tsfile");
     if (f.exists() && !f.delete()) {
       throw new RuntimeException("can not delete " + f.getAbsolutePath());
     }
+
     try (TsFileWriter tsFileWriter = new TsFileWriter(f)) {
       List<MeasurementSchema> measurementSchemas = new ArrayList<>();
-      measurementSchemas.add(new MeasurementSchema("s1", TSDataType.TEXT, 
TSEncoding.PLAIN));
-      measurementSchemas.add(new MeasurementSchema("s2", TSDataType.TEXT, 
TSEncoding.PLAIN));
-      measurementSchemas.add(new MeasurementSchema("s3", TSDataType.TEXT, 
TSEncoding.PLAIN));
+      measurementSchemas.add(new MeasurementSchema(SENSOR_1, TSDataType.TEXT, 
TSEncoding.PLAIN));
+      measurementSchemas.add(new MeasurementSchema(SENSOR_2, TSDataType.TEXT, 
TSEncoding.PLAIN));
+      measurementSchemas.add(new MeasurementSchema(SENSOR_3, TSDataType.TEXT, 
TSEncoding.PLAIN));
 
       // register align timeseries
-      tsFileWriter.registerAlignedTimeseries(new Path(deviceId), 
measurementSchemas);
+      tsFileWriter.registerAlignedTimeseries(new Path(DEVICE_1), 
measurementSchemas);
 
       List<MeasurementSchema> writeMeasurementScheams = new ArrayList<>();
       // example 1
       writeMeasurementScheams.add(measurementSchemas.get(0));
       writeMeasurementScheams.add(measurementSchemas.get(1));
       writeMeasurementScheams.add(measurementSchemas.get(2));
-      writeAlignedWithTablet(tsFileWriter, deviceId, writeMeasurementScheams, 
200000, 0, 0);
+      writeAlignedWithTablet(tsFileWriter, DEVICE_1, writeMeasurementScheams, 
200000, 0, 0);
 
       writeNonAlignedWithTablet(tsFileWriter); // write nonAligned timeseries
     } catch (WriteProcessException e) {
@@ -104,14 +110,14 @@ public class TsFileWriteAlignedWithTablet {
       throws WriteProcessException, IOException {
     // register nonAlign timeseries
     tsFileWriter.registerTimeseries(
-        new Path("root.sg.d2"), new MeasurementSchema("s1", TSDataType.INT64, 
TSEncoding.RLE));
+        new Path(DEVICE_2), new MeasurementSchema(SENSOR_1, TSDataType.INT64, 
TSEncoding.RLE));
     tsFileWriter.registerTimeseries(
-        new Path("root.sg.d2"), new MeasurementSchema("s2", TSDataType.INT64, 
TSEncoding.RLE));
+        new Path(DEVICE_2), new MeasurementSchema(SENSOR_2, TSDataType.INT64, 
TSEncoding.RLE));
     // construct Tablet
     List<MeasurementSchema> measurementSchemas = new ArrayList<>();
-    measurementSchemas.add(new MeasurementSchema("s1", TSDataType.INT64, 
TSEncoding.RLE));
-    measurementSchemas.add(new MeasurementSchema("s2", TSDataType.INT64, 
TSEncoding.RLE));
-    Tablet tablet = new Tablet("root.sg.d2", measurementSchemas);
+    measurementSchemas.add(new MeasurementSchema(SENSOR_1, TSDataType.INT64, 
TSEncoding.RLE));
+    measurementSchemas.add(new MeasurementSchema(SENSOR_2, TSDataType.INT64, 
TSEncoding.RLE));
+    Tablet tablet = new Tablet(DEVICE_2, measurementSchemas);
     long[] timestamps = tablet.timestamps;
     Object[] values = tablet.values;
     int rowNum = 100;
diff --git 
a/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteWithTSRecord.java
 
b/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteWithTSRecord.java
index 21e7491..004ab10 100644
--- 
a/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteWithTSRecord.java
+++ 
b/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteWithTSRecord.java
@@ -36,12 +36,16 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
+import static org.apache.iotdb.tsfile.Constant.DEVICE_1;
+import static org.apache.iotdb.tsfile.Constant.SENSOR_1;
+import static org.apache.iotdb.tsfile.Constant.SENSOR_2;
+import static org.apache.iotdb.tsfile.Constant.SENSOR_3;
+
 /**
  * An example of writing data with TSRecord to TsFile It uses the interface: 
public void
  * addMeasurement(MeasurementSchema measurementSchema) throws 
WriteProcessException
  */
 public class TsFileWriteWithTSRecord {
-  private static String deviceId = "root.sg.d1";
 
   public static void main(String[] args) {
     try {
@@ -53,19 +57,19 @@ public class TsFileWriteWithTSRecord {
 
       try (TsFileWriter tsFileWriter = new TsFileWriter(f)) {
         List<MeasurementSchema> schemas = new ArrayList<>();
-        schemas.add(new MeasurementSchema("s1", TSDataType.INT64, 
TSEncoding.RLE));
-        schemas.add(new MeasurementSchema("s2", TSDataType.INT64, 
TSEncoding.RLE));
-        schemas.add(new MeasurementSchema("s3", TSDataType.INT64, 
TSEncoding.RLE));
+        schemas.add(new MeasurementSchema(SENSOR_1, TSDataType.INT64, 
TSEncoding.RLE));
+        schemas.add(new MeasurementSchema(SENSOR_2, TSDataType.INT64, 
TSEncoding.RLE));
+        schemas.add(new MeasurementSchema(SENSOR_3, TSDataType.INT64, 
TSEncoding.RLE));
 
         // register timeseries
-        tsFileWriter.registerTimeseries(new Path(deviceId), schemas);
+        tsFileWriter.registerTimeseries(new Path(DEVICE_1), schemas);
 
         List<IMeasurementSchema> writeMeasurementScheams = new ArrayList<>();
         // example1
         writeMeasurementScheams.add(schemas.get(0));
         writeMeasurementScheams.add(schemas.get(1));
         writeMeasurementScheams.add(schemas.get(2));
-        write(tsFileWriter, deviceId, writeMeasurementScheams, 10000, 0, 0);
+        write(tsFileWriter, DEVICE_1, writeMeasurementScheams, 10000, 0, 0);
       }
     } catch (Throwable e) {
       e.printStackTrace();
diff --git 
a/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteWithTablet.java
 
b/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteWithTablet.java
index ebc2f1c..c454e0c 100644
--- 
a/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteWithTablet.java
+++ 
b/example/tsfile/src/main/java/org/apache/iotdb/tsfile/TsFileWriteWithTablet.java
@@ -37,6 +37,11 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
+import static org.apache.iotdb.tsfile.Constant.DEVICE_1;
+import static org.apache.iotdb.tsfile.Constant.SENSOR_1;
+import static org.apache.iotdb.tsfile.Constant.SENSOR_2;
+import static org.apache.iotdb.tsfile.Constant.SENSOR_3;
+
 /** An example of writing data with Tablet to TsFile */
 public class TsFileWriteWithTablet {
 
@@ -49,21 +54,22 @@ public class TsFileWriteWithTablet {
       if (f.exists() && !f.delete()) {
         throw new RuntimeException("can not delete " + f.getAbsolutePath());
       }
+
       try (TsFileWriter tsFileWriter = new TsFileWriter(f)) {
         List<MeasurementSchema> measurementSchemas = new ArrayList<>();
-        measurementSchemas.add(new MeasurementSchema("s1", TSDataType.TEXT, 
TSEncoding.PLAIN));
-        measurementSchemas.add(new MeasurementSchema("s2", TSDataType.TEXT, 
TSEncoding.PLAIN));
-        measurementSchemas.add(new MeasurementSchema("s3", TSDataType.TEXT, 
TSEncoding.PLAIN));
+        measurementSchemas.add(new MeasurementSchema(SENSOR_1, 
TSDataType.TEXT, TSEncoding.PLAIN));
+        measurementSchemas.add(new MeasurementSchema(SENSOR_2, 
TSDataType.TEXT, TSEncoding.PLAIN));
+        measurementSchemas.add(new MeasurementSchema(SENSOR_3, 
TSDataType.TEXT, TSEncoding.PLAIN));
 
         // register nonAligned timeseries
-        tsFileWriter.registerTimeseries(new Path("root.sg.d1"), 
measurementSchemas);
+        tsFileWriter.registerTimeseries(new Path(DEVICE_1), 
measurementSchemas);
 
         List<MeasurementSchema> writeMeasurementScheams = new ArrayList<>();
         // example 1
         writeMeasurementScheams.add(measurementSchemas.get(0));
         writeMeasurementScheams.add(measurementSchemas.get(1));
         writeMeasurementScheams.add(measurementSchemas.get(2));
-        writeWithTablet(tsFileWriter, "root.sg.d1", writeMeasurementScheams, 
10000, 0, 0);
+        writeWithTablet(tsFileWriter, DEVICE_1, writeMeasurementScheams, 
10000, 0, 0);
       }
     } catch (Exception e) {
       logger.error("meet error in TsFileWrite with tablet", e);
diff --git 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileSequenceReader.java 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileSequenceReader.java
index b3b25c5..88834f1 100644
--- 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileSequenceReader.java
+++ 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileSequenceReader.java
@@ -48,6 +48,7 @@ import org.apache.iotdb.tsfile.fileSystem.FSFactoryProducer;
 import org.apache.iotdb.tsfile.read.common.BatchData;
 import org.apache.iotdb.tsfile.read.common.Chunk;
 import org.apache.iotdb.tsfile.read.common.Path;
+import org.apache.iotdb.tsfile.read.controller.CachedChunkLoaderImpl;
 import org.apache.iotdb.tsfile.read.controller.MetadataQuerierByFileImpl;
 import org.apache.iotdb.tsfile.read.reader.TsFileInput;
 import org.apache.iotdb.tsfile.read.reader.page.PageReader;
@@ -1072,6 +1073,23 @@ public class TsFileSequenceReader implements 
AutoCloseable {
   }
 
   /**
+   * read memory chunk.
+   *
+   * @param chunkCacheKey given key of chunk LRUCache
+   * @return chunk
+   */
+  public Chunk readMemChunk(CachedChunkLoaderImpl.ChunkCacheKey chunkCacheKey) 
throws IOException {
+    int chunkHeadSize = 
ChunkHeader.getSerializedSize(chunkCacheKey.getMeasurementUid());
+    ChunkHeader header = 
readChunkHeader(chunkCacheKey.getOffsetOfChunkHeader(), chunkHeadSize);
+    ByteBuffer buffer =
+        readChunk(
+            chunkCacheKey.getOffsetOfChunkHeader() + 
header.getSerializedSize(),
+            header.getDataSize());
+    return new Chunk(
+        header, buffer, chunkCacheKey.getDeleteIntervalList(), 
chunkCacheKey.getStatistics());
+  }
+
+  /**
    * not thread safe.
    *
    * @param type given tsfile data type
diff --git 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/controller/CachedChunkLoaderImpl.java
 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/controller/CachedChunkLoaderImpl.java
index 4668d4d..c0f76b5 100644
--- 
a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/controller/CachedChunkLoaderImpl.java
+++ 
b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/controller/CachedChunkLoaderImpl.java
@@ -21,20 +21,25 @@ package org.apache.iotdb.tsfile.read.controller;
 import org.apache.iotdb.tsfile.common.cache.LRUCache;
 import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata;
 import org.apache.iotdb.tsfile.file.metadata.IChunkMetadata;
+import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
 import org.apache.iotdb.tsfile.read.TsFileSequenceReader;
 import org.apache.iotdb.tsfile.read.common.Chunk;
+import org.apache.iotdb.tsfile.read.common.TimeRange;
 import org.apache.iotdb.tsfile.read.filter.basic.Filter;
 import org.apache.iotdb.tsfile.read.reader.IChunkReader;
 import org.apache.iotdb.tsfile.read.reader.chunk.ChunkReader;
 
 import java.io.IOException;
+import java.io.Serializable;
+import java.util.List;
+import java.util.Objects;
 
 /** Read one Chunk and cache it into a LRUCache, only used in tsfile module. */
 public class CachedChunkLoaderImpl implements IChunkLoader {
 
   private static final int DEFAULT_CHUNK_CACHE_SIZE = 1000;
   private TsFileSequenceReader reader;
-  private LRUCache<ChunkMetadata, Chunk> chunkCache;
+  private LRUCache<ChunkCacheKey, Chunk> chunkCache;
 
   public CachedChunkLoaderImpl(TsFileSequenceReader fileSequenceReader) {
     this(fileSequenceReader, DEFAULT_CHUNK_CACHE_SIZE);
@@ -51,19 +56,18 @@ public class CachedChunkLoaderImpl implements IChunkLoader {
     this.reader = fileSequenceReader;
 
     chunkCache =
-        new LRUCache<ChunkMetadata, Chunk>(cacheSize) {
+        new LRUCache<ChunkCacheKey, Chunk>(cacheSize) {
 
           @Override
-          public Chunk loadObjectByKey(ChunkMetadata metaData) throws 
IOException {
-            return reader.readMemChunk(metaData);
+          protected Chunk loadObjectByKey(ChunkCacheKey chunkCacheKey) throws 
IOException {
+            return reader.readMemChunk(chunkCacheKey);
           }
         };
   }
 
   @Override
   public Chunk loadChunk(ChunkMetadata chunkMetaData) throws IOException {
-    chunkMetaData.setFilePath(reader.getFileName());
-    Chunk chunk = chunkCache.get(chunkMetaData);
+    Chunk chunk = chunkCache.get(new ChunkCacheKey(chunkMetaData));
     return new Chunk(
         chunk.getHeader(),
         chunk.getData().duplicate(),
@@ -79,8 +83,7 @@ public class CachedChunkLoaderImpl implements IChunkLoader {
   @Override
   public IChunkReader getChunkReader(IChunkMetadata chunkMetaData, Filter 
timeFilter)
       throws IOException {
-    chunkMetaData.setFilePath(reader.getFileName());
-    Chunk chunk = chunkCache.get((ChunkMetadata) chunkMetaData);
+    Chunk chunk = chunkCache.get(new ChunkCacheKey((ChunkMetadata) 
chunkMetaData));
     return new ChunkReader(
         new Chunk(
             chunk.getHeader(),
@@ -89,4 +92,52 @@ public class CachedChunkLoaderImpl implements IChunkLoader {
             chunkMetaData.getStatistics()),
         timeFilter);
   }
+
+  public static class ChunkCacheKey {
+
+    private final Long offsetOfChunkHeader;
+    private final String measurementUid;
+    private final List<TimeRange> deleteIntervalList;
+    private final Statistics<? extends Serializable> statistics;
+
+    public ChunkCacheKey(ChunkMetadata chunkMetadata) {
+      offsetOfChunkHeader = chunkMetadata.getOffsetOfChunkHeader();
+      measurementUid = chunkMetadata.getMeasurementUid();
+      deleteIntervalList = chunkMetadata.getDeleteIntervalList();
+      statistics = chunkMetadata.getStatistics();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+      if (this == o) {
+        return true;
+      }
+      if (o == null || getClass() != o.getClass()) {
+        return false;
+      }
+      ChunkCacheKey that = (ChunkCacheKey) o;
+      return Objects.equals(offsetOfChunkHeader, that.offsetOfChunkHeader);
+    }
+
+    @Override
+    public int hashCode() {
+      return Objects.hash(offsetOfChunkHeader);
+    }
+
+    public Long getOffsetOfChunkHeader() {
+      return offsetOfChunkHeader;
+    }
+
+    public String getMeasurementUid() {
+      return measurementUid;
+    }
+
+    public List<TimeRange> getDeleteIntervalList() {
+      return deleteIntervalList;
+    }
+
+    public Statistics<? extends Serializable> getStatistics() {
+      return statistics;
+    }
+  }
 }

Reply via email to