This is an automated email from the ASF dual-hosted git repository. haonan pushed a commit to branch iotdb in repository https://gitbox.apache.org/repos/asf/tsfile.git
commit a6fb4163ba66f8b2c7bcb983170b81780132acd7 Author: Zhihao Shen <[email protected]> AuthorDate: Tue Jul 23 11:49:47 2024 +0800 Return false when datatype is not comparable for InFilter. --- .../read/filter/operator/ValueFilterOperators.java | 49 ++++++++++++++-------- 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/java/tsfile/src/main/java/org/apache/tsfile/read/filter/operator/ValueFilterOperators.java b/java/tsfile/src/main/java/org/apache/tsfile/read/filter/operator/ValueFilterOperators.java index 905c364b..2558b231 100644 --- a/java/tsfile/src/main/java/org/apache/tsfile/read/filter/operator/ValueFilterOperators.java +++ b/java/tsfile/src/main/java/org/apache/tsfile/read/filter/operator/ValueFilterOperators.java @@ -790,19 +790,22 @@ public final class ValueFilterOperators { } if (statistics.isPresent()) { - T valuesMin = (T) statistics.get().getMinValue(); - T valuesMax = (T) statistics.get().getMaxValue(); - // All values are same - if (valuesMin.compareTo(valuesMax) == 0) { - return !candidates.contains(valuesMin); - } else { - if (candidates.size() != 0) { - // All values are less than min, or greater than max - if (candidatesMin.compareTo(valuesMax) > 0) { - return true; - } - if (candidatesMax.compareTo(valuesMin) < 0) { - return true; + Statistics<? extends Serializable> stat = statistics.get(); + if (!statisticsNotAvailable(stat)) { + T valuesMin = (T) stat.getMinValue(); + T valuesMax = (T) stat.getMaxValue(); + // All values are same + if (valuesMin.compareTo(valuesMax) == 0) { + return !candidates.contains(valuesMin); + } else { + if (candidates.size() != 0) { + // All values are less than min, or greater than max + if (candidatesMin.compareTo(valuesMax) > 0) { + return true; + } + if (candidatesMax.compareTo(valuesMin) < 0) { + return true; + } } } } @@ -829,11 +832,14 @@ public final class ValueFilterOperators { // All values are same if (statistics.isPresent()) { - T valuesMin = (T) statistics.get().getMinValue(); - T valuesMax = (T) statistics.get().getMaxValue(); - // All values are same - if (valuesMin.compareTo(valuesMax) == 0) { - return candidates.contains(valuesMin); + Statistics<? extends Serializable> stat = statistics.get(); + if (!statisticsNotAvailable(stat)) { + T valuesMin = (T) stat.getMinValue(); + T valuesMax = (T) stat.getMaxValue(); + // All values are same + if (valuesMin.compareTo(valuesMax) == 0) { + return candidates.contains(valuesMin); + } } } @@ -858,6 +864,13 @@ public final class ValueFilterOperators { private boolean isAllNulls(Statistics<? extends Serializable> statistics) { return statistics.getCount() == 0; } + + private static boolean statisticsNotAvailable(Statistics<?> statistics) { + return statistics.getType() == TSDataType.TEXT + || statistics.getType() == TSDataType.BOOLEAN + || statistics.getType() == TSDataType.BLOB + || statistics.isEmpty(); + } } public static final class ValueNotIn<T extends Comparable<T>> extends ValueColumnSetFilter<T> {
