You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2022/06/01 15:29:06 UTC
[incubator-doris] 11/22: [bugfix]handle ComlumnDictionary in evaluate_and and evaluate_or (#9818)
This is an automated email from the ASF dual-hosted git repository.
morningman pushed a commit to branch dev-1.0.1
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git
commit a7c6ca63c45e553973f91a5e9b69c00e6f5af5a1
Author: morningman <mo...@163.com>
AuthorDate: Wed Jun 1 22:10:58 2022 +0800
[bugfix]handle ComlumnDictionary in evaluate_and and evaluate_or (#9818)
* handle ColumnDictory in evaluate_or
We need to handle ComlumnDictory in evaluate_or, otherwise delete handler
would triger a core dump.
* handle ComlumnDictionary in evaluate_and
Because there is only one difference between evaluate_and and
evaluate_or, that is or and delete, I merge two macros into one.
Delete handlers also trigger evaluate_and, i am not sure if column
dictionary would be used in evaluate_and.
* clang format
* fix short circut for evaluate_and and evaluate_or
* clang format
---
be/src/olap/comparison_predicate.cpp | 451 +++++++++++++++++------------------
1 file changed, 217 insertions(+), 234 deletions(-)
diff --git a/be/src/olap/comparison_predicate.cpp b/be/src/olap/comparison_predicate.cpp
index 363c75e5b8..2223d1fe19 100644
--- a/be/src/olap/comparison_predicate.cpp
+++ b/be/src/olap/comparison_predicate.cpp
@@ -28,8 +28,8 @@
namespace doris {
-#define COMPARISON_PRED_CONSTRUCTOR(CLASS) \
- template <class T> \
+#define COMPARISON_PRED_CONSTRUCTOR(CLASS) \
+ template <class T> \
CLASS<T>::CLASS(uint32_t column_id, const T& value, bool opposite) \
: ColumnPredicate(column_id, opposite), _value(value) {}
@@ -55,55 +55,54 @@ COMPARISON_PRED_CONSTRUCTOR_STRING(LessEqualPredicate)
COMPARISON_PRED_CONSTRUCTOR_STRING(GreaterPredicate)
COMPARISON_PRED_CONSTRUCTOR_STRING(GreaterEqualPredicate)
-#define COMPARISON_PRED_EVALUATE(CLASS, OP) \
- template <class T> \
- void CLASS<T>::evaluate(VectorizedRowBatch* batch) const { \
- uint16_t n = batch->size(); \
- if (n == 0) { \
- return; \
- } \
- uint16_t* sel = batch->selected(); \
- const T* col_vector = \
- reinterpret_cast<const T*>(batch->column(_column_id)->col_data()); \
- uint16_t new_size = 0; \
- if (batch->column(_column_id)->no_nulls()) { \
- if (batch->selected_in_use()) { \
- for (uint16_t j = 0; j != n; ++j) { \
- uint16_t i = sel[j]; \
- sel[new_size] = i; \
- new_size += (col_vector[i] OP _value); \
- } \
- batch->set_size(new_size); \
- } else { \
- for (uint16_t i = 0; i != n; ++i) { \
- sel[new_size] = i; \
- new_size += (col_vector[i] OP _value); \
- } \
- if (new_size < n) { \
- batch->set_size(new_size); \
- batch->set_selected_in_use(true); \
- } \
- } \
- } else { \
- bool* is_null = batch->column(_column_id)->is_null(); \
- if (batch->selected_in_use()) { \
- for (uint16_t j = 0; j != n; ++j) { \
- uint16_t i = sel[j]; \
- sel[new_size] = i; \
- new_size += (!is_null[i] && (col_vector[i] OP _value)); \
- } \
- batch->set_size(new_size); \
- } else { \
- for (uint16_t i = 0; i != n; ++i) { \
- sel[new_size] = i; \
- new_size += (!is_null[i] && (col_vector[i] OP _value)); \
- } \
- if (new_size < n) { \
- batch->set_size(new_size); \
- batch->set_selected_in_use(true); \
- } \
- } \
- } \
+#define COMPARISON_PRED_EVALUATE(CLASS, OP) \
+ template <class T> \
+ void CLASS<T>::evaluate(VectorizedRowBatch* batch) const { \
+ uint16_t n = batch->size(); \
+ if (n == 0) { \
+ return; \
+ } \
+ uint16_t* sel = batch->selected(); \
+ const T* col_vector = reinterpret_cast<const T*>(batch->column(_column_id)->col_data()); \
+ uint16_t new_size = 0; \
+ if (batch->column(_column_id)->no_nulls()) { \
+ if (batch->selected_in_use()) { \
+ for (uint16_t j = 0; j != n; ++j) { \
+ uint16_t i = sel[j]; \
+ sel[new_size] = i; \
+ new_size += (col_vector[i] OP _value); \
+ } \
+ batch->set_size(new_size); \
+ } else { \
+ for (uint16_t i = 0; i != n; ++i) { \
+ sel[new_size] = i; \
+ new_size += (col_vector[i] OP _value); \
+ } \
+ if (new_size < n) { \
+ batch->set_size(new_size); \
+ batch->set_selected_in_use(true); \
+ } \
+ } \
+ } else { \
+ bool* is_null = batch->column(_column_id)->is_null(); \
+ if (batch->selected_in_use()) { \
+ for (uint16_t j = 0; j != n; ++j) { \
+ uint16_t i = sel[j]; \
+ sel[new_size] = i; \
+ new_size += (!is_null[i] && (col_vector[i] OP _value)); \
+ } \
+ batch->set_size(new_size); \
+ } else { \
+ for (uint16_t i = 0; i != n; ++i) { \
+ sel[new_size] = i; \
+ new_size += (!is_null[i] && (col_vector[i] OP _value)); \
+ } \
+ if (new_size < n) { \
+ batch->set_size(new_size); \
+ batch->set_selected_in_use(true); \
+ } \
+ } \
+ } \
}
COMPARISON_PRED_EVALUATE(EqualPredicate, ==)
@@ -113,30 +112,28 @@ COMPARISON_PRED_EVALUATE(LessEqualPredicate, <=)
COMPARISON_PRED_EVALUATE(GreaterPredicate, >)
COMPARISON_PRED_EVALUATE(GreaterEqualPredicate, >=)
-#define COMPARISON_PRED_COLUMN_BLOCK_EVALUATE(CLASS, OP) \
- template <class T> \
- void CLASS<T>::evaluate(ColumnBlock* block, uint16_t* sel, uint16_t* size) const { \
- uint16_t new_size = 0; \
- if (block->is_nullable()) { \
- for (uint16_t i = 0; i < *size; ++i) { \
- uint16_t idx = sel[i]; \
- sel[new_size] = idx; \
- const T* cell_value = \
- reinterpret_cast<const T*>(block->cell(idx).cell_ptr()); \
- auto result = (!block->cell(idx).is_null() && (*cell_value OP _value)); \
- new_size += _opposite ? !result : result; \
- } \
- } else { \
- for (uint16_t i = 0; i < *size; ++i) { \
- uint16_t idx = sel[i]; \
- sel[new_size] = idx; \
- const T* cell_value = \
- reinterpret_cast<const T*>(block->cell(idx).cell_ptr()); \
- auto result = (*cell_value OP _value); \
- new_size += _opposite ? !result : result; \
- } \
- } \
- *size = new_size; \
+#define COMPARISON_PRED_COLUMN_BLOCK_EVALUATE(CLASS, OP) \
+ template <class T> \
+ void CLASS<T>::evaluate(ColumnBlock* block, uint16_t* sel, uint16_t* size) const { \
+ uint16_t new_size = 0; \
+ if (block->is_nullable()) { \
+ for (uint16_t i = 0; i < *size; ++i) { \
+ uint16_t idx = sel[i]; \
+ sel[new_size] = idx; \
+ const T* cell_value = reinterpret_cast<const T*>(block->cell(idx).cell_ptr()); \
+ auto result = (!block->cell(idx).is_null() && (*cell_value OP _value)); \
+ new_size += _opposite ? !result : result; \
+ } \
+ } else { \
+ for (uint16_t i = 0; i < *size; ++i) { \
+ uint16_t idx = sel[i]; \
+ sel[new_size] = idx; \
+ const T* cell_value = reinterpret_cast<const T*>(block->cell(idx).cell_ptr()); \
+ auto result = (*cell_value OP _value); \
+ new_size += _opposite ? !result : result; \
+ } \
+ } \
+ *size = new_size; \
}
COMPARISON_PRED_COLUMN_BLOCK_EVALUATE(EqualPredicate, ==)
@@ -193,7 +190,8 @@ COMPARISON_PRED_COLUMN_BLOCK_EVALUATE(GreaterEqualPredicate, >=)
} else if (column.is_column_dictionary()) { \
if constexpr (std::is_same_v<T, StringValue>) { \
auto& dict_col = \
- reinterpret_cast<vectorized::ColumnDictionary<vectorized::Int32>&>(column);\
+ reinterpret_cast<vectorized::ColumnDictionary<vectorized::Int32>&>( \
+ column); \
auto& data_array = dict_col.get_data(); \
auto dict_code = IS_RANGE ? dict_col.find_code_by_bound(_value, 1 OP 0, 1 OP 1) \
: dict_col.find_code(_value); \
@@ -201,13 +199,12 @@ COMPARISON_PRED_COLUMN_BLOCK_EVALUATE(GreaterEqualPredicate, >=)
uint16_t idx = sel[i]; \
sel[new_size] = idx; \
const auto& cell_value = data_array[idx]; \
- bool ret = cell_value OP dict_code; \
+ bool ret = cell_value OP dict_code; \
new_size += _opposite ? !ret : ret; \
} \
} \
} else { \
- auto& pred_column_ref = \
- reinterpret_cast<vectorized::PredicateColumnType<T>&>(column); \
+ auto& pred_column_ref = reinterpret_cast<vectorized::PredicateColumnType<T>&>(column); \
auto& data_array = pred_column_ref.get_data(); \
for (uint16_t i = 0; i < *size; i++) { \
uint16_t idx = sel[i]; \
@@ -220,7 +217,6 @@ COMPARISON_PRED_COLUMN_BLOCK_EVALUATE(GreaterEqualPredicate, >=)
*size = new_size; \
}
-
COMPARISON_PRED_COLUMN_EVALUATE(EqualPredicate, ==, false)
COMPARISON_PRED_COLUMN_EVALUATE(NotEqualPredicate, !=, false)
COMPARISON_PRED_COLUMN_EVALUATE(LessPredicate, <, true)
@@ -228,35 +224,34 @@ COMPARISON_PRED_COLUMN_EVALUATE(LessEqualPredicate, <=, true)
COMPARISON_PRED_COLUMN_EVALUATE(GreaterPredicate, >, true)
COMPARISON_PRED_COLUMN_EVALUATE(GreaterEqualPredicate, >=, true)
-#define COMPARISON_PRED_COLUMN_EVALUATE_VEC(CLASS, OP) \
- template <class T> \
- void CLASS<T>::evaluate_vec(vectorized::IColumn& column, uint16_t size, bool* flags) \
- const { \
- if (column.is_nullable()) { \
- auto* nullable_column = \
- vectorized::check_and_get_column<vectorized::ColumnNullable>(column); \
- auto& data_array = reinterpret_cast<const vectorized::PredicateColumnType<T>&>( \
- nullable_column->get_nested_column()) \
- .get_data(); \
- auto& null_bitmap = reinterpret_cast<const vectorized::ColumnVector<uint8_t>&>( \
- *(nullable_column->get_null_map_column_ptr())) \
- .get_data(); \
- for (uint16_t i = 0; i < size; i++) { \
- flags[i] = (data_array[i] OP _value) && (!null_bitmap[i]); \
- } \
- } else { \
- auto& predicate_column = \
- reinterpret_cast<vectorized::PredicateColumnType<T>&>(column); \
- auto& data_array = predicate_column.get_data(); \
- for (uint16_t i = 0; i < size; i++) { \
- flags[i] = data_array[i] OP _value; \
- } \
- } \
- if (_opposite) { \
- for (uint16_t i = 0; i < size; i++) { \
- flags[i] = !flags[i]; \
- } \
- } \
+#define COMPARISON_PRED_COLUMN_EVALUATE_VEC(CLASS, OP) \
+ template <class T> \
+ void CLASS<T>::evaluate_vec(vectorized::IColumn& column, uint16_t size, bool* flags) const { \
+ if (column.is_nullable()) { \
+ auto* nullable_column = \
+ vectorized::check_and_get_column<vectorized::ColumnNullable>(column); \
+ auto& data_array = reinterpret_cast<const vectorized::PredicateColumnType<T>&>( \
+ nullable_column->get_nested_column()) \
+ .get_data(); \
+ auto& null_bitmap = reinterpret_cast<const vectorized::ColumnVector<uint8_t>&>( \
+ *(nullable_column->get_null_map_column_ptr())) \
+ .get_data(); \
+ for (uint16_t i = 0; i < size; i++) { \
+ flags[i] = (data_array[i] OP _value) && (!null_bitmap[i]); \
+ } \
+ } else { \
+ auto& predicate_column = \
+ reinterpret_cast<vectorized::PredicateColumnType<T>&>(column); \
+ auto& data_array = predicate_column.get_data(); \
+ for (uint16_t i = 0; i < size; i++) { \
+ flags[i] = data_array[i] OP _value; \
+ } \
+ } \
+ if (_opposite) { \
+ for (uint16_t i = 0; i < size; i++) { \
+ flags[i] = !flags[i]; \
+ } \
+ } \
}
COMPARISON_PRED_COLUMN_EVALUATE_VEC(EqualPredicate, ==)
@@ -266,133 +261,121 @@ COMPARISON_PRED_COLUMN_EVALUATE_VEC(LessEqualPredicate, <=)
COMPARISON_PRED_COLUMN_EVALUATE_VEC(GreaterPredicate, >)
COMPARISON_PRED_COLUMN_EVALUATE_VEC(GreaterEqualPredicate, >=)
-#define COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_OR(CLASS, OP) \
- template <class T> \
- void CLASS<T>::evaluate_or(ColumnBlock* block, uint16_t* sel, uint16_t size, bool* flags) \
- const { \
- if (block->is_nullable()) { \
- for (uint16_t i = 0; i < size; ++i) { \
- if (flags[i]) continue; \
- uint16_t idx = sel[i]; \
- const T* cell_value = \
- reinterpret_cast<const T*>(block->cell(idx).cell_ptr()); \
- auto result = (!block->cell(idx).is_null() && (*cell_value OP _value)); \
- flags[i] |= _opposite ? !result : result; \
- } \
- } else { \
- for (uint16_t i = 0; i < size; ++i) { \
- if (flags[i]) continue; \
- uint16_t idx = sel[i]; \
- const T* cell_value = \
- reinterpret_cast<const T*>(block->cell(idx).cell_ptr()); \
- auto result = (*cell_value OP _value); \
- flags[i] |= _opposite ? !result : result; \
- } \
- } \
+#define COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_BOOL(CLASS, OP, BOOL_NAME, BOOL_OP, SHORT_OP) \
+ template <class T> \
+ void CLASS<T>::evaluate_##BOOL_NAME(ColumnBlock* block, uint16_t* sel, uint16_t size, \
+ bool* flags) const { \
+ if (block->is_nullable()) { \
+ for (uint16_t i = 0; i < size; ++i) { \
+ if (SHORT_OP(flags[i])) continue; \
+ uint16_t idx = sel[i]; \
+ const T* cell_value = reinterpret_cast<const T*>(block->cell(idx).cell_ptr()); \
+ auto result = (!block->cell(idx).is_null() && (*cell_value OP _value)); \
+ flags[i] = flags[i] BOOL_OP(_opposite ? !result : result); \
+ } \
+ } else { \
+ for (uint16_t i = 0; i < size; ++i) { \
+ if (flags[i]) continue; \
+ uint16_t idx = sel[i]; \
+ const T* cell_value = reinterpret_cast<const T*>(block->cell(idx).cell_ptr()); \
+ auto result = (*cell_value OP _value); \
+ flags[i] = flags[i] BOOL_OP(_opposite ? !result : result); \
+ } \
+ } \
}
-COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_OR(EqualPredicate, ==)
-COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_OR(NotEqualPredicate, !=)
-COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_OR(LessPredicate, <)
-COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_OR(LessEqualPredicate, <=)
-COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_OR(GreaterPredicate, >)
-COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_OR(GreaterEqualPredicate, >=)
-
-#define COMPARISON_PRED_COLUMN_EVALUATE_OR(CLASS, OP) \
- template <class T> \
- void CLASS<T>::evaluate_or(vectorized::IColumn& column, uint16_t* sel, uint16_t size, bool* flags) const { \
- if (column.is_nullable()) { \
- auto* nullable_column = vectorized::check_and_get_column<vectorized::ColumnNullable>(column); \
- auto& data_array = reinterpret_cast<const vectorized::PredicateColumnType<T>&>(nullable_column->get_nested_column()).get_data(); \
- auto& null_bitmap = reinterpret_cast<const vectorized::ColumnVector<uint8_t>&>(*(nullable_column->get_null_map_column_ptr())).get_data();\
- for (uint16_t i = 0; i < size; i++) { \
- if (flags[i]) continue; \
- uint16_t idx = sel[i]; \
- bool ret = !null_bitmap[idx] && (data_array[idx] OP _value); \
- flags[i] |= _opposite ? !ret : ret; \
- } \
- } else { \
- auto& predicate_column = reinterpret_cast<vectorized::PredicateColumnType<T>&>(column); \
- auto& data_array = predicate_column.get_data(); \
- for (uint16_t i = 0; i < size; ++i) { \
- if (flags[i]) continue; \
- uint16_t idx = sel[i]; \
- bool ret = data_array[idx] OP _value; \
- flags[i] |= _opposite ? !ret : ret; \
- } \
- } \
- }
-
-COMPARISON_PRED_COLUMN_EVALUATE_OR(EqualPredicate, ==)
-COMPARISON_PRED_COLUMN_EVALUATE_OR(NotEqualPredicate, !=)
-COMPARISON_PRED_COLUMN_EVALUATE_OR(LessPredicate, <)
-COMPARISON_PRED_COLUMN_EVALUATE_OR(LessEqualPredicate, <=)
-COMPARISON_PRED_COLUMN_EVALUATE_OR(GreaterPredicate, >)
-COMPARISON_PRED_COLUMN_EVALUATE_OR(GreaterEqualPredicate, >=)
-
-#define COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_AND(CLASS, OP) \
- template <class T> \
- void CLASS<T>::evaluate_and(ColumnBlock* block, uint16_t* sel, uint16_t size, bool* flags) \
- const { \
- if (block->is_nullable()) { \
- for (uint16_t i = 0; i < size; ++i) { \
- if (!flags[i]) continue; \
- uint16_t idx = sel[i]; \
- const T* cell_value = \
- reinterpret_cast<const T*>(block->cell(idx).cell_ptr()); \
- auto result = (!block->cell(idx).is_null() && (*cell_value OP _value)); \
- flags[i] &= _opposite ? !result : result; \
- } \
- } else { \
- for (uint16_t i = 0; i < size; ++i) { \
- if (!flags[i]) continue; \
- uint16_t idx = sel[i]; \
- const T* cell_value = \
- reinterpret_cast<const T*>(block->cell(idx).cell_ptr()); \
- auto result = (*cell_value OP _value); \
- flags[i] &= _opposite ? !result : result; \
- } \
- } \
+#define COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_BOOL2(BOOL_NAME, BOOL_OP, SHORT_OP) \
+ COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_BOOL(EqualPredicate, ==, BOOL_NAME, BOOL_OP, SHORT_OP) \
+ COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_BOOL(NotEqualPredicate, !=, BOOL_NAME, BOOL_OP, \
+ SHORT_OP) \
+ COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_BOOL(LessPredicate, <, BOOL_NAME, BOOL_OP, SHORT_OP) \
+ COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_BOOL(LessEqualPredicate, <=, BOOL_NAME, BOOL_OP, \
+ SHORT_OP) \
+ COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_BOOL(GreaterPredicate, >, BOOL_NAME, BOOL_OP, SHORT_OP) \
+ COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_BOOL(GreaterEqualPredicate, >=, BOOL_NAME, BOOL_OP, \
+ SHORT_OP)
+
+COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_BOOL2(or, |, )
+COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_BOOL2(and, &, !)
+
+#define COMPARISON_PRED_COLUMN_EVALUATE_BOOL(CLASS, OP, IS_RANGE, BOOL_NAME, BOOL_OP, SHORT_OP) \
+ template <class T> \
+ void CLASS<T>::evaluate_##BOOL_NAME(vectorized::IColumn& column, uint16_t* sel, uint16_t size, \
+ bool* flags) const { \
+ if (column.is_nullable()) { \
+ auto* nullable_column = \
+ vectorized::check_and_get_column<vectorized::ColumnNullable>(column); \
+ auto& nested_col = nullable_column->get_nested_column(); \
+ auto& null_bitmap = reinterpret_cast<const vectorized::ColumnVector<uint8_t>&>( \
+ *(nullable_column->get_null_map_column_ptr())) \
+ .get_data(); \
+ if (nested_col.is_column_dictionary()) { \
+ if constexpr (std::is_same_v<T, StringValue>) { \
+ auto* nested_col_ptr = vectorized::check_and_get_column< \
+ vectorized::ColumnDictionary<vectorized::Int32>>(nested_col); \
+ auto& data_array = nested_col_ptr->get_data(); \
+ auto dict_code = \
+ IS_RANGE ? nested_col_ptr->find_code_by_bound(_value, 1 OP 0, 1 OP 1) \
+ : nested_col_ptr->find_code(_value); \
+ for (uint16_t i = 0; i < size; i++) { \
+ if (SHORT_OP(flags[i])) continue; \
+ uint16_t idx = sel[i]; \
+ bool ret = !null_bitmap[idx] && (data_array[idx] OP dict_code); \
+ flags[i] = flags[i] BOOL_OP(_opposite ? !ret : ret); \
+ } \
+ } \
+ } else { \
+ auto& data_array = \
+ reinterpret_cast<const vectorized::PredicateColumnType<T>&>(nested_col) \
+ .get_data(); \
+ for (uint16_t i = 0; i < size; i++) { \
+ if (SHORT_OP(flags[i])) continue; \
+ uint16_t idx = sel[i]; \
+ bool ret = !null_bitmap[idx] && (data_array[idx] OP _value); \
+ flags[i] = flags[i] BOOL_OP(_opposite ? !ret : ret); \
+ } \
+ } \
+ } else if (column.is_column_dictionary()) { \
+ if constexpr (std::is_same_v<T, StringValue>) { \
+ auto& dict_col = \
+ reinterpret_cast<vectorized::ColumnDictionary<vectorized::Int32>&>( \
+ column); \
+ auto& data_array = dict_col.get_data(); \
+ auto dict_code = IS_RANGE ? dict_col.find_code_by_bound(_value, 1 OP 0, 1 OP 1) \
+ : dict_col.find_code(_value); \
+ for (uint16_t i = 0; i < size; i++) { \
+ if (SHORT_OP(flags[i])) continue; \
+ uint16_t idx = sel[i]; \
+ bool ret = data_array[idx] OP dict_code; \
+ flags[i] = flags[i] BOOL_OP(_opposite ? !ret : ret); \
+ } \
+ } \
+ } else { \
+ auto& predicate_column = \
+ reinterpret_cast<vectorized::PredicateColumnType<T>&>(column); \
+ auto& data_array = predicate_column.get_data(); \
+ for (uint16_t i = 0; i < size; ++i) { \
+ if (SHORT_OP(flags[i])) continue; \
+ uint16_t idx = sel[i]; \
+ bool ret = data_array[idx] OP _value; \
+ flags[i] = flags[i] BOOL_OP(_opposite ? !ret : ret); \
+ } \
+ } \
}
-COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_AND(EqualPredicate, ==)
-COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_AND(NotEqualPredicate, !=)
-COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_AND(LessPredicate, <)
-COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_AND(LessEqualPredicate, <=)
-COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_AND(GreaterPredicate, >)
-COMPARISON_PRED_COLUMN_BLOCK_EVALUATE_AND(GreaterEqualPredicate, >=)
-
-#define COMPARISON_PRED_COLUMN_EVALUATE_AND(CLASS, OP) \
- template <class T> \
- void CLASS<T>::evaluate_and(vectorized::IColumn& column, uint16_t* sel, uint16_t size, bool* flags) const { \
- if (column.is_nullable()) { \
- auto* nullable_column = vectorized::check_and_get_column<vectorized::ColumnNullable>(column); \
- auto& data_array = reinterpret_cast<const vectorized::PredicateColumnType<T>&>(nullable_column->get_nested_column()).get_data(); \
- auto& null_bitmap = reinterpret_cast<const vectorized::ColumnVector<uint8_t>&>(*(nullable_column->get_null_map_column_ptr())).get_data();\
- for (uint16_t i = 0; i < size; i++) { \
- if (!flags[i]) continue; \
- uint16_t idx = sel[i]; \
- bool ret = !null_bitmap[idx] && (data_array[idx] OP _value); \
- flags[i] &= _opposite ? !ret : ret; \
- } \
- } else { \
- auto& predicate_column = reinterpret_cast<vectorized::PredicateColumnType<T>&>(column); \
- auto& data_array = predicate_column.get_data(); \
- for (uint16_t i = 0; i < size; ++i) { \
- if (!flags[i]) continue; \
- uint16_t idx = sel[i]; \
- bool ret = data_array[idx] OP _value; \
- flags[i] &= _opposite ? !ret : ret; \
- } \
- } \
- }
-
-COMPARISON_PRED_COLUMN_EVALUATE_AND(EqualPredicate, ==)
-COMPARISON_PRED_COLUMN_EVALUATE_AND(NotEqualPredicate, !=)
-COMPARISON_PRED_COLUMN_EVALUATE_AND(LessPredicate, <)
-COMPARISON_PRED_COLUMN_EVALUATE_AND(LessEqualPredicate, <=)
-COMPARISON_PRED_COLUMN_EVALUATE_AND(GreaterPredicate, >)
-COMPARISON_PRED_COLUMN_EVALUATE_AND(GreaterEqualPredicate, >=)
+#define COMPARISON_PRED_COLUMN_EVALUATE_BOOL2(BOOL_NAME, BOOL_OP, SHORT_OP) \
+ COMPARISON_PRED_COLUMN_EVALUATE_BOOL(EqualPredicate, ==, false, BOOL_NAME, BOOL_OP, SHORT_OP) \
+ COMPARISON_PRED_COLUMN_EVALUATE_BOOL(NotEqualPredicate, !=, false, BOOL_NAME, BOOL_OP, \
+ SHORT_OP) \
+ COMPARISON_PRED_COLUMN_EVALUATE_BOOL(LessPredicate, <, true, BOOL_NAME, BOOL_OP, SHORT_OP) \
+ COMPARISON_PRED_COLUMN_EVALUATE_BOOL(LessEqualPredicate, <=, true, BOOL_NAME, BOOL_OP, \
+ SHORT_OP) \
+ COMPARISON_PRED_COLUMN_EVALUATE_BOOL(GreaterPredicate, >, true, BOOL_NAME, BOOL_OP, SHORT_OP) \
+ COMPARISON_PRED_COLUMN_EVALUATE_BOOL(GreaterEqualPredicate, >=, true, BOOL_NAME, BOOL_OP, \
+ SHORT_OP)
+
+COMPARISON_PRED_COLUMN_EVALUATE_BOOL2(or, |, )
+COMPARISON_PRED_COLUMN_EVALUATE_BOOL2(and, &, !)
#define BITMAP_COMPARE_EqualPredicate(s, exact_match, seeked_ordinal, iterator, bitmap, roaring) \
do { \
@@ -479,8 +462,8 @@ COMPARISON_PRED_COLUMN_EVALUATE_AND(GreaterEqualPredicate, >=)
#define COMPARISON_PRED_BITMAP_EVALUATE(CLASS, OP) \
template <class T> \
Status CLASS<T>::evaluate(const Schema& schema, \
- const std::vector<BitmapIndexIterator*>& iterators, \
- uint32_t num_rows, roaring::Roaring* bitmap) const { \
+ const std::vector<BitmapIndexIterator*>& iterators, \
+ uint32_t num_rows, roaring::Roaring* bitmap) const { \
BitmapIndexIterator* iterator = iterators[_column_id]; \
if (iterator == nullptr) { \
return Status::OK(); \
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org