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

jiangtian pushed a commit to branch statistic_compatibility_pr
in repository https://gitbox.apache.org/repos/asf/tsfile.git

commit 5308a4f2e8c1723824ff0a4bea48d42f41cecda5
Author: Tian Jiang <[email protected]>
AuthorDate: Mon Jan 13 11:24:41 2025 +0800

    add statistic compatibility
    
    (cherry picked from commit 03c229d21de4322de36c292e3fa411cb1b856500)
    (cherry picked from commit c97ec476c812bfa9d0bacc11f33c6077269adc3c)
---
 .../file/metadata/statistics/BinaryStatistics.java |  26 +--
 .../file/metadata/statistics/BlobStatistics.java   |   3 +-
 .../metadata/statistics/BooleanStatistics.java     |  29 ++--
 .../file/metadata/statistics/DoubleStatistics.java |  43 +++--
 .../file/metadata/statistics/FloatStatistics.java  |  42 ++---
 .../metadata/statistics/IntegerStatistics.java     |   7 +-
 .../file/metadata/statistics/LongStatistics.java   |  40 +++--
 .../file/metadata/statistics/Statistics.java       |  16 +-
 .../file/metadata/statistics/StringStatistics.java |  38 +++--
 .../file/metadata/statistics/TimeStatistics.java   |   3 +-
 .../file/metadata/statistics/StatisticsTest.java   | 183 +++++++++++++++++++++
 11 files changed, 324 insertions(+), 106 deletions(-)

diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/BinaryStatistics.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/BinaryStatistics.java
index 34db11b9..9915121d 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/BinaryStatistics.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/BinaryStatistics.java
@@ -125,18 +125,22 @@ public class BinaryStatistics extends Statistics<Binary> {
         String.format(STATS_UNSUPPORTED_MSG, TSDataType.TEXT, "long sum"));
   }
 
-  @Override
-  protected void mergeStatisticsValue(Statistics<Binary> stats) {
-    BinaryStatistics stringStats = (BinaryStatistics) stats;
-    if (isEmpty) {
-      initializeStats(stringStats.getFirstValue(), stringStats.getLastValue());
-      isEmpty = false;
+  @SuppressWarnings("rawtypes")
+  @Override
+  protected void mergeStatisticsValue(Statistics stats) {
+    if (stats instanceof BinaryStatistics || stats instanceof 
StringStatistics) {
+      if (isEmpty) {
+        initializeStats(((Binary) stats.getFirstValue()), ((Binary) 
stats.getLastValue()));
+        isEmpty = false;
+      } else {
+        updateStats(
+            ((Binary) stats.getFirstValue()),
+            ((Binary) stats.getLastValue()),
+            stats.getStartTime(),
+            stats.getEndTime());
+      }
     } else {
-      updateStats(
-          stringStats.getFirstValue(),
-          stringStats.getLastValue(),
-          stats.getStartTime(),
-          stats.getEndTime());
+      throw new StatisticsClassException(this.getClass(), stats.getClass());
     }
   }
 
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/BlobStatistics.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/BlobStatistics.java
index f8cb18fa..65c7515b 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/BlobStatistics.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/BlobStatistics.java
@@ -110,8 +110,9 @@ public class BlobStatistics extends Statistics<Binary> {
         String.format(STATS_UNSUPPORTED_MSG, TSDataType.BLOB, "sum"));
   }
 
+  @SuppressWarnings("rawtypes")
   @Override
-  protected void mergeStatisticsValue(Statistics<Binary> stats) {
+  protected void mergeStatisticsValue(Statistics stats) {
     // do nothing
     if (isEmpty) {
       isEmpty = false;
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/BooleanStatistics.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/BooleanStatistics.java
index 63e01288..d519a6ca 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/BooleanStatistics.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/BooleanStatistics.java
@@ -127,8 +127,7 @@ public class BooleanStatistics extends Statistics<Boolean> {
 
   @Override
   public double getSumDoubleValue() {
-    throw new StatisticsClassException(
-        String.format(STATS_UNSUPPORTED_MSG, TSDataType.BOOLEAN, "double 
sum"));
+    return sumValue;
   }
 
   @Override
@@ -137,18 +136,22 @@ public class BooleanStatistics extends 
Statistics<Boolean> {
   }
 
   @Override
-  protected void mergeStatisticsValue(Statistics<Boolean> stats) {
-    BooleanStatistics boolStats = (BooleanStatistics) stats;
-    if (isEmpty) {
-      initializeStats(boolStats.getFirstValue(), boolStats.getLastValue(), 
boolStats.sumValue);
-      isEmpty = false;
+  protected void mergeStatisticsValue(Statistics stats) {
+    if (stats instanceof BooleanStatistics) {
+      BooleanStatistics boolStats = (BooleanStatistics) stats;
+      if (isEmpty) {
+        initializeStats(boolStats.getFirstValue(), boolStats.getLastValue(), 
boolStats.sumValue);
+        isEmpty = false;
+      } else {
+        updateStats(
+            boolStats.getFirstValue(),
+            boolStats.getLastValue(),
+            stats.getStartTime(),
+            stats.getEndTime(),
+            boolStats.sumValue);
+      }
     } else {
-      updateStats(
-          boolStats.getFirstValue(),
-          boolStats.getLastValue(),
-          stats.getStartTime(),
-          stats.getEndTime(),
-          boolStats.sumValue);
+      throw new StatisticsClassException(this.getClass(), stats.getClass());
     }
   }
 
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/DoubleStatistics.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/DoubleStatistics.java
index d79c4c2c..1d259ca3 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/DoubleStatistics.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/DoubleStatistics.java
@@ -159,26 +159,33 @@ public class DoubleStatistics extends Statistics<Double> {
         String.format(STATS_UNSUPPORTED_MSG, TSDataType.DOUBLE, "long sum"));
   }
 
+  @SuppressWarnings("rawtypes")
   @Override
-  protected void mergeStatisticsValue(Statistics<Double> stats) {
-    DoubleStatistics doubleStats = (DoubleStatistics) stats;
-    if (this.isEmpty) {
-      initializeStats(
-          doubleStats.getMinValue(),
-          doubleStats.getMaxValue(),
-          doubleStats.getFirstValue(),
-          doubleStats.getLastValue(),
-          doubleStats.sumValue);
-      isEmpty = false;
+  protected void mergeStatisticsValue(Statistics stats) {
+    if (stats instanceof DoubleStatistics
+        || stats instanceof FloatStatistics
+        || stats instanceof IntegerStatistics
+        || stats instanceof LongStatistics) {
+      if (this.isEmpty) {
+        initializeStats(
+            ((Number) stats.getMinValue()).doubleValue(),
+            ((Number) stats.getMaxValue()).doubleValue(),
+            ((Number) stats.getFirstValue()).doubleValue(),
+            ((Number) stats.getLastValue()).doubleValue(),
+            stats.getSumDoubleValue());
+        isEmpty = false;
+      } else {
+        updateStats(
+            ((Number) stats.getMinValue()).doubleValue(),
+            ((Number) stats.getMaxValue()).doubleValue(),
+            ((Number) stats.getFirstValue()).doubleValue(),
+            ((Number) stats.getLastValue()).doubleValue(),
+            stats.getSumDoubleValue(),
+            stats.getStartTime(),
+            stats.getEndTime());
+      }
     } else {
-      updateStats(
-          doubleStats.getMinValue(),
-          doubleStats.getMaxValue(),
-          doubleStats.getFirstValue(),
-          doubleStats.getLastValue(),
-          doubleStats.sumValue,
-          stats.getStartTime(),
-          stats.getEndTime());
+      throw new StatisticsClassException(this.getClass(), stats.getClass());
     }
   }
 
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/FloatStatistics.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/FloatStatistics.java
index 8df52008..0d9595a8 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/FloatStatistics.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/FloatStatistics.java
@@ -150,26 +150,30 @@ public class FloatStatistics extends Statistics<Float> {
         String.format(STATS_UNSUPPORTED_MSG, TSDataType.FLOAT, "long sum"));
   }
 
-  @Override
-  protected void mergeStatisticsValue(Statistics<Float> stats) {
-    FloatStatistics floatStats = (FloatStatistics) stats;
-    if (isEmpty) {
-      initializeStats(
-          floatStats.getMinValue(),
-          floatStats.getMaxValue(),
-          floatStats.getFirstValue(),
-          floatStats.getLastValue(),
-          floatStats.sumValue);
-      isEmpty = false;
+  @SuppressWarnings("rawtypes")
+  @Override
+  protected void mergeStatisticsValue(Statistics stats) {
+    if (stats instanceof FloatStatistics || stats instanceof 
IntegerStatistics) {
+      if (isEmpty) {
+        initializeStats(
+            ((Number) stats.getMinValue()).floatValue(),
+            ((Number) stats.getMaxValue()).floatValue(),
+            ((Number) stats.getFirstValue()).floatValue(),
+            ((Number) stats.getLastValue()).floatValue(),
+            stats.getSumDoubleValue());
+        isEmpty = false;
+      } else {
+        updateStats(
+            ((Number) stats.getMinValue()).floatValue(),
+            ((Number) stats.getMaxValue()).floatValue(),
+            ((Number) stats.getFirstValue()).floatValue(),
+            ((Number) stats.getLastValue()).floatValue(),
+            stats.getSumDoubleValue(),
+            stats.getStartTime(),
+            stats.getEndTime());
+      }
     } else {
-      updateStats(
-          floatStats.getMinValue(),
-          floatStats.getMaxValue(),
-          floatStats.getFirstValue(),
-          floatStats.getLastValue(),
-          floatStats.sumValue,
-          stats.getStartTime(),
-          stats.getEndTime());
+      throw new StatisticsClassException(this.getClass(), stats.getClass());
     }
   }
 
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/IntegerStatistics.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/IntegerStatistics.java
index 45f17166..804609d9 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/IntegerStatistics.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/IntegerStatistics.java
@@ -20,7 +20,6 @@
 package org.apache.tsfile.file.metadata.statistics;
 
 import org.apache.tsfile.enums.TSDataType;
-import org.apache.tsfile.exception.filter.StatisticsClassException;
 import org.apache.tsfile.utils.RamUsageEstimator;
 import org.apache.tsfile.utils.ReadWriteIOUtils;
 
@@ -142,8 +141,7 @@ public class IntegerStatistics extends Statistics<Integer> {
 
   @Override
   public double getSumDoubleValue() {
-    throw new StatisticsClassException(
-        String.format(STATS_UNSUPPORTED_MSG, TSDataType.INT32, "double sum"));
+    return sumValue;
   }
 
   @Override
@@ -151,8 +149,9 @@ public class IntegerStatistics extends Statistics<Integer> {
     return sumValue;
   }
 
+  @SuppressWarnings("rawtypes")
   @Override
-  protected void mergeStatisticsValue(Statistics<Integer> stats) {
+  protected void mergeStatisticsValue(Statistics stats) {
     IntegerStatistics intStats = (IntegerStatistics) stats;
     if (isEmpty) {
       initializeStats(
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/LongStatistics.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/LongStatistics.java
index c72668cb..5f362425 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/LongStatistics.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/LongStatistics.java
@@ -160,26 +160,30 @@ public class LongStatistics extends Statistics<Long> {
     }
   }
 
+  @SuppressWarnings("rawtypes")
   @Override
-  protected void mergeStatisticsValue(Statistics<Long> stats) {
-    LongStatistics longStats = (LongStatistics) stats;
-    if (isEmpty) {
-      initializeStats(
-          longStats.getMinValue(),
-          longStats.getMaxValue(),
-          longStats.getFirstValue(),
-          longStats.getLastValue(),
-          longStats.sumValue);
-      isEmpty = false;
+  protected void mergeStatisticsValue(Statistics stats) {
+    if (stats instanceof LongStatistics || stats instanceof IntegerStatistics) 
{
+      if (isEmpty) {
+        initializeStats(
+            ((Number) stats.getMinValue()).longValue(),
+            ((Number) stats.getMaxValue()).longValue(),
+            ((Number) stats.getFirstValue()).longValue(),
+            ((Number) stats.getLastValue()).longValue(),
+            stats.getSumDoubleValue());
+        isEmpty = false;
+      } else {
+        updateStats(
+            ((Number) stats.getMinValue()).longValue(),
+            ((Number) stats.getMaxValue()).longValue(),
+            ((Number) stats.getFirstValue()).longValue(),
+            ((Number) stats.getLastValue()).longValue(),
+            stats.getSumDoubleValue(),
+            stats.getStartTime(),
+            stats.getEndTime());
+      }
     } else {
-      updateStats(
-          longStats.getMinValue(),
-          longStats.getMaxValue(),
-          longStats.getFirstValue(),
-          longStats.getLastValue(),
-          longStats.sumValue,
-          stats.getStartTime(),
-          stats.getEndTime());
+      throw new StatisticsClassException(this.getClass(), stats.getClass());
     }
   }
 
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/Statistics.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/Statistics.java
index 56b3bf7a..3fc0f714 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/Statistics.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/Statistics.java
@@ -203,7 +203,7 @@ public abstract class Statistics<T extends Serializable> {
    */
   @SuppressWarnings("unchecked")
   public void mergeStatistics(Statistics<? extends Serializable> stats) {
-    if (this.getClass() == stats.getClass()) {
+    if (this.getClass() == stats.getClass() || canMerge(stats.getType(), 
this.getType())) {
       if (!stats.isEmpty) {
         if (stats.startTime < this.startTime) {
           this.startTime = stats.startTime;
@@ -213,7 +213,7 @@ public abstract class Statistics<T extends Serializable> {
         }
         // must be sure no overlap between two statistics
         this.count += stats.count;
-        mergeStatisticsValue((Statistics<T>) stats);
+        mergeStatisticsValue(stats);
         isEmpty = false;
       }
     } else {
@@ -225,6 +225,13 @@ public abstract class Statistics<T extends Serializable> {
     }
   }
 
+  public static boolean canMerge(TSDataType from, TSDataType to) {
+    return to.isCompatible(from)
+        &&
+        // cannot alter from TEXT to STRING because we cannot add statistic to 
the existing chunks
+        !(from == TSDataType.TEXT && to == TSDataType.STRING);
+  }
+
   public void update(long time, boolean value) {
     update(time);
     updateStats(value);
@@ -315,7 +322,8 @@ public abstract class Statistics<T extends Serializable> {
     count += batchSize;
   }
 
-  protected abstract void mergeStatisticsValue(Statistics<T> stats);
+  @SuppressWarnings("rawtypes")
+  protected abstract void mergeStatisticsValue(Statistics stats);
 
   public boolean isEmpty() {
     return isEmpty;
@@ -393,7 +401,7 @@ public abstract class Statistics<T extends Serializable> {
     return endTime;
   }
 
-  public long getCount() {
+  public int getCount() {
     return count;
   }
 
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/StringStatistics.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/StringStatistics.java
index 5997fb9b..5da57af1 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/StringStatistics.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/StringStatistics.java
@@ -143,24 +143,28 @@ public class StringStatistics extends Statistics<Binary> {
         String.format(STATS_UNSUPPORTED_MSG, TSDataType.STRING, "long sum"));
   }
 
-  @Override
-  protected void mergeStatisticsValue(Statistics<Binary> stats) {
-    StringStatistics stringStats = (StringStatistics) stats;
-    if (isEmpty) {
-      initializeStats(
-          stringStats.getFirstValue(),
-          stringStats.getLastValue(),
-          stringStats.getMinValue(),
-          stringStats.getMaxValue());
-      isEmpty = false;
+  @SuppressWarnings("rawtypes")
+  @Override
+  protected void mergeStatisticsValue(Statistics stats) {
+    if (stats instanceof StringStatistics) {
+      if (isEmpty) {
+        initializeStats(
+            ((Binary) stats.getFirstValue()),
+            ((Binary) stats.getLastValue()),
+            ((Binary) stats.getMinValue()),
+            ((Binary) stats.getMaxValue()));
+        isEmpty = false;
+      } else {
+        updateStats(
+            ((Binary) stats.getFirstValue()),
+            ((Binary) stats.getLastValue()),
+            ((Binary) stats.getMinValue()),
+            ((Binary) stats.getMaxValue()),
+            stats.getStartTime(),
+            stats.getEndTime());
+      }
     } else {
-      updateStats(
-          stringStats.getFirstValue(),
-          stringStats.getLastValue(),
-          stringStats.getMinValue(),
-          stringStats.getMaxValue(),
-          stats.getStartTime(),
-          stats.getEndTime());
+      throw new StatisticsClassException(this.getClass(), stats.getClass());
     }
   }
 
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/TimeStatistics.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/TimeStatistics.java
index 48fcb329..db12ac4b 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/TimeStatistics.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/statistics/TimeStatistics.java
@@ -119,8 +119,9 @@ public class TimeStatistics extends Statistics<Long> {
     throw new StatisticsClassException(String.format(STATS_UNSUPPORTED_MSG, 
TIME, UPDATE_STATS));
   }
 
+  @SuppressWarnings("rawtypes")
   @Override
-  protected void mergeStatisticsValue(Statistics<Long> stats) {}
+  protected void mergeStatisticsValue(Statistics stats) {}
 
   @Override
   public int serializeStats(OutputStream outputStream) {
diff --git 
a/java/tsfile/src/test/java/org/apache/tsfile/file/metadata/statistics/StatisticsTest.java
 
b/java/tsfile/src/test/java/org/apache/tsfile/file/metadata/statistics/StatisticsTest.java
new file mode 100644
index 00000000..06aeca38
--- /dev/null
+++ 
b/java/tsfile/src/test/java/org/apache/tsfile/file/metadata/statistics/StatisticsTest.java
@@ -0,0 +1,183 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tsfile.file.metadata.statistics;
+
+import org.apache.tsfile.common.conf.TSFileConfig;
+import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.utils.Binary;
+
+import org.junit.Test;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+@SuppressWarnings({"unchecked", "rawtypes"})
+public class StatisticsTest {
+
+  @Test
+  public void testCrossTypeMerge() {
+    Set<TSDataType> dataTypes = new HashSet<>();
+    Collections.addAll(dataTypes, TSDataType.values());
+    dataTypes.remove(TSDataType.VECTOR);
+    dataTypes.remove(TSDataType.UNKNOWN);
+
+    for (TSDataType from : dataTypes) {
+      for (TSDataType to : dataTypes) {
+        Statistics fromStatistics = genStatistics(from, 0);
+        Statistics toStatistics = genStatistics(to, 1);
+        if (Statistics.canMerge(from, to)) {
+          toStatistics.mergeStatistics(fromStatistics);
+          checkStatistics(toStatistics, 0, 1, 1.0);
+        } else {
+          try {
+            toStatistics.mergeStatistics(fromStatistics);
+            fail("Expected MergeException");
+          } catch (Exception e) {
+            assertEquals(
+                String.format(
+                    "Statistics classes mismatched: %s vs. %s",
+                    toStatistics.getClass(), fromStatistics.getClass()),
+                e.getMessage());
+          }
+          checkStatistics(toStatistics, 1, 1, 1.0);
+        }
+      }
+    }
+  }
+
+  @SuppressWarnings("SameParameterValue")
+  private static void checkStatistics(Statistics statistics, int min, int max, 
double sum) {
+    assertEquals(min, statistics.getStartTime());
+    assertEquals(max, statistics.getEndTime());
+    switch (statistics.getType()) {
+      case INT32:
+      case INT64:
+      case FLOAT:
+      case DOUBLE:
+      case TIMESTAMP:
+      case DATE:
+        assertEquals(min, ((Number) statistics.getMinValue()).intValue());
+        assertEquals(max, ((Number) statistics.getMaxValue()).intValue());
+        assertEquals(min, ((Number) statistics.getFirstValue()).intValue());
+        assertEquals(max, ((Number) statistics.getLastValue()).intValue());
+        assertEquals(sum, statistics.getSumDoubleValue(), 0.001);
+        break;
+      case BOOLEAN:
+        assertEquals(min % 2 == 1, statistics.getFirstValue());
+        assertEquals(max % 2 == 1, statistics.getLastValue());
+        assertEquals(sum, statistics.getSumDoubleValue(), 0.001);
+        break;
+      case TEXT:
+        assertEquals(
+            new Binary(String.valueOf(min), TSFileConfig.STRING_CHARSET),
+            statistics.getFirstValue());
+        assertEquals(
+            new Binary(String.valueOf(max), TSFileConfig.STRING_CHARSET),
+            statistics.getLastValue());
+        break;
+      case STRING:
+        assertEquals(
+            new Binary(String.valueOf(min), TSFileConfig.STRING_CHARSET), 
statistics.getMinValue());
+        assertEquals(
+            new Binary(String.valueOf(max), TSFileConfig.STRING_CHARSET), 
statistics.getMaxValue());
+        assertEquals(
+            new Binary(String.valueOf(min), TSFileConfig.STRING_CHARSET),
+            statistics.getFirstValue());
+        assertEquals(
+            new Binary(String.valueOf(max), TSFileConfig.STRING_CHARSET),
+            statistics.getLastValue());
+        break;
+      case BLOB:
+        break;
+      default:
+        throw new IllegalArgumentException(statistics.getType().toString());
+    }
+  }
+
+  private static Statistics genStatistics(TSDataType dataType, int val) {
+    Statistics result;
+    switch (dataType) {
+      case INT32:
+        IntegerStatistics intStat = new IntegerStatistics();
+        intStat.initializeStats(val, val, val, val, val);
+        result = intStat;
+        break;
+      case INT64:
+        LongStatistics longStat = new LongStatistics();
+        longStat.initializeStats(val, val, val, val, val);
+        result = longStat;
+        break;
+      case FLOAT:
+        FloatStatistics floatStat = new FloatStatistics();
+        floatStat.initializeStats(val, val, val, val, val);
+        result = floatStat;
+        break;
+      case DOUBLE:
+        DoubleStatistics doubleStat = new DoubleStatistics();
+        doubleStat.initializeStats(val, val, val, val, val);
+        result = doubleStat;
+        break;
+      case TEXT:
+        BinaryStatistics binaryStat = new BinaryStatistics();
+        binaryStat.initializeStats(
+            new Binary(String.valueOf(val), TSFileConfig.STRING_CHARSET),
+            new Binary(String.valueOf(val), TSFileConfig.STRING_CHARSET));
+        result = binaryStat;
+        break;
+      case STRING:
+        StringStatistics stringStat = new StringStatistics();
+        stringStat.initializeStats(
+            new Binary(String.valueOf(val), TSFileConfig.STRING_CHARSET),
+            new Binary(String.valueOf(val), TSFileConfig.STRING_CHARSET),
+            new Binary(String.valueOf(val), TSFileConfig.STRING_CHARSET),
+            new Binary(String.valueOf(val), TSFileConfig.STRING_CHARSET));
+        result = stringStat;
+        break;
+      case BOOLEAN:
+        BooleanStatistics boolStat = new BooleanStatistics();
+        boolStat.initializeStats(val % 2 == 1, val % 2 == 1, val % 2 == 1 ? 1 
: 0);
+        result = boolStat;
+        break;
+      case BLOB:
+        BlobStatistics blobStat = new BlobStatistics();
+        result = blobStat;
+        break;
+      case DATE:
+        DateStatistics dateStat = new DateStatistics();
+        dateStat.initializeStats(val, val, val, val, val);
+        result = dateStat;
+        break;
+      case TIMESTAMP:
+        TimestampStatistics timestampStat = new TimestampStatistics();
+        timestampStat.initializeStats(val, val, val, val, val);
+        result = timestampStat;
+        break;
+      default:
+        throw new IllegalArgumentException(dataType.toString());
+    }
+    result.setStartTime(val);
+    result.setEndTime(val);
+    result.setEmpty(false);
+    return result;
+  }
+}

Reply via email to