You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ha...@apache.org on 2021/09/28 01:20:03 UTC

[iotdb] branch master updated: [ISSUE-4047]: Generic type in Statistics extend Serializable (#4048)

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

haonan 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 8e5519d  [ISSUE-4047]: Generic type in Statistics extend Serializable (#4048)
8e5519d is described below

commit 8e5519d783001b866337fd1ab7fb4d666cd73e6b
Author: Wenjun Ruan <we...@apache.org>
AuthorDate: Tue Sep 28 09:19:38 2021 +0800

    [ISSUE-4047]: Generic type in Statistics extend Serializable (#4048)
---
 .../db/engine/storagegroup/TsFileResource.java     |  5 ++--
 .../iotdb/tsfile/file/header/PageHeader.java       | 15 ++++++-----
 .../iotdb/tsfile/file/metadata/ChunkMetadata.java  | 13 +++++++---
 .../iotdb/tsfile/file/metadata/IChunkMetadata.java |  3 ++-
 .../tsfile/file/metadata/TimeseriesMetadata.java   |  9 ++++---
 .../file/metadata/statistics/BinaryStatistics.java |  2 +-
 .../metadata/statistics/BooleanStatistics.java     |  2 +-
 .../file/metadata/statistics/DoubleStatistics.java |  2 +-
 .../file/metadata/statistics/FloatStatistics.java  |  2 +-
 .../metadata/statistics/IntegerStatistics.java     |  2 +-
 .../file/metadata/statistics/LongStatistics.java   |  2 +-
 .../file/metadata/statistics/Statistics.java       | 29 ++++++++++++----------
 .../file/metadata/statistics/TimeStatistics.java   |  4 +--
 .../iotdb/tsfile/read/TsFileSequenceReader.java    |  4 ++-
 .../iotdb/tsfile/v2/file/header/PageHeaderV2.java  |  5 ++--
 .../tsfile/v2/file/metadata/ChunkMetadataV2.java   |  3 ++-
 .../v2/file/metadata/statistics/StatisticsV2.java  | 14 +++++------
 .../iotdb/tsfile/write/chunk/ChunkWriterImpl.java  |  7 +++---
 .../iotdb/tsfile/write/chunk/ValueChunkWriter.java |  3 ++-
 .../apache/iotdb/tsfile/write/page/PageWriter.java |  5 ++--
 .../iotdb/tsfile/write/page/ValuePageWriter.java   |  5 ++--
 .../iotdb/tsfile/write/writer/TsFileIOWriter.java  |  3 ++-
 .../tsfile/file/metadata/utils/TestHelper.java     |  8 ++++--
 23 files changed, 87 insertions(+), 60 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileResource.java b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileResource.java
index b6f07d9..46be2b9 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileResource.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileResource.java
@@ -51,6 +51,7 @@ import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.io.Serializable;
 import java.nio.file.FileAlreadyExistsException;
 import java.nio.file.Files;
 import java.nio.file.Paths;
@@ -237,7 +238,7 @@ public class TsFileResource {
     }
     if (timeTimeSeriesMetadata.getTSDataType() != null) {
       if (timeTimeSeriesMetadata.getTSDataType() == TSDataType.VECTOR) {
-        Statistics<?> timeStatistics =
+        Statistics<? extends Serializable> timeStatistics =
             Statistics.getStatsByType(timeTimeSeriesMetadata.getTSDataType());
 
         List<TimeseriesMetadata> valueTimeSeriesMetadataList = new ArrayList<>();
@@ -303,7 +304,7 @@ public class TsFileResource {
         timeSeriesMetadata =
             new VectorTimeSeriesMetadata(timeTimeSeriesMetadata, valueTimeSeriesMetadataList);
       } else {
-        Statistics<?> seriesStatistics =
+        Statistics<? extends Serializable> seriesStatistics =
             Statistics.getStatsByType(timeTimeSeriesMetadata.getTSDataType());
         // flush chunkMetadataList one by one
         for (IChunkMetadata chunkMetadata : chunkMetadataList) {
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/header/PageHeader.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/header/PageHeader.java
index 178a0a5..51c566f 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/header/PageHeader.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/header/PageHeader.java
@@ -26,16 +26,18 @@ import org.apache.iotdb.tsfile.utils.ReadWriteForEncodingUtils;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.io.Serializable;
 import java.nio.ByteBuffer;
 
 public class PageHeader {
 
   private int uncompressedSize;
   private int compressedSize;
-  private Statistics statistics;
+  private Statistics<? extends Serializable> statistics;
   private boolean modified;
 
-  public PageHeader(int uncompressedSize, int compressedSize, Statistics statistics) {
+  public PageHeader(
+      int uncompressedSize, int compressedSize, Statistics<? extends Serializable> statistics) {
     this.uncompressedSize = uncompressedSize;
     this.compressedSize = compressedSize;
     this.statistics = statistics;
@@ -53,7 +55,7 @@ public class PageHeader {
       InputStream inputStream, TSDataType dataType, boolean hasStatistic) throws IOException {
     int uncompressedSize = ReadWriteForEncodingUtils.readUnsignedVarInt(inputStream);
     int compressedSize = ReadWriteForEncodingUtils.readUnsignedVarInt(inputStream);
-    Statistics statistics = null;
+    Statistics<? extends Serializable> statistics = null;
     if (hasStatistic) {
       statistics = Statistics.deserialize(inputStream, dataType);
     }
@@ -63,11 +65,12 @@ public class PageHeader {
   public static PageHeader deserializeFrom(ByteBuffer buffer, TSDataType dataType) {
     int uncompressedSize = ReadWriteForEncodingUtils.readUnsignedVarInt(buffer);
     int compressedSize = ReadWriteForEncodingUtils.readUnsignedVarInt(buffer);
-    Statistics statistics = Statistics.deserialize(buffer, dataType);
+    Statistics<? extends Serializable> statistics = Statistics.deserialize(buffer, dataType);
     return new PageHeader(uncompressedSize, compressedSize, statistics);
   }
 
-  public static PageHeader deserializeFrom(ByteBuffer buffer, Statistics chunkStatistic) {
+  public static PageHeader deserializeFrom(
+      ByteBuffer buffer, Statistics<? extends Serializable> chunkStatistic) {
     int uncompressedSize = ReadWriteForEncodingUtils.readUnsignedVarInt(buffer);
     int compressedSize = ReadWriteForEncodingUtils.readUnsignedVarInt(buffer);
     return new PageHeader(uncompressedSize, compressedSize, chunkStatistic);
@@ -93,7 +96,7 @@ public class PageHeader {
     return statistics.getCount();
   }
 
-  public Statistics getStatistics() {
+  public Statistics<? extends Serializable> getStatistics() {
     return statistics;
   }
 
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ChunkMetadata.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ChunkMetadata.java
index 59d74fd..bbc4f6d 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ChunkMetadata.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ChunkMetadata.java
@@ -29,6 +29,7 @@ import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
 
 import java.io.IOException;
 import java.io.OutputStream;
+import java.io.Serializable;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.List;
@@ -60,7 +61,7 @@ public class ChunkMetadata implements Accountable, IChunkMetadata {
   /** ChunkLoader of metadata, used to create ChunkReaderWrap */
   private IChunkLoader chunkLoader;
 
-  private Statistics statistics;
+  private Statistics<? extends Serializable> statistics;
 
   private boolean isFromOldTsFile = false;
 
@@ -85,7 +86,10 @@ public class ChunkMetadata implements Accountable, IChunkMetadata {
    * @param statistics value statistics
    */
   public ChunkMetadata(
-      String measurementUid, TSDataType tsDataType, long fileOffset, Statistics statistics) {
+      String measurementUid,
+      TSDataType tsDataType,
+      long fileOffset,
+      Statistics<? extends Serializable> statistics) {
     this.measurementUid = measurementUid;
     this.tsDataType = tsDataType;
     this.offsetOfChunkHeader = fileOffset;
@@ -118,7 +122,7 @@ public class ChunkMetadata implements Accountable, IChunkMetadata {
   }
 
   @Override
-  public Statistics getStatistics() {
+  public Statistics<? extends Serializable> getStatistics() {
     return statistics;
   }
 
@@ -292,7 +296,8 @@ public class ChunkMetadata implements Accountable, IChunkMetadata {
   }
 
   public void mergeChunkMetadata(ChunkMetadata chunkMetadata) {
-    this.statistics.mergeStatistics(chunkMetadata.getStatistics());
+    Statistics<? extends Serializable> statistics = chunkMetadata.getStatistics();
+    this.statistics.mergeStatistics(statistics);
     this.ramSize = calculateRamSize();
   }
 
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IChunkMetadata.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IChunkMetadata.java
index ace5afa..3893d15 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IChunkMetadata.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/IChunkMetadata.java
@@ -26,11 +26,12 @@ import org.apache.iotdb.tsfile.read.controller.IChunkLoader;
 
 import java.io.IOException;
 import java.io.OutputStream;
+import java.io.Serializable;
 import java.util.List;
 
 public interface IChunkMetadata {
 
-  Statistics getStatistics();
+  Statistics<? extends Serializable> getStatistics();
 
   boolean isModified();
 
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadata.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadata.java
index aeca568..2881711 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadata.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadata.java
@@ -30,6 +30,7 @@ import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
 
 import java.io.IOException;
 import java.io.OutputStream;
+import java.io.Serializable;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.List;
@@ -56,7 +57,7 @@ public class TimeseriesMetadata implements Accountable, ITimeSeriesMetadata {
   private String measurementId;
   private TSDataType dataType;
 
-  private Statistics<?> statistics;
+  private Statistics<? extends Serializable> statistics;
 
   // modified is true when there are modifications of the series, or from unseq file
   private boolean modified;
@@ -80,7 +81,7 @@ public class TimeseriesMetadata implements Accountable, ITimeSeriesMetadata {
       int chunkMetaDataListDataSize,
       String measurementId,
       TSDataType dataType,
-      Statistics statistics,
+      Statistics<? extends Serializable> statistics,
       PublicBAOS chunkMetadataListBuffer) {
     this.timeSeriesMetadataType = timeSeriesMetadataType;
     this.chunkMetaDataListDataSize = chunkMetaDataListDataSize;
@@ -192,11 +193,11 @@ public class TimeseriesMetadata implements Accountable, ITimeSeriesMetadata {
   }
 
   @Override
-  public Statistics getStatistics() {
+  public Statistics<? extends Serializable> getStatistics() {
     return statistics;
   }
 
-  public void setStatistics(Statistics statistics) {
+  public void setStatistics(Statistics<? extends Serializable> statistics) {
     this.statistics = statistics;
   }
 
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/BinaryStatistics.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/BinaryStatistics.java
index 4641a01..593db6c 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/BinaryStatistics.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/BinaryStatistics.java
@@ -109,7 +109,7 @@ public class BinaryStatistics extends Statistics<Binary> {
   }
 
   @Override
-  protected void mergeStatisticsValue(Statistics stats) {
+  protected void mergeStatisticsValue(Statistics<Binary> stats) {
     BinaryStatistics stringStats = (BinaryStatistics) stats;
     if (isEmpty) {
       initializeStats(stringStats.getFirstValue(), stringStats.getLastValue());
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/BooleanStatistics.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/BooleanStatistics.java
index 484d846..83ed06f 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/BooleanStatistics.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/BooleanStatistics.java
@@ -158,7 +158,7 @@ public class BooleanStatistics extends Statistics<Boolean> {
   }
 
   @Override
-  protected void mergeStatisticsValue(Statistics stats) {
+  protected void mergeStatisticsValue(Statistics<Boolean> stats) {
     BooleanStatistics boolStats = (BooleanStatistics) stats;
     if (isEmpty) {
       initializeStats(boolStats.getFirstValue(), boolStats.getLastValue(), boolStats.sumValue);
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/DoubleStatistics.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/DoubleStatistics.java
index 285946d..11d7dbd 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/DoubleStatistics.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/DoubleStatistics.java
@@ -161,7 +161,7 @@ public class DoubleStatistics extends Statistics<Double> {
   }
 
   @Override
-  protected void mergeStatisticsValue(Statistics stats) {
+  protected void mergeStatisticsValue(Statistics<Double> stats) {
     DoubleStatistics doubleStats = (DoubleStatistics) stats;
     if (this.isEmpty) {
       initializeStats(
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/FloatStatistics.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/FloatStatistics.java
index 45ba7ed..2870ed2 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/FloatStatistics.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/FloatStatistics.java
@@ -153,7 +153,7 @@ public class FloatStatistics extends Statistics<Float> {
   }
 
   @Override
-  protected void mergeStatisticsValue(Statistics stats) {
+  protected void mergeStatisticsValue(Statistics<Float> stats) {
     FloatStatistics floatStats = (FloatStatistics) stats;
     if (isEmpty) {
       initializeStats(
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/IntegerStatistics.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/IntegerStatistics.java
index f70d847..831a697 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/IntegerStatistics.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/IntegerStatistics.java
@@ -153,7 +153,7 @@ public class IntegerStatistics extends Statistics<Integer> {
   }
 
   @Override
-  protected void mergeStatisticsValue(Statistics stats) {
+  protected void mergeStatisticsValue(Statistics<Integer> stats) {
     IntegerStatistics intStats = (IntegerStatistics) stats;
     if (isEmpty) {
       initializeStats(
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/LongStatistics.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/LongStatistics.java
index e3dc70d..849bd41 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/LongStatistics.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/LongStatistics.java
@@ -162,7 +162,7 @@ public class LongStatistics extends Statistics<Long> {
   }
 
   @Override
-  protected void mergeStatisticsValue(Statistics stats) {
+  protected void mergeStatisticsValue(Statistics<Long> stats) {
     LongStatistics longStats = (LongStatistics) stats;
     if (isEmpty) {
       initializeStats(
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/Statistics.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/Statistics.java
index cd1abe1..abec0e7 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/Statistics.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/Statistics.java
@@ -31,6 +31,7 @@ import org.slf4j.LoggerFactory;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.io.Serializable;
 import java.nio.ByteBuffer;
 import java.util.Objects;
 
@@ -43,7 +44,7 @@ import java.util.Objects;
  * For the statistics in the Unseq file TimeSeriesMetadata, only firstValue, lastValue, startTime
  * and endTime can be used.</br>
  */
-public abstract class Statistics<T> {
+public abstract class Statistics<T extends Serializable> {
 
   private static final Logger LOG = LoggerFactory.getLogger(Statistics.class);
   /**
@@ -63,7 +64,7 @@ public abstract class Statistics<T> {
    * @param type - data type
    * @return Statistics
    */
-  public static Statistics getStatsByType(TSDataType type) {
+  public static Statistics<? extends Serializable> getStatsByType(TSDataType type) {
     switch (type) {
       case INT32:
         return new IntegerStatistics();
@@ -171,7 +172,8 @@ public abstract class Statistics<T> {
    *
    * @throws StatisticsClassException cannot merge statistics
    */
-  public void mergeStatistics(Statistics stats) {
+  @SuppressWarnings("unchecked")
+  public void mergeStatistics(Statistics<? extends Serializable> stats) {
     if (this.getClass() == stats.getClass()) {
       if (stats.startTime < this.startTime) {
         this.startTime = stats.startTime;
@@ -181,14 +183,14 @@ public abstract class Statistics<T> {
       }
       // must be sure no overlap between two statistics
       this.count += stats.count;
-      mergeStatisticsValue(stats);
+      mergeStatisticsValue((Statistics<T>) stats);
       isEmpty = false;
     } else {
-      String thisClass = this.getClass().toString();
-      String statsClass = stats.getClass().toString();
+      Class<?> thisClass = this.getClass();
+      Class<?> statsClass = stats.getClass();
       LOG.warn("Statistics classes mismatched,no merge: {} v.s. {}", thisClass, statsClass);
 
-      throw new StatisticsClassException(this.getClass(), stats.getClass());
+      throw new StatisticsClassException(thisClass, statsClass);
     }
   }
 
@@ -272,7 +274,7 @@ public abstract class Statistics<T> {
     count += batchSize;
   }
 
-  protected abstract void mergeStatisticsValue(Statistics stats);
+  protected abstract void mergeStatisticsValue(Statistics<T> stats);
 
   public boolean isEmpty() {
     return isEmpty;
@@ -341,9 +343,9 @@ public abstract class Statistics<T> {
     throw new UnsupportedOperationException();
   }
 
-  public static Statistics deserialize(InputStream inputStream, TSDataType dataType)
-      throws IOException {
-    Statistics statistics = getStatsByType(dataType);
+  public static Statistics<? extends Serializable> deserialize(
+      InputStream inputStream, TSDataType dataType) throws IOException {
+    Statistics<? extends Serializable> statistics = getStatsByType(dataType);
     statistics.setCount(ReadWriteForEncodingUtils.readUnsignedVarInt(inputStream));
     statistics.setStartTime(ReadWriteIOUtils.readLong(inputStream));
     statistics.setEndTime(ReadWriteIOUtils.readLong(inputStream));
@@ -352,8 +354,9 @@ public abstract class Statistics<T> {
     return statistics;
   }
 
-  public static Statistics deserialize(ByteBuffer buffer, TSDataType dataType) {
-    Statistics statistics = getStatsByType(dataType);
+  public static Statistics<? extends Serializable> deserialize(
+      ByteBuffer buffer, TSDataType dataType) {
+    Statistics<? extends Serializable> statistics = getStatsByType(dataType);
     statistics.setCount(ReadWriteForEncodingUtils.readUnsignedVarInt(buffer));
     statistics.setStartTime(ReadWriteIOUtils.readLong(buffer));
     statistics.setEndTime(ReadWriteIOUtils.readLong(buffer));
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/TimeStatistics.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/TimeStatistics.java
index e812166..8ed2778 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/TimeStatistics.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/statistics/TimeStatistics.java
@@ -26,7 +26,7 @@ import java.io.InputStream;
 import java.io.OutputStream;
 import java.nio.ByteBuffer;
 
-public class TimeStatistics extends Statistics {
+public class TimeStatistics extends Statistics<Long> {
 
   static final int TIME_STATISTICS_FIXED_RAM_SIZE = 40;
 
@@ -96,7 +96,7 @@ public class TimeStatistics extends Statistics {
   }
 
   @Override
-  protected void mergeStatisticsValue(Statistics stats) {}
+  protected void mergeStatisticsValue(Statistics<Long> stats) {}
 
   @Override
   public byte[] getMinValueBytes() {
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 16b1a2a..de7ead8 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
@@ -57,6 +57,7 @@ import org.slf4j.LoggerFactory;
 
 import java.io.File;
 import java.io.IOException;
+import java.io.Serializable;
 import java.nio.BufferOverflowException;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
@@ -1060,7 +1061,8 @@ public class TsFileSequenceReader implements AutoCloseable {
                     chunkHeader.getCompressionType());
             measurementSchemaList.add(measurementSchema);
             dataType = chunkHeader.getDataType();
-            Statistics<?> chunkStatistics = Statistics.getStatsByType(dataType);
+            Statistics<? extends Serializable> chunkStatistics =
+                Statistics.getStatsByType(dataType);
             int dataSize = chunkHeader.getDataSize();
             if (((byte) (chunkHeader.getChunkType() & 0x3F)) == MetaMarker.CHUNK_HEADER) {
               while (dataSize > 0) {
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/v2/file/header/PageHeaderV2.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/v2/file/header/PageHeaderV2.java
index 9302d64..6de0aba 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/v2/file/header/PageHeaderV2.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/v2/file/header/PageHeaderV2.java
@@ -26,6 +26,7 @@ import org.apache.iotdb.tsfile.v2.file.metadata.statistics.StatisticsV2;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.Serializable;
 import java.nio.ByteBuffer;
 
 public class PageHeaderV2 {
@@ -36,14 +37,14 @@ public class PageHeaderV2 {
       throws IOException {
     int uncompressedSize = ReadWriteIOUtils.readInt(inputStream);
     int compressedSize = ReadWriteIOUtils.readInt(inputStream);
-    Statistics<?> statistics = StatisticsV2.deserialize(inputStream, dataType);
+    Statistics<? extends Serializable> statistics = StatisticsV2.deserialize(inputStream, dataType);
     return new PageHeader(uncompressedSize, compressedSize, statistics);
   }
 
   public static PageHeader deserializeFrom(ByteBuffer buffer, TSDataType dataType) {
     int uncompressedSize = ReadWriteIOUtils.readInt(buffer);
     int compressedSize = ReadWriteIOUtils.readInt(buffer);
-    Statistics<?> statistics = StatisticsV2.deserialize(buffer, dataType);
+    Statistics<? extends Serializable> statistics = StatisticsV2.deserialize(buffer, dataType);
     return new PageHeader(uncompressedSize, compressedSize, statistics);
   }
 }
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/v2/file/metadata/ChunkMetadataV2.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/v2/file/metadata/ChunkMetadataV2.java
index ae172c5..2b329d4 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/v2/file/metadata/ChunkMetadataV2.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/v2/file/metadata/ChunkMetadataV2.java
@@ -24,6 +24,7 @@ import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
 import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
 import org.apache.iotdb.tsfile.v2.file.metadata.statistics.StatisticsV2;
 
+import java.io.Serializable;
 import java.nio.ByteBuffer;
 
 public class ChunkMetadataV2 {
@@ -42,7 +43,7 @@ public class ChunkMetadataV2 {
     long offsetOfChunkHeader = ReadWriteIOUtils.readLong(buffer);
     TSDataType tsDataType = TSDataType.deserialize((byte) ReadWriteIOUtils.readShort(buffer));
 
-    Statistics<?> statistics = StatisticsV2.deserialize(buffer, tsDataType);
+    Statistics<? extends Serializable> statistics = StatisticsV2.deserialize(buffer, tsDataType);
     ChunkMetadata chunkMetaData =
         new ChunkMetadata(measurementUid, tsDataType, offsetOfChunkHeader, statistics);
     chunkMetaData.setFromOldTsFile(true);
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/v2/file/metadata/statistics/StatisticsV2.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/v2/file/metadata/statistics/StatisticsV2.java
index 4bdd28c..24b06f7 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/v2/file/metadata/statistics/StatisticsV2.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/v2/file/metadata/statistics/StatisticsV2.java
@@ -27,16 +27,16 @@ import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.Serializable;
 import java.nio.ByteBuffer;
 
 public class StatisticsV2 {
 
   private StatisticsV2() {}
 
-  @SuppressWarnings("rawtypes")
-  public static Statistics deserialize(InputStream inputStream, TSDataType dataType)
-      throws IOException {
-    Statistics<?> statistics = Statistics.getStatsByType(dataType);
+  public static Statistics<? extends Serializable> deserialize(
+      InputStream inputStream, TSDataType dataType) throws IOException {
+    Statistics<? extends Serializable> statistics = Statistics.getStatsByType(dataType);
     statistics.setCount((int) ReadWriteIOUtils.readLong(inputStream));
     statistics.setStartTime(ReadWriteIOUtils.readLong(inputStream));
     statistics.setEndTime(ReadWriteIOUtils.readLong(inputStream));
@@ -68,9 +68,9 @@ public class StatisticsV2 {
     return statistics;
   }
 
-  @SuppressWarnings("rawtypes")
-  public static Statistics deserialize(ByteBuffer buffer, TSDataType dataType) {
-    Statistics<?> statistics = Statistics.getStatsByType(dataType);
+  public static Statistics<? extends Serializable> deserialize(
+      ByteBuffer buffer, TSDataType dataType) {
+    Statistics<? extends Serializable> statistics = Statistics.getStatsByType(dataType);
     statistics.setCount((int) ReadWriteIOUtils.readLong(buffer));
     statistics.setStartTime(ReadWriteIOUtils.readLong(buffer));
     statistics.setEndTime(ReadWriteIOUtils.readLong(buffer));
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/ChunkWriterImpl.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/ChunkWriterImpl.java
index e66ed69..aed1bcb 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/ChunkWriterImpl.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/ChunkWriterImpl.java
@@ -37,6 +37,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
+import java.io.Serializable;
 import java.nio.ByteBuffer;
 import java.nio.channels.Channels;
 import java.nio.channels.WritableByteChannel;
@@ -69,7 +70,7 @@ public class ChunkWriterImpl implements IChunkWriter {
   private static final int MINIMUM_RECORD_COUNT_FOR_CHECK = 1500;
 
   /** statistic of this chunk. */
-  private Statistics<?> statistics;
+  private Statistics<? extends Serializable> statistics;
 
   /** SDT parameters */
   private boolean isSdtEncoding;
@@ -433,8 +434,8 @@ public class ChunkWriterImpl implements IChunkWriter {
    * @param statistics the chunk statistics
    * @throws IOException exception in IO
    */
-  private void writeAllPagesOfChunkToTsFile(TsFileIOWriter writer, Statistics<?> statistics)
-      throws IOException {
+  private void writeAllPagesOfChunkToTsFile(
+      TsFileIOWriter writer, Statistics<? extends Serializable> statistics) throws IOException {
     if (statistics.getCount() == 0) {
       return;
     }
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/ValueChunkWriter.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/ValueChunkWriter.java
index d117722..0860a2e 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/ValueChunkWriter.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/ValueChunkWriter.java
@@ -36,6 +36,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
+import java.io.Serializable;
 
 public class ValueChunkWriter {
 
@@ -58,7 +59,7 @@ public class ValueChunkWriter {
   private ValuePageWriter pageWriter;
 
   /** statistic of this chunk. */
-  private Statistics<?> statistics;
+  private Statistics<? extends Serializable> statistics;
 
   /** first page info */
   private int sizeWithoutStatistic;
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/page/PageWriter.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/page/PageWriter.java
index 5fa9977..f003825 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/page/PageWriter.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/page/PageWriter.java
@@ -32,6 +32,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
+import java.io.Serializable;
 import java.nio.ByteBuffer;
 import java.nio.channels.Channels;
 import java.nio.channels.WritableByteChannel;
@@ -57,7 +58,7 @@ public class PageWriter {
    * statistic of current page. It will be reset after calling {@code
    * writePageHeaderAndDataIntoBuff()}
    */
-  private Statistics<?> statistics;
+  private Statistics<? extends Serializable> statistics;
 
   public PageWriter() {
     this(null, null);
@@ -285,7 +286,7 @@ public class PageWriter {
     return statistics.getCount();
   }
 
-  public Statistics<?> getStatistics() {
+  public Statistics<? extends Serializable> getStatistics() {
     return statistics;
   }
 }
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/page/ValuePageWriter.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/page/ValuePageWriter.java
index 0fbfdbd..3293cfd 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/page/ValuePageWriter.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/page/ValuePageWriter.java
@@ -31,6 +31,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
+import java.io.Serializable;
 import java.nio.ByteBuffer;
 import java.nio.channels.Channels;
 import java.nio.channels.WritableByteChannel;
@@ -52,7 +53,7 @@ public class ValuePageWriter {
    * statistic of current page. It will be reset after calling {@code
    * writePageHeaderAndDataIntoBuff()}
    */
-  private Statistics<?> statistics;
+  private Statistics<? extends Serializable> statistics;
 
   private byte bitmap;
 
@@ -297,7 +298,7 @@ public class ValuePageWriter {
     return statistics.getCount();
   }
 
-  public Statistics<?> getStatistics() {
+  public Statistics<? extends Serializable> getStatistics() {
     return statistics;
   }
 
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/TsFileIOWriter.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/TsFileIOWriter.java
index 0a79c09..c402640 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/TsFileIOWriter.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/TsFileIOWriter.java
@@ -46,6 +46,7 @@ import org.slf4j.LoggerFactory;
 
 import java.io.File;
 import java.io.IOException;
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -191,7 +192,7 @@ public class TsFileIOWriter {
       CompressionType compressionCodecName,
       TSDataType tsDataType,
       TSEncoding encodingType,
-      Statistics<?> statistics,
+      Statistics<? extends Serializable> statistics,
       int dataSize,
       int numOfPages,
       int mask)
diff --git a/tsfile/src/test/java/org/apache/iotdb/tsfile/file/metadata/utils/TestHelper.java b/tsfile/src/test/java/org/apache/iotdb/tsfile/file/metadata/utils/TestHelper.java
index 3e91a1b..657d73b 100644
--- a/tsfile/src/test/java/org/apache/iotdb/tsfile/file/metadata/utils/TestHelper.java
+++ b/tsfile/src/test/java/org/apache/iotdb/tsfile/file/metadata/utils/TestHelper.java
@@ -31,6 +31,8 @@ import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
 import org.apache.iotdb.tsfile.utils.PublicBAOS;
 import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
 
+import java.io.Serializable;
+
 public class TestHelper {
 
   public static TsFileMetadata createSimpleFileMetaData() {
@@ -52,7 +54,8 @@ public class TestHelper {
   }
 
   public static TimeseriesMetadata createSimpleTimseriesMetaData(String measurementuid) {
-    Statistics<?> statistics = Statistics.getStatsByType(PageHeaderTest.DATA_TYPE);
+    Statistics<? extends Serializable> statistics =
+        Statistics.getStatsByType(PageHeaderTest.DATA_TYPE);
     statistics.setEmpty(false);
     TimeseriesMetadata timeseriesMetaData = new TimeseriesMetadata();
     timeseriesMetaData.setMeasurementId(measurementuid);
@@ -65,7 +68,8 @@ public class TestHelper {
   }
 
   public static PageHeader createTestPageHeader() {
-    Statistics<?> statistics = Statistics.getStatsByType(PageHeaderTest.DATA_TYPE);
+    Statistics<? extends Serializable> statistics =
+        Statistics.getStatsByType(PageHeaderTest.DATA_TYPE);
     statistics.setEmpty(false);
     return new PageHeader(
         PageHeaderTest.UNCOMPRESSED_SIZE, PageHeaderTest.COMPRESSED_SIZE, statistics);