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

yiguolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 2068bf2dea [Refactor](predicate) Use primitive type as template 
argument for predicate (#11647)
2068bf2dea is described below

commit 2068bf2deae078db16af017e196efadae1e8f4fc
Author: Gabriel <gabrielleeb...@gmail.com>
AuthorDate: Thu Aug 11 12:06:44 2022 +0800

    [Refactor](predicate) Use primitive type as template argument for predicate 
(#11647)
---
 be/src/olap/bloom_filter_predicate.h               | 29 ++-----
 be/src/olap/comparison_predicate.h                 | 27 ++-----
 be/src/olap/in_list_predicate.h                    | 14 ++--
 be/src/olap/like_column_predicate.cpp              |  4 +-
 be/src/olap/predicate_creator.h                    | 67 +++++++++-------
 be/src/olap/schema.cpp                             | 34 ++++----
 be/src/runtime/primitive_type.h                    |  2 +-
 be/src/vec/columns/column_dictionary.h             |  2 +-
 be/src/vec/columns/predicate_column.h              | 12 ++-
 be/test/olap/block_column_predicate_test.cpp       | 91 ++++++++++++++--------
 .../olap/bloom_filter_column_predicate_test.cpp    |  4 +-
 be/test/olap/comparison_predicate_test.cpp         | 27 ++++---
 be/test/olap/in_list_predicate_test.cpp            | 40 ++++++----
 be/test/olap/rowset/beta_rowset_test.cpp           |  6 +-
 be/test/olap/rowset/segment_v2/segment_test.cpp    | 33 +++++---
 15 files changed, 211 insertions(+), 181 deletions(-)

diff --git a/be/src/olap/bloom_filter_predicate.h 
b/be/src/olap/bloom_filter_predicate.h
index b1b4217ace..fd121302de 100644
--- a/be/src/olap/bloom_filter_predicate.h
+++ b/be/src/olap/bloom_filter_predicate.h
@@ -61,7 +61,7 @@ public:
                       uint16_t size) const override;
 
 private:
-    template <bool is_nullable, typename file_type = void>
+    template <bool is_nullable>
     uint16_t evaluate(const vectorized::IColumn& column, const uint8_t* 
null_map, uint16_t* sel,
                       uint16_t size) const {
         if constexpr (is_nullable) {
@@ -83,21 +83,6 @@ private:
             }
         } else {
             uint24_t tmp_uint24_value;
-            auto get_column_data = [](const vectorized::IColumn& column) {
-                if constexpr (std::is_same_v<file_type, uint24_t> &&
-                              T == PrimitiveType::TYPE_DATE) {
-                    return reinterpret_cast<const 
vectorized::PredicateColumnType<uint32_t>*>(
-                                   &column)
-                            ->get_data()
-                            .data();
-                } else {
-                    return reinterpret_cast<const 
vectorized::PredicateColumnType<file_type>*>(
-                                   &column)
-                            ->get_data()
-                            .data();
-                }
-            };
-
             auto get_cell_value = [&tmp_uint24_value](auto& data) {
                 if constexpr (std::is_same_v<std::decay_t<decltype(data)>, 
uint32_t> &&
                               T == PrimitiveType::TYPE_DATE) {
@@ -108,7 +93,10 @@ private:
                 }
             };
 
-            auto pred_col_data = get_column_data(column);
+            auto pred_col_data =
+                    reinterpret_cast<const 
vectorized::PredicateColumnType<T>*>(&column)
+                            ->get_data()
+                            .data();
             for (uint16_t i = 0; i < size; i++) {
                 uint16_t idx = sel[i];
                 sel[new_size] = idx;
@@ -159,17 +147,16 @@ template <PrimitiveType T>
 uint16_t BloomFilterColumnPredicate<T>::evaluate(const vectorized::IColumn& 
column, uint16_t* sel,
                                                  uint16_t size) const {
     uint16_t new_size = 0;
-    using FT = typename PredicatePrimitiveTypeTraits<T>::PredicateFieldType;
     if (!_enable_pred) {
         return size;
     }
     if (column.is_nullable()) {
         auto* nullable_col = reinterpret_cast<const 
vectorized::ColumnNullable*>(&column);
         auto& null_map_data = nullable_col->get_null_map_column().get_data();
-        new_size = evaluate<true, FT>(nullable_col->get_nested_column(), 
null_map_data.data(), sel,
-                                      size);
+        new_size =
+                evaluate<true>(nullable_col->get_nested_column(), 
null_map_data.data(), sel, size);
     } else {
-        new_size = evaluate<false, FT>(column, nullptr, sel, size);
+        new_size = evaluate<false>(column, nullptr, sel, size);
     }
     // If the pass rate is very high, for example > 50%, then the bloomfilter 
is useless.
     // Some bloomfilter is useless, for example ssb 4.3, it consumes a lot of 
cpu but it is
diff --git a/be/src/olap/comparison_predicate.h 
b/be/src/olap/comparison_predicate.h
index 1ba25e5db2..ad36d59503 100644
--- a/be/src/olap/comparison_predicate.h
+++ b/be/src/olap/comparison_predicate.h
@@ -24,9 +24,11 @@
 
 namespace doris {
 
-template <class T, PredicateType PT>
+template <PrimitiveType Type, PredicateType PT>
 class ComparisonPredicateBase : public ColumnPredicate {
 public:
+    using T = std::conditional_t<Type == TYPE_DATE, uint24_t,
+                                 typename 
PredicatePrimitiveTypeTraits<Type>::PredicateFieldType>;
     ComparisonPredicateBase(uint32_t column_id, const T& value, bool opposite 
= false)
             : ColumnPredicate(column_id, opposite), _value(value) {
         if constexpr (std::is_same_v<T, uint24_t>) {
@@ -186,7 +188,7 @@ public:
                     LOG(FATAL) << "column_dictionary must use StringValue 
predicate.";
                 }
             } else {
-                auto* data_array = reinterpret_cast<const 
vectorized::PredicateColumnType<TReal>&>(
+                auto* data_array = reinterpret_cast<const 
vectorized::PredicateColumnType<Type>&>(
                                            nested_column)
                                            .get_data()
                                            .data();
@@ -209,7 +211,7 @@ public:
                 }
             } else {
                 auto* data_array =
-                        
vectorized::check_and_get_column<vectorized::PredicateColumnType<TReal>>(
+                        
vectorized::check_and_get_column<vectorized::PredicateColumnType<Type>>(
                                 column)
                                 ->get_data()
                                 .data();
@@ -236,7 +238,7 @@ public:
     }
 
 private:
-    using TReal = std::conditional_t<std::is_same_v<T, uint24_t>, uint32_t, T>;
+    using TReal = typename 
PredicatePrimitiveTypeTraits<Type>::PredicateFieldType;
 
     template <typename LeftT, typename RightT>
     bool _operator(const LeftT& lhs, const RightT& rhs) const {
@@ -389,7 +391,7 @@ private:
             }
         } else {
             auto* data_array =
-                    
vectorized::check_and_get_column<vectorized::PredicateColumnType<TReal>>(column)
+                    
vectorized::check_and_get_column<vectorized::PredicateColumnType<Type>>(column)
                             ->get_data()
                             .data();
 
@@ -436,7 +438,7 @@ private:
             }
         } else {
             auto* data_array =
-                    
vectorized::check_and_get_column<vectorized::PredicateColumnType<TReal>>(column)
+                    
vectorized::check_and_get_column<vectorized::PredicateColumnType<Type>>(column)
                             ->get_data()
                             .data();
 
@@ -448,17 +450,4 @@ private:
     TReal _value_real;
 };
 
-template <class T>
-using EqualPredicate = ComparisonPredicateBase<T, PredicateType::EQ>;
-template <class T>
-using NotEqualPredicate = ComparisonPredicateBase<T, PredicateType::NE>;
-template <class T>
-using LessPredicate = ComparisonPredicateBase<T, PredicateType::LT>;
-template <class T>
-using LessEqualPredicate = ComparisonPredicateBase<T, PredicateType::LE>;
-template <class T>
-using GreaterPredicate = ComparisonPredicateBase<T, PredicateType::GT>;
-template <class T>
-using GreaterEqualPredicate = ComparisonPredicateBase<T, PredicateType::GE>;
-
 } //namespace doris
diff --git a/be/src/olap/in_list_predicate.h b/be/src/olap/in_list_predicate.h
index 35b4c4162e..2a7658621a 100644
--- a/be/src/olap/in_list_predicate.h
+++ b/be/src/olap/in_list_predicate.h
@@ -76,9 +76,11 @@ struct equal_to<doris::uint24_t> {
 
 namespace doris {
 
-template <class T, PredicateType PT>
+template <PrimitiveType Type, PredicateType PT>
 class InListPredicateBase : public ColumnPredicate {
 public:
+    using T = std::conditional_t<Type == TYPE_DATE, uint24_t,
+                                 typename 
PredicatePrimitiveTypeTraits<Type>::PredicateFieldType>;
     InListPredicateBase(uint32_t column_id, phmap::flat_hash_set<T>&& values,
                         bool is_opposite = false)
             : ColumnPredicate(column_id, is_opposite), 
_values(std::move(values)) {}
@@ -238,7 +240,7 @@ private:
 
         if constexpr (std::is_same_v<T, uint24_t>) {
             auto* nested_col_ptr =
-                    
vectorized::check_and_get_column<vectorized::PredicateColumnType<uint32_t>>(
+                    
vectorized::check_and_get_column<vectorized::PredicateColumnType<TYPE_DATE>>(
                             column);
             auto& data_array = nested_col_ptr->get_data();
 
@@ -299,7 +301,7 @@ private:
             }
         } else {
             auto* nested_col_ptr =
-                    
vectorized::check_and_get_column<vectorized::PredicateColumnType<T>>(column);
+                    
vectorized::check_and_get_column<vectorized::PredicateColumnType<Type>>(column);
             auto& data_array = nested_col_ptr->get_data();
 
             for (uint16_t i = 0; i < size; i++) {
@@ -334,10 +336,4 @@ private:
     mutable std::vector<vectorized::UInt8> _value_in_dict_flags;
 };
 
-template <class T>
-using InListPredicate = InListPredicateBase<T, PredicateType::IN_LIST>;
-
-template <class T>
-using NotInListPredicate = InListPredicateBase<T, PredicateType::NOT_IN_LIST>;
-
 } //namespace doris
diff --git a/be/src/olap/like_column_predicate.cpp 
b/be/src/olap/like_column_predicate.cpp
index 8be04cfe1e..6596509519 100644
--- a/be/src/olap/like_column_predicate.cpp
+++ b/be/src/olap/like_column_predicate.cpp
@@ -96,7 +96,7 @@ uint16_t LikeColumnPredicate<is_vectorized>::evaluate(const 
vectorized::IColumn&
                 }
             } else {
                 auto* data_array = vectorized::check_and_get_column<
-                                           
vectorized::PredicateColumnType<StringValue>>(column)
+                                           
vectorized::PredicateColumnType<TYPE_STRING>>(column)
                                            ->get_data()
                                            .data();
                 for (uint16_t i = 0; i != size; i++) {
@@ -129,7 +129,7 @@ uint16_t LikeColumnPredicate<is_vectorized>::evaluate(const 
vectorized::IColumn&
                 }
             } else {
                 auto* data_array = vectorized::check_and_get_column<
-                                           
vectorized::PredicateColumnType<StringValue>>(column)
+                                           
vectorized::PredicateColumnType<TYPE_STRING>>(column)
                                            ->get_data()
                                            .data();
 
diff --git a/be/src/olap/predicate_creator.h b/be/src/olap/predicate_creator.h
index 1605d34337..b222a6272a 100644
--- a/be/src/olap/predicate_creator.h
+++ b/be/src/olap/predicate_creator.h
@@ -37,7 +37,7 @@ public:
     virtual ~PredicateCreator() = default;
 };
 
-template <typename CppType, PredicateType PT, typename ConditionType>
+template <PrimitiveType Type, typename CppType, PredicateType PT, typename 
ConditionType>
 class IntegerPredicateCreator : public PredicateCreator<ConditionType> {
 public:
     ColumnPredicate* create(const TabletColumn& column, int index, const 
ConditionType& conditions,
@@ -47,10 +47,10 @@ public:
             for (const auto& condition : conditions) {
                 values.insert(convert(condition));
             }
-            return new InListPredicateBase<CppType, PT>(index, 
std::move(values), opposite);
+            return new InListPredicateBase<Type, PT>(index, std::move(values), 
opposite);
         } else {
             static_assert(PredicateTypeTraits::is_comparison(PT));
-            return new ComparisonPredicateBase<CppType, PT>(index, 
convert(conditions), opposite);
+            return new ComparisonPredicateBase<Type, PT>(index, 
convert(conditions), opposite);
         }
     }
 
@@ -62,7 +62,7 @@ private:
     }
 };
 
-template <typename CppType, PredicateType PT, typename ConditionType>
+template <PrimitiveType Type, typename CppType, PredicateType PT, typename 
ConditionType>
 class DecimalPredicateCreator : public PredicateCreator<ConditionType> {
 public:
     ColumnPredicate* create(const TabletColumn& column, int index, const 
ConditionType& conditions,
@@ -72,11 +72,11 @@ public:
             for (const auto& condition : conditions) {
                 values.insert(convert(column, condition));
             }
-            return new InListPredicateBase<CppType, PT>(index, 
std::move(values), opposite);
+            return new InListPredicateBase<Type, PT>(index, std::move(values), 
opposite);
         } else {
             static_assert(PredicateTypeTraits::is_comparison(PT));
-            return new ComparisonPredicateBase<CppType, PT>(index, 
convert(column, conditions),
-                                                            opposite);
+            return new ComparisonPredicateBase<Type, PT>(index, 
convert(column, conditions),
+                                                         opposite);
         }
     }
 
@@ -89,7 +89,7 @@ private:
     }
 };
 
-template <PredicateType PT, typename ConditionType>
+template <PrimitiveType Type, PredicateType PT, typename ConditionType>
 class StringPredicateCreator : public PredicateCreator<ConditionType> {
 public:
     StringPredicateCreator(bool should_padding) : 
_should_padding(should_padding) {};
@@ -101,11 +101,11 @@ public:
             for (const auto& condition : conditions) {
                 values.insert(convert(column, condition, pool));
             }
-            return new InListPredicateBase<StringValue, PT>(index, 
std::move(values), opposite);
+            return new InListPredicateBase<Type, PT>(index, std::move(values), 
opposite);
         } else {
             static_assert(PredicateTypeTraits::is_comparison(PT));
-            return new ComparisonPredicateBase<StringValue, PT>(
-                    index, convert(column, conditions, pool), opposite);
+            return new ComparisonPredicateBase<Type, PT>(index, 
convert(column, conditions, pool),
+                                                         opposite);
         }
     }
 
@@ -125,7 +125,7 @@ private:
     }
 };
 
-template <typename CppType, PredicateType PT, typename ConditionType>
+template <PrimitiveType Type, typename CppType, PredicateType PT, typename 
ConditionType>
 struct CustomPredicateCreator : public PredicateCreator<ConditionType> {
 public:
     CustomPredicateCreator(const std::function<CppType(const std::string& 
condition)>& convert)
@@ -138,10 +138,10 @@ public:
             for (const auto& condition : conditions) {
                 values.insert(_convert(condition));
             }
-            return new InListPredicateBase<CppType, PT>(index, 
std::move(values), opposite);
+            return new InListPredicateBase<Type, PT>(index, std::move(values), 
opposite);
         } else {
             static_assert(PredicateTypeTraits::is_comparison(PT));
-            return new ComparisonPredicateBase<CppType, PT>(index, 
_convert(conditions), opposite);
+            return new ComparisonPredicateBase<Type, PT>(index, 
_convert(conditions), opposite);
         }
     }
 
@@ -153,22 +153,25 @@ template <PredicateType PT, typename ConditionType>
 inline std::unique_ptr<PredicateCreator<ConditionType>> get_creator(const 
FieldType& type) {
     switch (type) {
     case OLAP_FIELD_TYPE_TINYINT: {
-        return std::make_unique<IntegerPredicateCreator<int8_t, PT, 
ConditionType>>();
+        return std::make_unique<IntegerPredicateCreator<TYPE_TINYINT, int8_t, 
PT, ConditionType>>();
     }
     case OLAP_FIELD_TYPE_SMALLINT: {
-        return std::make_unique<IntegerPredicateCreator<int16_t, PT, 
ConditionType>>();
+        return std::make_unique<
+                IntegerPredicateCreator<TYPE_SMALLINT, int16_t, PT, 
ConditionType>>();
     }
     case OLAP_FIELD_TYPE_INT: {
-        return std::make_unique<IntegerPredicateCreator<int32_t, PT, 
ConditionType>>();
+        return std::make_unique<IntegerPredicateCreator<TYPE_INT, int32_t, PT, 
ConditionType>>();
     }
     case OLAP_FIELD_TYPE_BIGINT: {
-        return std::make_unique<IntegerPredicateCreator<int64_t, PT, 
ConditionType>>();
+        return std::make_unique<IntegerPredicateCreator<TYPE_BIGINT, int64_t, 
PT, ConditionType>>();
     }
     case OLAP_FIELD_TYPE_LARGEINT: {
-        return std::make_unique<IntegerPredicateCreator<int128_t, PT, 
ConditionType>>();
+        return std::make_unique<
+                IntegerPredicateCreator<TYPE_LARGEINT, int128_t, PT, 
ConditionType>>();
     }
     case OLAP_FIELD_TYPE_DECIMAL: {
-        return std::make_unique<CustomPredicateCreator<decimal12_t, PT, 
ConditionType>>(
+        return std::make_unique<
+                CustomPredicateCreator<TYPE_DECIMALV2, decimal12_t, PT, 
ConditionType>>(
                 [](const std::string& condition) {
                     decimal12_t value = {0, 0};
                     value.from_string(condition);
@@ -176,39 +179,43 @@ inline std::unique_ptr<PredicateCreator<ConditionType>> 
get_creator(const FieldT
                 });
     }
     case OLAP_FIELD_TYPE_DECIMAL32: {
-        return std::make_unique<DecimalPredicateCreator<int32_t, PT, 
ConditionType>>();
+        return std::make_unique<
+                DecimalPredicateCreator<TYPE_DECIMAL32, int32_t, PT, 
ConditionType>>();
     }
     case OLAP_FIELD_TYPE_DECIMAL64: {
-        return std::make_unique<DecimalPredicateCreator<int64_t, PT, 
ConditionType>>();
+        return std::make_unique<
+                DecimalPredicateCreator<TYPE_DECIMAL64, int64_t, PT, 
ConditionType>>();
     }
     case OLAP_FIELD_TYPE_DECIMAL128: {
-        return std::make_unique<DecimalPredicateCreator<int128_t, PT, 
ConditionType>>();
+        return std::make_unique<
+                DecimalPredicateCreator<TYPE_DECIMAL128, int128_t, PT, 
ConditionType>>();
     }
     case OLAP_FIELD_TYPE_CHAR: {
-        return std::make_unique<StringPredicateCreator<PT, 
ConditionType>>(true);
+        return std::make_unique<StringPredicateCreator<TYPE_CHAR, PT, 
ConditionType>>(true);
     }
     case OLAP_FIELD_TYPE_VARCHAR:
     case OLAP_FIELD_TYPE_STRING: {
-        return std::make_unique<StringPredicateCreator<PT, 
ConditionType>>(false);
+        return std::make_unique<StringPredicateCreator<TYPE_STRING, PT, 
ConditionType>>(false);
     }
     case OLAP_FIELD_TYPE_DATE: {
-        return std::make_unique<CustomPredicateCreator<uint24_t, PT, 
ConditionType>>(
+        return std::make_unique<CustomPredicateCreator<TYPE_DATE, uint24_t, 
PT, ConditionType>>(
                 timestamp_from_date);
     }
     case OLAP_FIELD_TYPE_DATEV2: {
-        return std::make_unique<CustomPredicateCreator<uint32_t, PT, 
ConditionType>>(
+        return std::make_unique<CustomPredicateCreator<TYPE_DATEV2, uint32_t, 
PT, ConditionType>>(
                 timestamp_from_date_v2);
     }
     case OLAP_FIELD_TYPE_DATETIME: {
-        return std::make_unique<CustomPredicateCreator<uint64_t, PT, 
ConditionType>>(
+        return std::make_unique<CustomPredicateCreator<TYPE_DATETIME, 
uint64_t, PT, ConditionType>>(
                 timestamp_from_datetime);
     }
     case OLAP_FIELD_TYPE_DATETIMEV2: {
-        return std::make_unique<CustomPredicateCreator<uint64_t, PT, 
ConditionType>>(
+        return std::make_unique<
+                CustomPredicateCreator<TYPE_DATETIMEV2, uint64_t, PT, 
ConditionType>>(
                 timestamp_from_datetime_v2);
     }
     case OLAP_FIELD_TYPE_BOOL: {
-        return std::make_unique<CustomPredicateCreator<bool, PT, 
ConditionType>>(
+        return std::make_unique<CustomPredicateCreator<TYPE_BOOLEAN, bool, PT, 
ConditionType>>(
                 [](const std::string& condition) {
                     int32_t ivalue = 0;
                     auto result = std::from_chars(condition.data(),
diff --git a/be/src/olap/schema.cpp b/be/src/olap/schema.cpp
index 7f49735821..d6352b0cd1 100644
--- a/be/src/olap/schema.cpp
+++ b/be/src/olap/schema.cpp
@@ -127,40 +127,40 @@ vectorized::IColumn::MutablePtr 
Schema::get_predicate_column_nullable_ptr(FieldT
 vectorized::IColumn::MutablePtr Schema::get_predicate_column_ptr(FieldType 
type) {
     switch (type) {
     case OLAP_FIELD_TYPE_BOOL:
-        return doris::vectorized::PredicateColumnType<bool>::create();
+        return doris::vectorized::PredicateColumnType<TYPE_BOOLEAN>::create();
 
     case OLAP_FIELD_TYPE_TINYINT:
-        return 
doris::vectorized::PredicateColumnType<doris::vectorized::Int8>::create();
+        return doris::vectorized::PredicateColumnType<TYPE_TINYINT>::create();
 
     case OLAP_FIELD_TYPE_SMALLINT:
-        return 
doris::vectorized::PredicateColumnType<doris::vectorized::Int16>::create();
+        return doris::vectorized::PredicateColumnType<TYPE_SMALLINT>::create();
 
     case OLAP_FIELD_TYPE_INT:
-        return 
doris::vectorized::PredicateColumnType<doris::vectorized::Int32>::create();
+        return doris::vectorized::PredicateColumnType<TYPE_INT>::create();
 
     case OLAP_FIELD_TYPE_FLOAT:
-        return 
doris::vectorized::PredicateColumnType<doris::vectorized::Float32>::create();
+        return doris::vectorized::PredicateColumnType<TYPE_FLOAT>::create();
 
     case OLAP_FIELD_TYPE_DOUBLE:
-        return 
doris::vectorized::PredicateColumnType<doris::vectorized::Float64>::create();
+        return doris::vectorized::PredicateColumnType<TYPE_DOUBLE>::create();
 
     case OLAP_FIELD_TYPE_BIGINT:
-        return 
doris::vectorized::PredicateColumnType<doris::vectorized::Int64>::create();
+        return doris::vectorized::PredicateColumnType<TYPE_BIGINT>::create();
 
     case OLAP_FIELD_TYPE_LARGEINT:
-        return 
doris::vectorized::PredicateColumnType<doris::vectorized::Int128>::create();
+        return doris::vectorized::PredicateColumnType<TYPE_LARGEINT>::create();
 
     case OLAP_FIELD_TYPE_DATE:
-        return doris::vectorized::PredicateColumnType<uint32_t>::create();
+        return doris::vectorized::PredicateColumnType<TYPE_DATE>::create();
 
     case OLAP_FIELD_TYPE_DATEV2:
-        return doris::vectorized::PredicateColumnType<uint32_t>::create();
+        return doris::vectorized::PredicateColumnType<TYPE_DATEV2>::create();
 
     case OLAP_FIELD_TYPE_DATETIMEV2:
-        return doris::vectorized::PredicateColumnType<uint64_t>::create();
+        return 
doris::vectorized::PredicateColumnType<TYPE_DATETIMEV2>::create();
 
     case OLAP_FIELD_TYPE_DATETIME:
-        return doris::vectorized::PredicateColumnType<uint64_t>::create();
+        return doris::vectorized::PredicateColumnType<TYPE_DATETIME>::create();
 
     case OLAP_FIELD_TYPE_CHAR:
     case OLAP_FIELD_TYPE_VARCHAR:
@@ -168,16 +168,16 @@ vectorized::IColumn::MutablePtr 
Schema::get_predicate_column_ptr(FieldType type)
         if (config::enable_low_cardinality_optimize) {
             return 
doris::vectorized::ColumnDictionary<doris::vectorized::Int32>::create(type);
         }
-        return doris::vectorized::PredicateColumnType<StringValue>::create();
+        return doris::vectorized::PredicateColumnType<TYPE_STRING>::create();
 
     case OLAP_FIELD_TYPE_DECIMAL:
-        return doris::vectorized::PredicateColumnType<decimal12_t>::create();
+        return 
doris::vectorized::PredicateColumnType<TYPE_DECIMALV2>::create();
     case OLAP_FIELD_TYPE_DECIMAL32:
-        return 
doris::vectorized::PredicateColumnType<doris::vectorized::Int32>::create();
+        return 
doris::vectorized::PredicateColumnType<TYPE_DECIMAL32>::create();
     case OLAP_FIELD_TYPE_DECIMAL64:
-        return 
doris::vectorized::PredicateColumnType<doris::vectorized::Int64>::create();
+        return 
doris::vectorized::PredicateColumnType<TYPE_DECIMAL64>::create();
     case OLAP_FIELD_TYPE_DECIMAL128:
-        return 
doris::vectorized::PredicateColumnType<doris::vectorized::Int128>::create();
+        return 
doris::vectorized::PredicateColumnType<TYPE_DECIMAL128>::create();
 
     default:
         LOG(FATAL) << "Unexpected type when choosing predicate column, type=" 
<< type;
diff --git a/be/src/runtime/primitive_type.h b/be/src/runtime/primitive_type.h
index e6aba461fb..7fc6a728de 100644
--- a/be/src/runtime/primitive_type.h
+++ b/be/src/runtime/primitive_type.h
@@ -221,7 +221,7 @@ struct PredicatePrimitiveTypeTraits<TYPE_DECIMALV2> {
 
 template <>
 struct PredicatePrimitiveTypeTraits<TYPE_DATE> {
-    using PredicateFieldType = uint24_t;
+    using PredicateFieldType = uint32_t;
 };
 
 template <>
diff --git a/be/src/vec/columns/column_dictionary.h 
b/be/src/vec/columns/column_dictionary.h
index 00800ca055..66953b35bd 100644
--- a/be/src/vec/columns/column_dictionary.h
+++ b/be/src/vec/columns/column_dictionary.h
@@ -257,7 +257,7 @@ public:
     bool is_dict_code_converted() const { return _dict_code_converted; }
 
     MutableColumnPtr convert_to_predicate_column_if_dictionary() override {
-        auto res = vectorized::PredicateColumnType<StringValue>::create();
+        auto res = vectorized::PredicateColumnType<TYPE_STRING>::create();
         res->reserve(_reserve_size);
         for (size_t i = 0; i < _codes.size(); ++i) {
             auto& code = reinterpret_cast<T&>(_codes[i]);
diff --git a/be/src/vec/columns/predicate_column.h 
b/be/src/vec/columns/predicate_column.h
index daa4163f05..1131f93d59 100644
--- a/be/src/vec/columns/predicate_column.h
+++ b/be/src/vec/columns/predicate_column.h
@@ -34,12 +34,13 @@ namespace doris::vectorized {
  *
  *  T = predicate column type
  */
-template <typename T>
-class PredicateColumnType final : public COWHelper<IColumn, 
PredicateColumnType<T>> {
+template <PrimitiveType Type>
+class PredicateColumnType final : public COWHelper<IColumn, 
PredicateColumnType<Type>> {
 private:
     PredicateColumnType() {}
     PredicateColumnType(const size_t n) : data(n) {}
-    friend class COWHelper<IColumn, PredicateColumnType<T>>;
+    friend class COWHelper<IColumn, PredicateColumnType<Type>>;
+    using T = typename PredicatePrimitiveTypeTraits<Type>::PredicateFieldType;
 
     PredicateColumnType(const PredicateColumnType& src) : 
data(src.data.begin(), src.data.end()) {}
 
@@ -241,9 +242,7 @@ public:
             insert_many_in_copy_way(data_ptr, num);
         } else if constexpr (std::is_same_v<T, StringValue>) {
             // here is unreachable, just for compilation to be able to pass
-        } else if constexpr (std::is_same_v<
-                                     T,
-                                     uint32_t>) { // todo(wb) a trick type 
judge here,need refactor
+        } else if constexpr (Type == TYPE_DATE) {
             insert_many_date(data_ptr, num);
         } else {
             insert_many_default_type(data_ptr, num);
@@ -484,6 +483,5 @@ private:
     // manages the memory for slice's data(For string type)
     std::unique_ptr<MemPool> _pool;
 };
-using ColumnStringValue = PredicateColumnType<StringValue>;
 
 } // namespace doris::vectorized
diff --git a/be/test/olap/block_column_predicate_test.cpp 
b/be/test/olap/block_column_predicate_test.cpp
index 876ec189e5..7de5c4a279 100644
--- a/be/test/olap/block_column_predicate_test.cpp
+++ b/be/test/olap/block_column_predicate_test.cpp
@@ -76,7 +76,8 @@ TEST_F(BlockColumnPredicateTest, SINGLE_COLUMN) {
     }
     float value = 5.0;
 
-    std::unique_ptr<ColumnPredicate> pred(new EqualPredicate<float>(0, value));
+    std::unique_ptr<ColumnPredicate> pred(
+            new ComparisonPredicateBase<TYPE_FLOAT, PredicateType::EQ>(0, 
value));
     SingleColumnBlockPredicate single_column_block_pred(pred.get());
 
     init_row_block(tablet_schema, size);
@@ -94,12 +95,13 @@ TEST_F(BlockColumnPredicateTest, SINGLE_COLUMN) {
 
 TEST_F(BlockColumnPredicateTest, SINGLE_COLUMN_VEC) {
     vectorized::MutableColumns block;
-    block.push_back(vectorized::PredicateColumnType<int>::create());
+    block.push_back(vectorized::PredicateColumnType<TYPE_INT>::create());
 
     int value = 5;
     int rows = 10;
     int col_idx = 0;
-    std::unique_ptr<ColumnPredicate> pred(new EqualPredicate<int>(col_idx, 
value));
+    std::unique_ptr<ColumnPredicate> pred(
+            new ComparisonPredicateBase<TYPE_INT, PredicateType::EQ>(col_idx, 
value));
     SingleColumnBlockPredicate single_column_block_pred(pred.get());
 
     uint16_t sel_idx[rows];
@@ -113,7 +115,8 @@ TEST_F(BlockColumnPredicateTest, SINGLE_COLUMN_VEC) {
 
     selected_size = single_column_block_pred.evaluate(block, sel_idx, 
selected_size);
     EXPECT_EQ(selected_size, 1);
-    auto* pred_col = 
reinterpret_cast<vectorized::PredicateColumnType<int>*>(block[col_idx].get());
+    auto* pred_col =
+            
reinterpret_cast<vectorized::PredicateColumnType<TYPE_INT>*>(block[col_idx].get());
     EXPECT_EQ(pred_col->get_data()[sel_idx[0]], value);
 }
 
@@ -128,8 +131,10 @@ TEST_F(BlockColumnPredicateTest, AND_MUTI_COLUMN) {
     }
     double less_value = 5.0;
     double great_value = 3.0;
-    std::unique_ptr<ColumnPredicate> less_pred(new LessPredicate<double>(0, 
less_value));
-    std::unique_ptr<ColumnPredicate> great_pred(new 
GreaterPredicate<double>(0, great_value));
+    std::unique_ptr<ColumnPredicate> less_pred(
+            new ComparisonPredicateBase<TYPE_DOUBLE, PredicateType::LT>(0, 
less_value));
+    std::unique_ptr<ColumnPredicate> great_pred(
+            new ComparisonPredicateBase<TYPE_DOUBLE, PredicateType::GT>(0, 
great_value));
     auto single_less_pred = new SingleColumnBlockPredicate(less_pred.get());
     auto single_great_pred = new SingleColumnBlockPredicate(great_pred.get());
 
@@ -152,14 +157,16 @@ TEST_F(BlockColumnPredicateTest, AND_MUTI_COLUMN) {
 
 TEST_F(BlockColumnPredicateTest, AND_MUTI_COLUMN_VEC) {
     vectorized::MutableColumns block;
-    block.push_back(vectorized::PredicateColumnType<int>::create());
+    block.push_back(vectorized::PredicateColumnType<TYPE_INT>::create());
 
     int less_value = 5;
     int great_value = 3;
     int rows = 10;
     int col_idx = 0;
-    std::unique_ptr<ColumnPredicate> less_pred(new LessPredicate<int>(col_idx, 
less_value));
-    std::unique_ptr<ColumnPredicate> great_pred(new 
GreaterPredicate<int>(col_idx, great_value));
+    std::unique_ptr<ColumnPredicate> less_pred(
+            new ComparisonPredicateBase<TYPE_INT, PredicateType::LT>(col_idx, 
less_value));
+    std::unique_ptr<ColumnPredicate> great_pred(
+            new ComparisonPredicateBase<TYPE_INT, PredicateType::GT>(col_idx, 
great_value));
     auto single_less_pred = new SingleColumnBlockPredicate(less_pred.get());
     auto single_great_pred = new SingleColumnBlockPredicate(great_pred.get());
 
@@ -178,7 +185,8 @@ TEST_F(BlockColumnPredicateTest, AND_MUTI_COLUMN_VEC) {
 
     selected_size = and_block_column_pred.evaluate(block, sel_idx, 
selected_size);
     EXPECT_EQ(selected_size, 1);
-    auto* pred_col = 
reinterpret_cast<vectorized::PredicateColumnType<int>*>(block[col_idx].get());
+    auto* pred_col =
+            
reinterpret_cast<vectorized::PredicateColumnType<TYPE_INT>*>(block[col_idx].get());
     EXPECT_EQ(pred_col->get_data()[sel_idx[0]], 4);
 }
 
@@ -193,8 +201,10 @@ TEST_F(BlockColumnPredicateTest, OR_MUTI_COLUMN) {
     }
     double less_value = 5.0;
     double great_value = 3.0;
-    std::unique_ptr<ColumnPredicate> less_pred(new LessPredicate<double>(0, 
less_value));
-    std::unique_ptr<ColumnPredicate> great_pred(new 
GreaterPredicate<double>(0, great_value));
+    std::unique_ptr<ColumnPredicate> less_pred(
+            new ComparisonPredicateBase<TYPE_DOUBLE, PredicateType::LT>(0, 
less_value));
+    std::unique_ptr<ColumnPredicate> great_pred(
+            new ComparisonPredicateBase<TYPE_DOUBLE, PredicateType::GT>(0, 
great_value));
     auto single_less_pred = new SingleColumnBlockPredicate(less_pred.get());
     auto single_great_pred = new SingleColumnBlockPredicate(great_pred.get());
 
@@ -217,14 +227,16 @@ TEST_F(BlockColumnPredicateTest, OR_MUTI_COLUMN) {
 
 TEST_F(BlockColumnPredicateTest, OR_MUTI_COLUMN_VEC) {
     vectorized::MutableColumns block;
-    block.push_back(vectorized::PredicateColumnType<int>::create());
+    block.push_back(vectorized::PredicateColumnType<TYPE_INT>::create());
 
     int less_value = 5;
     int great_value = 3;
     int rows = 10;
     int col_idx = 0;
-    std::unique_ptr<ColumnPredicate> less_pred(new LessPredicate<int>(col_idx, 
less_value));
-    std::unique_ptr<ColumnPredicate> great_pred(new 
GreaterPredicate<int>(col_idx, great_value));
+    std::unique_ptr<ColumnPredicate> less_pred(
+            new ComparisonPredicateBase<TYPE_INT, PredicateType::LT>(col_idx, 
less_value));
+    std::unique_ptr<ColumnPredicate> great_pred(
+            new ComparisonPredicateBase<TYPE_INT, PredicateType::GT>(col_idx, 
great_value));
     auto single_less_pred = new SingleColumnBlockPredicate(less_pred.get());
     auto single_great_pred = new SingleColumnBlockPredicate(great_pred.get());
 
@@ -243,7 +255,8 @@ TEST_F(BlockColumnPredicateTest, OR_MUTI_COLUMN_VEC) {
 
     selected_size = or_block_column_pred.evaluate(block, sel_idx, 
selected_size);
     EXPECT_EQ(selected_size, 10);
-    auto* pred_col = 
reinterpret_cast<vectorized::PredicateColumnType<int>*>(block[col_idx].get());
+    auto* pred_col =
+            
reinterpret_cast<vectorized::PredicateColumnType<TYPE_INT>*>(block[col_idx].get());
     EXPECT_EQ(pred_col->get_data()[sel_idx[0]], 0);
 }
 
@@ -258,9 +271,12 @@ TEST_F(BlockColumnPredicateTest, OR_AND_MUTI_COLUMN) {
     }
     double less_value = 5.0;
     double great_value = 3.0;
-    std::unique_ptr<ColumnPredicate> less_pred(new LessPredicate<double>(0, 
less_value));
-    std::unique_ptr<ColumnPredicate> great_pred(new 
GreaterPredicate<double>(0, great_value));
-    std::unique_ptr<ColumnPredicate> less_pred1(new LessPredicate<double>(0, 
great_value));
+    std::unique_ptr<ColumnPredicate> less_pred(
+            new ComparisonPredicateBase<TYPE_DOUBLE, PredicateType::LT>(0, 
less_value));
+    std::unique_ptr<ColumnPredicate> great_pred(
+            new ComparisonPredicateBase<TYPE_DOUBLE, PredicateType::GT>(0, 
great_value));
+    std::unique_ptr<ColumnPredicate> less_pred1(
+            new ComparisonPredicateBase<TYPE_DOUBLE, PredicateType::LT>(0, 
great_value));
 
     init_row_block(tablet_schema, size);
     ColumnBlock col_block = _row_block->column_block(0);
@@ -310,15 +326,18 @@ TEST_F(BlockColumnPredicateTest, OR_AND_MUTI_COLUMN) {
 
 TEST_F(BlockColumnPredicateTest, OR_AND_MUTI_COLUMN_VEC) {
     vectorized::MutableColumns block;
-    block.push_back(vectorized::PredicateColumnType<int>::create());
+    block.push_back(vectorized::PredicateColumnType<TYPE_INT>::create());
 
     int less_value = 5;
     int great_value = 3;
     int rows = 10;
     int col_idx = 0;
-    std::unique_ptr<ColumnPredicate> less_pred(new LessPredicate<int>(0, 
less_value));
-    std::unique_ptr<ColumnPredicate> great_pred(new GreaterPredicate<int>(0, 
great_value));
-    std::unique_ptr<ColumnPredicate> less_pred1(new LessPredicate<int>(0, 
great_value));
+    std::unique_ptr<ColumnPredicate> less_pred(
+            new ComparisonPredicateBase<TYPE_INT, PredicateType::LT>(0, 
less_value));
+    std::unique_ptr<ColumnPredicate> great_pred(
+            new ComparisonPredicateBase<TYPE_INT, PredicateType::GT>(0, 
great_value));
+    std::unique_ptr<ColumnPredicate> less_pred1(
+            new ComparisonPredicateBase<TYPE_INT, PredicateType::LT>(0, 
great_value));
 
     // Test for and or single
     // (column < 5 and column > 3) or column < 3
@@ -341,7 +360,8 @@ TEST_F(BlockColumnPredicateTest, OR_AND_MUTI_COLUMN_VEC) {
 
     selected_size = or_block_column_pred.evaluate(block, sel_idx, 
selected_size);
     EXPECT_EQ(selected_size, 4);
-    auto* pred_col = 
reinterpret_cast<vectorized::PredicateColumnType<int>*>(block[col_idx].get());
+    auto* pred_col =
+            
reinterpret_cast<vectorized::PredicateColumnType<TYPE_INT>*>(block[col_idx].get());
     EXPECT_EQ(pred_col->get_data()[sel_idx[0]], 0);
     EXPECT_EQ(pred_col->get_data()[sel_idx[1]], 1);
     EXPECT_EQ(pred_col->get_data()[sel_idx[2]], 2);
@@ -376,9 +396,12 @@ TEST_F(BlockColumnPredicateTest, AND_OR_MUTI_COLUMN) {
     }
     double less_value = 5.0;
     double great_value = 3.0;
-    std::unique_ptr<ColumnPredicate> less_pred(new LessPredicate<double>(0, 
less_value));
-    std::unique_ptr<ColumnPredicate> great_pred(new 
GreaterPredicate<double>(0, great_value));
-    std::unique_ptr<ColumnPredicate> less_pred1(new LessPredicate<double>(0, 
great_value));
+    std::unique_ptr<ColumnPredicate> less_pred(
+            new ComparisonPredicateBase<TYPE_DOUBLE, PredicateType::LT>(0, 
less_value));
+    std::unique_ptr<ColumnPredicate> great_pred(
+            new ComparisonPredicateBase<TYPE_DOUBLE, PredicateType::GT>(0, 
great_value));
+    std::unique_ptr<ColumnPredicate> less_pred1(
+            new ComparisonPredicateBase<TYPE_DOUBLE, PredicateType::LT>(0, 
great_value));
 
     init_row_block(tablet_schema, size);
     ColumnBlock col_block = _row_block->column_block(0);
@@ -422,15 +445,18 @@ TEST_F(BlockColumnPredicateTest, AND_OR_MUTI_COLUMN) {
 
 TEST_F(BlockColumnPredicateTest, AND_OR_MUTI_COLUMN_VEC) {
     vectorized::MutableColumns block;
-    block.push_back(vectorized::PredicateColumnType<int>::create());
+    block.push_back(vectorized::PredicateColumnType<TYPE_INT>::create());
 
     int less_value = 5;
     int great_value = 3;
     int rows = 10;
     int col_idx = 0;
-    std::unique_ptr<ColumnPredicate> less_pred(new LessPredicate<int>(0, 
less_value));
-    std::unique_ptr<ColumnPredicate> great_pred(new GreaterPredicate<int>(0, 
great_value));
-    std::unique_ptr<ColumnPredicate> less_pred1(new LessPredicate<int>(0, 
great_value));
+    std::unique_ptr<ColumnPredicate> less_pred(
+            new ComparisonPredicateBase<TYPE_INT, PredicateType::LT>(0, 
less_value));
+    std::unique_ptr<ColumnPredicate> great_pred(
+            new ComparisonPredicateBase<TYPE_INT, PredicateType::GT>(0, 
great_value));
+    std::unique_ptr<ColumnPredicate> less_pred1(
+            new ComparisonPredicateBase<TYPE_INT, PredicateType::LT>(0, 
great_value));
 
     // Test for and or single
     // (column < 5 or column < 3) and column > 3
@@ -453,7 +479,8 @@ TEST_F(BlockColumnPredicateTest, AND_OR_MUTI_COLUMN_VEC) {
 
     selected_size = and_block_column_pred.evaluate(block, sel_idx, 
selected_size);
 
-    auto* pred_col = 
reinterpret_cast<vectorized::PredicateColumnType<int>*>(block[col_idx].get());
+    auto* pred_col =
+            
reinterpret_cast<vectorized::PredicateColumnType<TYPE_INT>*>(block[col_idx].get());
     EXPECT_EQ(selected_size, 1);
     EXPECT_EQ(pred_col->get_data()[sel_idx[0]], 4);
 
diff --git a/be/test/olap/bloom_filter_column_predicate_test.cpp 
b/be/test/olap/bloom_filter_column_predicate_test.cpp
index e597d50172..6092fab5c8 100644
--- a/be/test/olap/bloom_filter_column_predicate_test.cpp
+++ b/be/test/olap/bloom_filter_column_predicate_test.cpp
@@ -125,7 +125,7 @@ TEST_F(TestBloomFilterColumnPredicate, FLOAT_COLUMN) {
     
EXPECT_FLOAT_EQ(*(float*)col_block.cell(_row_block->selection_vector()[0]).cell_ptr(),
 5.1);
 
     // for vectorized::Block no null
-    auto pred_col = PredicateColumnType<vectorized::Float32>::create();
+    auto pred_col = PredicateColumnType<TYPE_FLOAT>::create();
     pred_col->reserve(size);
     for (int i = 0; i < size; ++i) {
         *(col_data + i) = i + 0.1f;
@@ -151,7 +151,7 @@ TEST_F(TestBloomFilterColumnPredicate, FLOAT_COLUMN) {
             vectorized::ColumnNullable::create(std::move(pred_col), 
std::move(null_map));
     select_size = pred->evaluate(*nullable_col, 
_row_block->selection_vector(), select_size);
     EXPECT_EQ(select_size, 1);
-    auto nested_col = 
check_and_get_column<PredicateColumnType<vectorized::Float32>>(
+    auto nested_col = check_and_get_column<PredicateColumnType<TYPE_FLOAT>>(
             nullable_col->get_nested_column());
     
EXPECT_FLOAT_EQ((float)nested_col->get_data()[_row_block->selection_vector()[0]],
 5.1);
 
diff --git a/be/test/olap/comparison_predicate_test.cpp 
b/be/test/olap/comparison_predicate_test.cpp
index b29ea20582..4095784029 100644
--- a/be/test/olap/comparison_predicate_test.cpp
+++ b/be/test/olap/comparison_predicate_test.cpp
@@ -26,6 +26,7 @@
 #include "olap/row_block2.h"
 #include "olap/wrapper_field.h"
 #include "runtime/mem_pool.h"
+#include "runtime/primitive_type.h"
 #include "runtime/string_value.hpp"
 #include "util/logging.h"
 
@@ -129,7 +130,7 @@ TEST_F(TestEqualPredicate, FLOAT_COLUMN) {
         return_columns.push_back(i);
     }
     float value = 5.0;
-    ColumnPredicate* pred = new EqualPredicate<float>(0, value);
+    ColumnPredicate* pred = new ComparisonPredicateBase<TYPE_FLOAT, 
PredicateType::EQ>(0, value);
 
     // for ColumnBlock no null
     init_row_block(tablet_schema, size);
@@ -173,7 +174,7 @@ TEST_F(TestEqualPredicate, DOUBLE_COLUMN) {
         return_columns.push_back(i);
     }
     double value = 5.0;
-    ColumnPredicate* pred = new EqualPredicate<double>(0, value);
+    ColumnPredicate* pred = new ComparisonPredicateBase<TYPE_DOUBLE, 
PredicateType::EQ>(0, value);
 
     // for ColumnBlock no null
     init_row_block(tablet_schema, size);
@@ -217,7 +218,8 @@ TEST_F(TestEqualPredicate, DECIMAL_COLUMN) {
         return_columns.push_back(i);
     }
     decimal12_t value = {5, 5};
-    ColumnPredicate* pred = new EqualPredicate<decimal12_t>(0, value);
+    ColumnPredicate* pred =
+            new ComparisonPredicateBase<TYPE_DECIMALV2, PredicateType::EQ>(0, 
value);
 
     // for ColumnBlock no null
     init_row_block(tablet_schema, size);
@@ -282,7 +284,7 @@ TEST_F(TestEqualPredicate, STRING_COLUMN) {
     value.len = 4;
     value.ptr = const_cast<char*>(value_buffer);
 
-    ColumnPredicate* pred = new EqualPredicate<StringValue>(0, value);
+    ColumnPredicate* pred = new ComparisonPredicateBase<TYPE_STRING, 
PredicateType::EQ>(0, value);
 
     // for ColumnBlock no null
     init_row_block(tablet_schema, size);
@@ -339,7 +341,7 @@ TEST_F(TestEqualPredicate, DATE_COLUMN) {
         return_columns.push_back(i);
     }
     uint24_t value = datetime::to_date_timestamp("2017-09-10");
-    ColumnPredicate* pred = new EqualPredicate<uint24_t>(0, value);
+    ColumnPredicate* pred = new ComparisonPredicateBase<TYPE_DATE, 
PredicateType::EQ>(0, value);
 
     std::vector<std::string> date_array;
     date_array.push_back("2017-09-07");
@@ -397,7 +399,7 @@ TEST_F(TestEqualPredicate, DATETIME_COLUMN) {
         return_columns.push_back(i);
     }
     uint64_t value = datetime::to_datetime_timestamp("2017-09-10 01:00:00");
-    ColumnPredicate* pred = new EqualPredicate<uint64_t>(0, value);
+    ColumnPredicate* pred = new ComparisonPredicateBase<TYPE_DATETIME, 
PredicateType::EQ>(0, value);
 
     std::vector<std::string> date_array;
     date_array.push_back("2017-09-07 00:00:00");
@@ -454,7 +456,7 @@ TEST_F(TestLessPredicate, FLOAT_COLUMN) {
         return_columns.push_back(i);
     }
     float value = 5.0;
-    ColumnPredicate* pred = new LessPredicate<float>(0, value);
+    ColumnPredicate* pred = new ComparisonPredicateBase<TYPE_FLOAT, 
PredicateType::LT>(0, value);
 
     // for ColumnBlock no null
     init_row_block(tablet_schema, size);
@@ -506,7 +508,7 @@ TEST_F(TestLessPredicate, DOUBLE_COLUMN) {
         return_columns.push_back(i);
     }
     double value = 5.0;
-    ColumnPredicate* pred = new LessPredicate<double>(0, value);
+    ColumnPredicate* pred = new ComparisonPredicateBase<TYPE_DOUBLE, 
PredicateType::LT>(0, value);
 
     // for ColumnBlock no null
     init_row_block(tablet_schema, size);
@@ -558,7 +560,8 @@ TEST_F(TestLessPredicate, DECIMAL_COLUMN) {
         return_columns.push_back(i);
     }
     decimal12_t value = {5, 5};
-    ColumnPredicate* pred = new LessPredicate<decimal12_t>(0, value);
+    ColumnPredicate* pred =
+            new ComparisonPredicateBase<TYPE_DECIMALV2, PredicateType::LT>(0, 
value);
 
     // for ColumnBlock no null
     init_row_block(tablet_schema, size);
@@ -606,7 +609,7 @@ TEST_F(TestLessPredicate, STRING_COLUMN) {
     const char* value_buffer = "dddd";
     value.len = 4;
     value.ptr = const_cast<char*>(value_buffer);
-    ColumnPredicate* pred = new LessPredicate<StringValue>(0, value);
+    ColumnPredicate* pred = new ComparisonPredicateBase<TYPE_STRING, 
PredicateType::LT>(0, value);
 
     // for ColumnBlock no null
     init_row_block(tablet_schema, size);
@@ -668,7 +671,7 @@ TEST_F(TestLessPredicate, DATE_COLUMN) {
         return_columns.push_back(i);
     }
     uint24_t value = datetime::to_date_timestamp("2017-09-10");
-    ColumnPredicate* pred = new LessPredicate<uint24_t>(0, value);
+    ColumnPredicate* pred = new ComparisonPredicateBase<TYPE_DATE, 
PredicateType::LT>(0, value);
 
     std::vector<std::string> date_array;
     date_array.push_back("2017-09-07");
@@ -728,7 +731,7 @@ TEST_F(TestLessPredicate, DATETIME_COLUMN) {
     }
 
     uint64_t value = datetime::to_datetime_timestamp("2017-09-10 01:00:00");
-    ColumnPredicate* pred = new LessPredicate<uint64_t>(0, value);
+    ColumnPredicate* pred = new ComparisonPredicateBase<TYPE_DATETIME, 
PredicateType::LT>(0, value);
 
     std::vector<std::string> date_array;
     date_array.push_back("2017-09-07 00:00:00");
diff --git a/be/test/olap/in_list_predicate_test.cpp 
b/be/test/olap/in_list_predicate_test.cpp
index 418f806b0e..4719adf0d2 100644
--- a/be/test/olap/in_list_predicate_test.cpp
+++ b/be/test/olap/in_list_predicate_test.cpp
@@ -25,6 +25,7 @@
 #include "olap/field.h"
 #include "olap/row_block2.h"
 #include "runtime/mem_pool.h"
+#include "runtime/primitive_type.h"
 #include "runtime/string_value.hpp"
 #include "util/logging.h"
 
@@ -138,7 +139,7 @@ public:
     std::unique_ptr<Schema> _schema;
 };
 
-#define TEST_IN_LIST_PREDICATE_V2(TYPE, TYPE_NAME, FIELD_TYPE)                 
                   \
+#define TEST_IN_LIST_PREDICATE_V2(PRIMITIVE_TYPE, TYPE, TYPE_NAME, FIELD_TYPE) 
                   \
     TEST_F(TestInListPredicate, TYPE_NAME##_COLUMN_V2) {                       
                   \
         TabletSchemaSPtr tablet_schema = std::make_shared<TabletSchema>();     
                   \
         SetTabletSchema(std::string("TYPE_NAME##_COLUMN"), FIELD_TYPE, 
"REPLACE", 1, false, true, \
@@ -150,7 +151,8 @@ public:
         values.insert(4);                                                      
                   \
         values.insert(5);                                                      
                   \
         values.insert(6);                                                      
                   \
-        ColumnPredicate* pred = new InListPredicate<TYPE>(0, 
std::move(values));                  \
+        ColumnPredicate* pred = new InListPredicateBase<PRIMITIVE_TYPE, 
PredicateType::IN_LIST>(  \
+                0, std::move(values));                                         
                   \
         uint16_t sel[10];                                                      
                   \
         for (int i = 0; i < 10; ++i) {                                         
                   \
             sel[i] = i;                                                        
                   \
@@ -197,11 +199,11 @@ public:
         delete pred;                                                           
                   \
     }
 
-TEST_IN_LIST_PREDICATE_V2(int8_t, TINYINT, "TINYINT")
-TEST_IN_LIST_PREDICATE_V2(int16_t, SMALLINT, "SMALLINT")
-TEST_IN_LIST_PREDICATE_V2(int32_t, INT, "INT")
-TEST_IN_LIST_PREDICATE_V2(int64_t, BIGINT, "BIGINT")
-TEST_IN_LIST_PREDICATE_V2(int128_t, LARGEINT, "LARGEINT")
+TEST_IN_LIST_PREDICATE_V2(TYPE_TINYINT, int8_t, TINYINT, "TINYINT")
+TEST_IN_LIST_PREDICATE_V2(TYPE_SMALLINT, int16_t, SMALLINT, "SMALLINT")
+TEST_IN_LIST_PREDICATE_V2(TYPE_INT, int32_t, INT, "INT")
+TEST_IN_LIST_PREDICATE_V2(TYPE_BIGINT, int64_t, BIGINT, "BIGINT")
+TEST_IN_LIST_PREDICATE_V2(TYPE_LARGEINT, int128_t, LARGEINT, "LARGEINT")
 
 TEST_F(TestInListPredicate, FLOAT_COLUMN) {
     TabletSchemaSPtr tablet_schema = std::make_shared<TabletSchema>();
@@ -215,7 +217,8 @@ TEST_F(TestInListPredicate, FLOAT_COLUMN) {
     values.insert(4.1);
     values.insert(5.1);
     values.insert(6.1);
-    ColumnPredicate* pred = new InListPredicate<float>(0, std::move(values));
+    ColumnPredicate* pred =
+            new InListPredicateBase<TYPE_FLOAT, PredicateType::IN_LIST>(0, 
std::move(values));
 
     // for ColumnBlock no null
     init_row_block(tablet_schema, size);
@@ -265,7 +268,8 @@ TEST_F(TestInListPredicate, DOUBLE_COLUMN) {
     values.insert(5.1);
     values.insert(6.1);
 
-    ColumnPredicate* pred = new InListPredicate<double>(0, std::move(values));
+    ColumnPredicate* pred =
+            new InListPredicateBase<TYPE_DOUBLE, PredicateType::IN_LIST>(0, 
std::move(values));
 
     // for ColumnBlock no null
     init_row_block(tablet_schema, size);
@@ -319,7 +323,8 @@ TEST_F(TestInListPredicate, DECIMAL_COLUMN) {
     decimal12_t value3 = {6, 6};
     values.insert(value3);
 
-    ColumnPredicate* pred = new InListPredicate<decimal12_t>(0, 
std::move(values));
+    ColumnPredicate* pred =
+            new InListPredicateBase<TYPE_DECIMALV2, PredicateType::IN_LIST>(0, 
std::move(values));
 
     // for ColumnBlock no null
     init_row_block(tablet_schema, size);
@@ -384,7 +389,8 @@ TEST_F(TestInListPredicate, CHAR_COLUMN) {
     value3.len = 5;
     values.insert(value3);
 
-    ColumnPredicate* pred = new InListPredicate<StringValue>(0, 
std::move(values));
+    ColumnPredicate* pred =
+            new InListPredicateBase<TYPE_CHAR, PredicateType::IN_LIST>(0, 
std::move(values));
 
     // for ColumnBlock no null
     init_row_block(tablet_schema, size);
@@ -461,7 +467,8 @@ TEST_F(TestInListPredicate, VARCHAR_COLUMN) {
     value3.len = 3;
     values.insert(value3);
 
-    ColumnPredicate* pred = new InListPredicate<StringValue>(0, 
std::move(values));
+    ColumnPredicate* pred =
+            new InListPredicateBase<TYPE_VARCHAR, PredicateType::IN_LIST>(0, 
std::move(values));
 
     // for ColumnBlock no null
     init_row_block(tablet_schema, size);
@@ -527,7 +534,8 @@ TEST_F(TestInListPredicate, DATE_COLUMN) {
 
     uint24_t value3 = datetime::timestamp_from_date("2017-09-11");
     values.insert(value3);
-    ColumnPredicate* pred = new InListPredicate<uint24_t>(0, 
std::move(values));
+    ColumnPredicate* pred =
+            new InListPredicateBase<TYPE_DATE, PredicateType::IN_LIST>(0, 
std::move(values));
 
     std::vector<std::string> date_array;
     date_array.push_back("2017-09-07");
@@ -599,7 +607,8 @@ TEST_F(TestInListPredicate, DATE_V2_COLUMN) {
 
     uint32_t value3 = datetime::timestamp_from_date_v2("2017-09-11");
     values.insert(value3);
-    ColumnPredicate* pred = new InListPredicate<uint32_t>(0, 
std::move(values));
+    ColumnPredicate* pred =
+            new InListPredicateBase<TYPE_DATEV2, PredicateType::IN_LIST>(0, 
std::move(values));
 
     std::vector<std::string> date_array;
     date_array.push_back("2017-09-07");
@@ -672,7 +681,8 @@ TEST_F(TestInListPredicate, DATETIME_COLUMN) {
     uint64_t value3 = datetime::timestamp_from_datetime("2017-09-11 01:01:00");
     values.insert(value3);
 
-    ColumnPredicate* pred = new InListPredicate<uint64_t>(0, 
std::move(values));
+    ColumnPredicate* pred =
+            new InListPredicateBase<TYPE_DATETIME, PredicateType::IN_LIST>(0, 
std::move(values));
 
     std::vector<std::string> date_array;
     date_array.push_back("2017-09-07 00:00:00");
diff --git a/be/test/olap/rowset/beta_rowset_test.cpp 
b/be/test/olap/rowset/beta_rowset_test.cpp
index 5c60fd0313..bea3e763d9 100644
--- a/be/test/olap/rowset/beta_rowset_test.cpp
+++ b/be/test/olap/rowset/beta_rowset_test.cpp
@@ -266,7 +266,8 @@ TEST_F(BetaRowsetTest, BasicFunctionTest) {
         {
             std::vector<ColumnPredicate*> column_predicates;
             // column predicate: k1 = 10
-            std::unique_ptr<ColumnPredicate> predicate(new 
EqualPredicate<int32_t>(0, 10));
+            std::unique_ptr<ColumnPredicate> predicate(
+                    new ComparisonPredicateBase<TYPE_INT, 
PredicateType::EQ>(0, 10));
             column_predicates.emplace_back(predicate.get());
             reader_context.predicates = &column_predicates;
             RowsetReaderSharedPtr rowset_reader;
@@ -350,7 +351,8 @@ TEST_F(BetaRowsetTest, BasicFunctionTest) {
         {
             std::vector<ColumnPredicate*> column_predicates;
             // column predicate: k3 < 100
-            ColumnPredicate* predicate = new LessPredicate<int32_t>(2, 100);
+            ColumnPredicate* predicate =
+                    new ComparisonPredicateBase<TYPE_INT, 
PredicateType::LT>(2, 100);
             column_predicates.emplace_back(predicate);
             reader_context.predicates = &column_predicates;
             RowsetReaderSharedPtr rowset_reader;
diff --git a/be/test/olap/rowset/segment_v2/segment_test.cpp 
b/be/test/olap/rowset/segment_v2/segment_test.cpp
index 82bb77d773..4438d7f0b8 100644
--- a/be/test/olap/rowset/segment_v2/segment_test.cpp
+++ b/be/test/olap/rowset/segment_v2/segment_test.cpp
@@ -424,7 +424,8 @@ TEST_F(SegmentReaderWriterTest, LazyMaterialization) {
             // lazy enabled when predicate is subset of returned columns:
             // select c1, c2 where c2 = 30;
             Schema read_schema(tablet_schema);
-            std::unique_ptr<ColumnPredicate> predicate(new 
EqualPredicate<int32_t>(1, 30));
+            std::unique_ptr<ColumnPredicate> predicate(
+                    new ComparisonPredicateBase<TYPE_INT, 
PredicateType::EQ>(1, 30));
             const std::vector<ColumnPredicate*> predicates = {predicate.get()};
 
             OlapReaderStatistics stats;
@@ -448,8 +449,10 @@ TEST_F(SegmentReaderWriterTest, LazyMaterialization) {
             // lazy disabled when all return columns have predicates:
             // select c1, c2 where c1 = 10 and c2 = 100;
             Schema read_schema(tablet_schema);
-            std::unique_ptr<ColumnPredicate> p0(new EqualPredicate<int32_t>(0, 
10));
-            std::unique_ptr<ColumnPredicate> p1(new EqualPredicate<int32_t>(1, 
100));
+            std::unique_ptr<ColumnPredicate> p0(
+                    new ComparisonPredicateBase<TYPE_INT, 
PredicateType::EQ>(0, 10));
+            std::unique_ptr<ColumnPredicate> p1(
+                    new ComparisonPredicateBase<TYPE_INT, 
PredicateType::EQ>(1, 100));
             const std::vector<ColumnPredicate*> predicates = {p0.get(), 
p1.get()};
 
             OlapReaderStatistics stats;
@@ -503,7 +506,8 @@ TEST_F(SegmentReaderWriterTest, LazyMaterialization) {
             // lazy disabled when all predicates are removed by bitmap index:
             // select c1, c2 where c2 = 30;
             Schema read_schema(tablet_schema);
-            std::unique_ptr<ColumnPredicate> predicate(new 
EqualPredicate<int32_t>(0, 20));
+            std::unique_ptr<ColumnPredicate> predicate(
+                    new ComparisonPredicateBase<TYPE_INT, 
PredicateType::EQ>(0, 20));
             const std::vector<ColumnPredicate*> predicates = {predicate.get()};
 
             OlapReaderStatistics stats;
@@ -1153,7 +1157,8 @@ TEST_F(SegmentReaderWriterTest, TestBitmapPredicate) {
         // test where v1=10
         {
             std::vector<ColumnPredicate*> column_predicates;
-            std::unique_ptr<ColumnPredicate> predicate(new 
EqualPredicate<int32_t>(0, 10));
+            std::unique_ptr<ColumnPredicate> predicate(
+                    new ComparisonPredicateBase<TYPE_INT, 
PredicateType::EQ>(0, 10));
             column_predicates.emplace_back(predicate.get());
 
             StorageReadOptions read_opts;
@@ -1174,8 +1179,10 @@ TEST_F(SegmentReaderWriterTest, TestBitmapPredicate) {
         // test where v1=10 and v2=11
         {
             std::vector<ColumnPredicate*> column_predicates;
-            std::unique_ptr<ColumnPredicate> predicate(new 
EqualPredicate<int32_t>(0, 10));
-            std::unique_ptr<ColumnPredicate> predicate2(new 
EqualPredicate<int32_t>(1, 11));
+            std::unique_ptr<ColumnPredicate> predicate(
+                    new ComparisonPredicateBase<TYPE_INT, 
PredicateType::EQ>(0, 10));
+            std::unique_ptr<ColumnPredicate> predicate2(
+                    new ComparisonPredicateBase<TYPE_INT, 
PredicateType::EQ>(1, 11));
             column_predicates.emplace_back(predicate.get());
             column_predicates.emplace_back(predicate2.get());
 
@@ -1197,8 +1204,10 @@ TEST_F(SegmentReaderWriterTest, TestBitmapPredicate) {
         // test where v1=10 and v2=15
         {
             std::vector<ColumnPredicate*> column_predicates;
-            std::unique_ptr<ColumnPredicate> predicate(new 
EqualPredicate<int32_t>(0, 10));
-            std::unique_ptr<ColumnPredicate> predicate2(new 
EqualPredicate<int32_t>(1, 15));
+            std::unique_ptr<ColumnPredicate> predicate(
+                    new ComparisonPredicateBase<TYPE_INT, 
PredicateType::EQ>(0, 10));
+            std::unique_ptr<ColumnPredicate> predicate2(
+                    new ComparisonPredicateBase<TYPE_INT, 
PredicateType::EQ>(1, 15));
             column_predicates.emplace_back(predicate.get());
             column_predicates.emplace_back(predicate2.get());
 
@@ -1224,7 +1233,8 @@ TEST_F(SegmentReaderWriterTest, TestBitmapPredicate) {
             values.insert(20);
             values.insert(1);
             std::unique_ptr<ColumnPredicate> predicate(
-                    new InListPredicate<int32_t>(0, std::move(values)));
+                    new InListPredicateBase<TYPE_INT, 
PredicateType::IN_LIST>(0,
+                                                                              
std::move(values)));
             column_predicates.emplace_back(predicate.get());
 
             StorageReadOptions read_opts;
@@ -1248,7 +1258,8 @@ TEST_F(SegmentReaderWriterTest, TestBitmapPredicate) {
             values.insert(10);
             values.insert(20);
             std::unique_ptr<ColumnPredicate> predicate(
-                    new NotInListPredicate<int32_t>(0, std::move(values)));
+                    new InListPredicateBase<TYPE_INT, 
PredicateType::NOT_IN_LIST>(
+                            0, std::move(values)));
             column_predicates.emplace_back(predicate.get());
 
             StorageReadOptions read_opts;


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to