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; + } +}
