|
36 | 36 | #include "vec/columns/column_dictionary.h" |
37 | 37 | #include "vec/common/string_ref.h" |
38 | 38 | #include "vec/core/types.h" |
| 39 | +#include "vec/data_types/data_type.h" |
39 | 40 |
|
40 | 41 | // for uint24_t |
41 | 42 | template <> |
@@ -67,19 +68,19 @@ class InListPredicateBase : public ColumnPredicate { |
67 | 68 | using T = typename PrimitiveTypeTraits<Type>::CppType; |
68 | 69 | template <typename ConditionType, typename ConvertFunc> |
69 | 70 | InListPredicateBase(uint32_t column_id, const ConditionType& conditions, |
70 | | - const ConvertFunc& convert, bool is_opposite, const TabletColumn* col, |
71 | | - vectorized::Arena& arena) |
| 71 | + const ConvertFunc& convert, bool is_opposite, |
| 72 | + const vectorized::DataTypePtr& data_type, vectorized::Arena& arena) |
72 | 73 | : ColumnPredicate(column_id, is_opposite), |
73 | 74 | _min_value(type_limit<T>::max()), |
74 | 75 | _max_value(type_limit<T>::min()) { |
75 | 76 | _values = std::make_shared<HybridSetType>(false); |
76 | 77 | for (const auto& condition : conditions) { |
77 | 78 | T tmp; |
78 | 79 | if constexpr (Type == TYPE_STRING || Type == TYPE_CHAR) { |
79 | | - tmp = convert(*col, condition, arena); |
| 80 | + tmp = convert(data_type, condition, arena); |
80 | 81 | } else if constexpr (Type == TYPE_DECIMAL32 || Type == TYPE_DECIMAL64 || |
81 | 82 | Type == TYPE_DECIMAL128I || Type == TYPE_DECIMAL256) { |
82 | | - tmp = convert(*col, condition); |
| 83 | + tmp = convert(data_type, condition); |
83 | 84 | } else { |
84 | 85 | tmp = convert(condition); |
85 | 86 | } |
@@ -245,6 +246,42 @@ class InListPredicateBase : public ColumnPredicate { |
245 | 246 | } |
246 | 247 | } |
247 | 248 |
|
| 249 | + bool evaluate_and(vectorized::ParquetPredicate::ColumnStat* statistic) const override { |
| 250 | + if (!(*statistic->get_stat_func)(statistic, column_id())) { |
| 251 | + return true; |
| 252 | + } |
| 253 | + vectorized::Field min_field; |
| 254 | + vectorized::Field max_field; |
| 255 | + if (!vectorized::ParquetPredicate::get_min_max_value( |
| 256 | + statistic->col_schema, statistic->encoded_min_value, |
| 257 | + statistic->encoded_max_value, *statistic->ctz, &min_field, &max_field) |
| 258 | + .ok()) { |
| 259 | + return true; |
| 260 | + }; |
| 261 | + T min_value; |
| 262 | + T max_value; |
| 263 | + if constexpr (is_int_or_bool(Type) || is_float_or_double(Type)) { |
| 264 | + min_value = |
| 265 | + (typename PrimitiveTypeTraits<Type>::CppType)min_field |
| 266 | + .template get<typename PrimitiveTypeTraits<Type>::NearestFieldType>(); |
| 267 | + max_value = |
| 268 | + (typename PrimitiveTypeTraits<Type>::CppType)max_field |
| 269 | + .template get<typename PrimitiveTypeTraits<Type>::NearestFieldType>(); |
| 270 | + } else { |
| 271 | + min_value = min_field.template get<typename PrimitiveTypeTraits<Type>::CppType>(); |
| 272 | + max_value = max_field.template get<typename PrimitiveTypeTraits<Type>::CppType>(); |
| 273 | + } |
| 274 | + |
| 275 | + if constexpr (PT == PredicateType::IN_LIST) { |
| 276 | + return (Compare::less_equal(min_value, _max_value) && |
| 277 | + Compare::greater_equal(max_value, _min_value)) || |
| 278 | + (Compare::greater_equal(max_value, _min_value) && |
| 279 | + Compare::less_equal(min_value, _max_value)); |
| 280 | + } else { |
| 281 | + return true; |
| 282 | + } |
| 283 | + } |
| 284 | + |
248 | 285 | bool evaluate_and(const StringRef* dict_words, const size_t count) const override { |
249 | 286 | for (size_t i = 0; i != count; ++i) { |
250 | 287 | const auto found = _values->find(dict_words[i].data, dict_words[i].size) ^ _opposite; |
@@ -548,57 +585,59 @@ template <PrimitiveType Type, PredicateType PT, typename ConditionType, typename |
548 | 585 | size_t N = 0> |
549 | 586 | ColumnPredicate* _create_in_list_predicate(uint32_t column_id, const ConditionType& conditions, |
550 | 587 | const ConvertFunc& convert, bool is_opposite, |
551 | | - const TabletColumn* col, vectorized::Arena& arena) { |
| 588 | + const vectorized::DataTypePtr& data_type, |
| 589 | + vectorized::Arena& arena) { |
552 | 590 | using T = typename PrimitiveTypeTraits<Type>::CppType; |
553 | 591 | if constexpr (N >= 1 && N <= FIXED_CONTAINER_MAX_SIZE) { |
554 | 592 | using Set = std::conditional_t< |
555 | 593 | std::is_same_v<T, StringRef>, StringSet<FixedContainer<std::string, N>>, |
556 | 594 | HybridSet<Type, FixedContainer<T, N>, |
557 | 595 | vectorized::PredicateColumnType<PredicateEvaluateType<Type>>>>; |
558 | 596 | return new InListPredicateBase<Type, PT, Set>(column_id, conditions, convert, is_opposite, |
559 | | - col, arena); |
| 597 | + data_type, arena); |
560 | 598 | } else { |
561 | 599 | using Set = std::conditional_t< |
562 | 600 | std::is_same_v<T, StringRef>, StringSet<DynamicContainer<std::string>>, |
563 | 601 | HybridSet<Type, DynamicContainer<T>, |
564 | 602 | vectorized::PredicateColumnType<PredicateEvaluateType<Type>>>>; |
565 | 603 | return new InListPredicateBase<Type, PT, Set>(column_id, conditions, convert, is_opposite, |
566 | | - col, arena); |
| 604 | + data_type, arena); |
567 | 605 | } |
568 | 606 | } |
569 | 607 |
|
570 | 608 | template <PrimitiveType Type, PredicateType PT, typename ConditionType, typename ConvertFunc> |
571 | 609 | ColumnPredicate* create_in_list_predicate(uint32_t column_id, const ConditionType& conditions, |
572 | 610 | const ConvertFunc& convert, bool is_opposite, |
573 | | - const TabletColumn* col, vectorized::Arena& arena) { |
| 611 | + const vectorized::DataTypePtr& data_type, |
| 612 | + vectorized::Arena& arena) { |
574 | 613 | if (conditions.size() == 1) { |
575 | 614 | return _create_in_list_predicate<Type, PT, ConditionType, ConvertFunc, 1>( |
576 | | - column_id, conditions, convert, is_opposite, col, arena); |
| 615 | + column_id, conditions, convert, is_opposite, data_type, arena); |
577 | 616 | } else if (conditions.size() == 2) { |
578 | 617 | return _create_in_list_predicate<Type, PT, ConditionType, ConvertFunc, 2>( |
579 | | - column_id, conditions, convert, is_opposite, col, arena); |
| 618 | + column_id, conditions, convert, is_opposite, data_type, arena); |
580 | 619 | } else if (conditions.size() == 3) { |
581 | 620 | return _create_in_list_predicate<Type, PT, ConditionType, ConvertFunc, 3>( |
582 | | - column_id, conditions, convert, is_opposite, col, arena); |
| 621 | + column_id, conditions, convert, is_opposite, data_type, arena); |
583 | 622 | } else if (conditions.size() == 4) { |
584 | 623 | return _create_in_list_predicate<Type, PT, ConditionType, ConvertFunc, 4>( |
585 | | - column_id, conditions, convert, is_opposite, col, arena); |
| 624 | + column_id, conditions, convert, is_opposite, data_type, arena); |
586 | 625 | } else if (conditions.size() == 5) { |
587 | 626 | return _create_in_list_predicate<Type, PT, ConditionType, ConvertFunc, 5>( |
588 | | - column_id, conditions, convert, is_opposite, col, arena); |
| 627 | + column_id, conditions, convert, is_opposite, data_type, arena); |
589 | 628 | } else if (conditions.size() == 6) { |
590 | 629 | return _create_in_list_predicate<Type, PT, ConditionType, ConvertFunc, 6>( |
591 | | - column_id, conditions, convert, is_opposite, col, arena); |
| 630 | + column_id, conditions, convert, is_opposite, data_type, arena); |
592 | 631 | } else if (conditions.size() == 7) { |
593 | 632 | return _create_in_list_predicate<Type, PT, ConditionType, ConvertFunc, 7>( |
594 | | - column_id, conditions, convert, is_opposite, col, arena); |
| 633 | + column_id, conditions, convert, is_opposite, data_type, arena); |
595 | 634 | } else if (conditions.size() == FIXED_CONTAINER_MAX_SIZE) { |
596 | 635 | return _create_in_list_predicate<Type, PT, ConditionType, ConvertFunc, |
597 | 636 | FIXED_CONTAINER_MAX_SIZE>(column_id, conditions, convert, |
598 | | - is_opposite, col, arena); |
| 637 | + is_opposite, data_type, arena); |
599 | 638 | } else { |
600 | 639 | return _create_in_list_predicate<Type, PT, ConditionType, ConvertFunc>( |
601 | | - column_id, conditions, convert, is_opposite, col, arena); |
| 640 | + column_id, conditions, convert, is_opposite, data_type, arena); |
602 | 641 | } |
603 | 642 | } |
604 | 643 |
|
|
0 commit comments