be/src/exprs/function/function_bitmap_variadic.cpp
Line | Count | Source |
1 | | // Licensed to the Apache Software Foundation (ASF) under one |
2 | | // or more contributor license agreements. See the NOTICE file |
3 | | // distributed with this work for additional information |
4 | | // regarding copyright ownership. The ASF licenses this file |
5 | | // to you under the Apache License, Version 2.0 (the |
6 | | // "License"); you may not use this file except in compliance |
7 | | // with the License. You may obtain a copy of the License at |
8 | | // |
9 | | // http://www.apache.org/licenses/LICENSE-2.0 |
10 | | // |
11 | | // Unless required by applicable law or agreed to in writing, |
12 | | // software distributed under the License is distributed on an |
13 | | // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
14 | | // KIND, either express or implied. See the License for the |
15 | | // specific language governing permissions and limitations |
16 | | // under the License. |
17 | | |
18 | | #include <stddef.h> |
19 | | |
20 | | #include <algorithm> |
21 | | #include <functional> |
22 | | #include <memory> |
23 | | #include <type_traits> |
24 | | #include <utility> |
25 | | #include <vector> |
26 | | |
27 | | #include "common/status.h" |
28 | | #include "core/assert_cast.h" |
29 | | #include "core/block/block.h" |
30 | | #include "core/block/column_numbers.h" |
31 | | #include "core/block/column_with_type_and_name.h" |
32 | | #include "core/column/column.h" |
33 | | #include "core/column/column_complex.h" |
34 | | #include "core/column/column_nullable.h" |
35 | | #include "core/column/column_vector.h" |
36 | | #include "core/data_type/data_type.h" |
37 | | #include "core/data_type/data_type_bitmap.h" |
38 | | #include "core/data_type/data_type_nullable.h" |
39 | | #include "core/data_type/data_type_number.h" |
40 | | #include "core/types.h" |
41 | | #include "core/value/bitmap_value.h" |
42 | | #include "exprs/aggregate/aggregate_function.h" |
43 | | #include "exprs/function/function.h" |
44 | | #include "exprs/function/simple_function_factory.h" |
45 | | |
46 | | namespace doris { |
47 | | class FunctionContext; |
48 | | } // namespace doris |
49 | | |
50 | | namespace doris { |
51 | | |
52 | | // currently only bitmap_or and bitmap_or_count will call this function, |
53 | | // other bitmap functions will use default implementation for nulls |
54 | | #define BITMAP_OR_NULLABLE(nullable, input_rows_count, res, op) \ |
55 | 65 | const auto& nested_col_ptr = nullable->get_nested_column_ptr(); \ |
56 | 65 | const auto* __restrict null_map_data = nullable->get_null_map_data().data(); \ |
57 | 65 | const auto& mid_data = assert_cast<const ColumnBitmap*>(nested_col_ptr.get())->get_data(); \ |
58 | 161 | for (size_t row = 0; row < input_rows_count; ++row) { \ |
59 | 96 | if (!null_map_data[row]) { \ |
60 | 54 | res[row] op mid_data[row]; \ |
61 | 54 | } \ |
62 | 96 | } |
63 | | |
64 | | #define BITMAP_FUNCTION_VARIADIC(CLASS, FUNCTION_NAME, OP) \ |
65 | | struct CLASS { \ |
66 | | static constexpr auto name = #FUNCTION_NAME; \ |
67 | | using ResultDataType = DataTypeBitMap; \ |
68 | | static Status vector_vector(ColumnPtr argument_columns[], size_t col_size, \ |
69 | | size_t input_rows_count, std::vector<BitmapValue>& res, \ |
70 | 1.47k | IColumn* res_nulls) { \ |
71 | 1.47k | std::vector<const ColumnUInt8::value_type*> null_map_datas(col_size); \ |
72 | 1.47k | int nullable_cols_count = 0; \ |
73 | 1.47k | ColumnUInt8::value_type* __restrict res_nulls_data = nullptr; \ |
74 | 1.47k | if (res_nulls) { \ |
75 | 27 | res_nulls_data = assert_cast<ColumnUInt8*>(res_nulls)->get_data().data(); \ |
76 | 27 | } \ |
77 | 1.47k | if (auto* nullable = check_and_get_column<ColumnNullable>(*argument_columns[0])) { \ |
78 | 15 | null_map_datas[nullable_cols_count++] = nullable->get_null_map_data().data(); \ |
79 | 15 | BITMAP_OR_NULLABLE(nullable, input_rows_count, res, =); \ |
80 | 1.45k | } else { \ |
81 | 1.45k | const auto& mid_data = \ |
82 | 1.45k | assert_cast<const ColumnBitmap*>(argument_columns[0].get())->get_data(); \ |
83 | 14.0k | for (size_t row = 0; row < input_rows_count; ++row) { \ |
84 | 12.6k | res[row] = mid_data[row]; \ |
85 | 12.6k | } \ |
86 | 1.45k | } \ |
87 | 2.96k | for (size_t col = 1; col < col_size; ++col) { \ |
88 | 1.49k | if (auto* nullable = \ |
89 | 1.49k | check_and_get_column<ColumnNullable>(*argument_columns[col])) { \ |
90 | 25 | null_map_datas[nullable_cols_count++] = nullable->get_null_map_data().data(); \ |
91 | 25 | BITMAP_OR_NULLABLE(nullable, input_rows_count, res, OP); \ |
92 | 1.46k | } else { \ |
93 | 1.46k | const auto& col_data = \ |
94 | 1.46k | assert_cast<const ColumnBitmap*>(argument_columns[col].get()) \ |
95 | 1.46k | ->get_data(); \ |
96 | 14.1k | for (size_t row = 0; row < input_rows_count; ++row) { \ |
97 | 12.6k | res[row] OP col_data[row]; \ |
98 | 12.6k | } \ |
99 | 1.46k | } \ |
100 | 1.49k | } \ |
101 | 1.47k | if (res_nulls_data && nullable_cols_count == col_size) { \ |
102 | 12 | const auto* null_map_data = null_map_datas[0]; \ |
103 | 26 | for (size_t row = 0; row < input_rows_count; ++row) { \ |
104 | 14 | res_nulls_data[row] = null_map_data[row]; \ |
105 | 14 | } \ |
106 | 24 | for (int i = 1; i < nullable_cols_count; ++i) { \ |
107 | 12 | null_map_data = null_map_datas[i]; \ |
108 | 26 | for (size_t row = 0; row < input_rows_count; ++row) { \ |
109 | 14 | res_nulls_data[row] &= null_map_data[row]; \ |
110 | 14 | } \ |
111 | 12 | } \ |
112 | 12 | } \ |
113 | 1.47k | return Status::OK(); \ |
114 | 1.47k | } \ _ZN5doris8BitmapOr13vector_vectorEPNS_3COWINS_7IColumnEE13immutable_ptrIS2_EEmmRSt6vectorINS_11BitmapValueESaIS8_EEPS2_ Line | Count | Source | 70 | 56 | IColumn* res_nulls) { \ | 71 | 56 | std::vector<const ColumnUInt8::value_type*> null_map_datas(col_size); \ | 72 | 56 | int nullable_cols_count = 0; \ | 73 | 56 | ColumnUInt8::value_type* __restrict res_nulls_data = nullptr; \ | 74 | 56 | if (res_nulls) { \ | 75 | 27 | res_nulls_data = assert_cast<ColumnUInt8*>(res_nulls)->get_data().data(); \ | 76 | 27 | } \ | 77 | 56 | if (auto* nullable = check_and_get_column<ColumnNullable>(*argument_columns[0])) { \ | 78 | 15 | null_map_datas[nullable_cols_count++] = nullable->get_null_map_data().data(); \ | 79 | 15 | BITMAP_OR_NULLABLE(nullable, input_rows_count, res, =); \ | 80 | 41 | } else { \ | 81 | 41 | const auto& mid_data = \ | 82 | 41 | assert_cast<const ColumnBitmap*>(argument_columns[0].get())->get_data(); \ | 83 | 117 | for (size_t row = 0; row < input_rows_count; ++row) { \ | 84 | 76 | res[row] = mid_data[row]; \ | 85 | 76 | } \ | 86 | 41 | } \ | 87 | 122 | for (size_t col = 1; col < col_size; ++col) { \ | 88 | 66 | if (auto* nullable = \ | 89 | 66 | check_and_get_column<ColumnNullable>(*argument_columns[col])) { \ | 90 | 25 | null_map_datas[nullable_cols_count++] = nullable->get_null_map_data().data(); \ | 91 | 25 | BITMAP_OR_NULLABLE(nullable, input_rows_count, res, OP); \ | 92 | 41 | } else { \ | 93 | 41 | const auto& col_data = \ | 94 | 41 | assert_cast<const ColumnBitmap*>(argument_columns[col].get()) \ | 95 | 41 | ->get_data(); \ | 96 | 107 | for (size_t row = 0; row < input_rows_count; ++row) { \ | 97 | 66 | res[row] OP col_data[row]; \ | 98 | 66 | } \ | 99 | 41 | } \ | 100 | 66 | } \ | 101 | 56 | if (res_nulls_data && nullable_cols_count == col_size) { \ | 102 | 12 | const auto* null_map_data = null_map_datas[0]; \ | 103 | 26 | for (size_t row = 0; row < input_rows_count; ++row) { \ | 104 | 14 | res_nulls_data[row] = null_map_data[row]; \ | 105 | 14 | } \ | 106 | 24 | for (int i = 1; i < nullable_cols_count; ++i) { \ | 107 | 12 | null_map_data = null_map_datas[i]; \ | 108 | 26 | for (size_t row = 0; row < input_rows_count; ++row) { \ | 109 | 14 | res_nulls_data[row] &= null_map_data[row]; \ | 110 | 14 | } \ | 111 | 12 | } \ | 112 | 12 | } \ | 113 | 56 | return Status::OK(); \ | 114 | 56 | } \ |
_ZN5doris9BitmapXor13vector_vectorEPNS_3COWINS_7IColumnEE13immutable_ptrIS2_EEmmRSt6vectorINS_11BitmapValueESaIS8_EEPS2_ Line | Count | Source | 70 | 1.39k | IColumn* res_nulls) { \ | 71 | 1.39k | std::vector<const ColumnUInt8::value_type*> null_map_datas(col_size); \ | 72 | 1.39k | int nullable_cols_count = 0; \ | 73 | 1.39k | ColumnUInt8::value_type* __restrict res_nulls_data = nullptr; \ | 74 | 1.39k | if (res_nulls) { \ | 75 | 0 | res_nulls_data = assert_cast<ColumnUInt8*>(res_nulls)->get_data().data(); \ | 76 | 0 | } \ | 77 | 1.39k | if (auto* nullable = check_and_get_column<ColumnNullable>(*argument_columns[0])) { \ | 78 | 0 | null_map_datas[nullable_cols_count++] = nullable->get_null_map_data().data(); \ | 79 | 0 | BITMAP_OR_NULLABLE(nullable, input_rows_count, res, =); \ | 80 | 1.39k | } else { \ | 81 | 1.39k | const auto& mid_data = \ | 82 | 1.39k | assert_cast<const ColumnBitmap*>(argument_columns[0].get())->get_data(); \ | 83 | 13.9k | for (size_t row = 0; row < input_rows_count; ++row) { \ | 84 | 12.5k | res[row] = mid_data[row]; \ | 85 | 12.5k | } \ | 86 | 1.39k | } \ | 87 | 2.79k | for (size_t col = 1; col < col_size; ++col) { \ | 88 | 1.40k | if (auto* nullable = \ | 89 | 1.40k | check_and_get_column<ColumnNullable>(*argument_columns[col])) { \ | 90 | 0 | null_map_datas[nullable_cols_count++] = nullable->get_null_map_data().data(); \ | 91 | 0 | BITMAP_OR_NULLABLE(nullable, input_rows_count, res, OP); \ | 92 | 1.40k | } else { \ | 93 | 1.40k | const auto& col_data = \ | 94 | 1.40k | assert_cast<const ColumnBitmap*>(argument_columns[col].get()) \ | 95 | 1.40k | ->get_data(); \ | 96 | 13.9k | for (size_t row = 0; row < input_rows_count; ++row) { \ | 97 | 12.5k | res[row] OP col_data[row]; \ | 98 | 12.5k | } \ | 99 | 1.40k | } \ | 100 | 1.40k | } \ | 101 | 1.39k | if (res_nulls_data && nullable_cols_count == col_size) { \ | 102 | 0 | const auto* null_map_data = null_map_datas[0]; \ | 103 | 0 | for (size_t row = 0; row < input_rows_count; ++row) { \ | 104 | 0 | res_nulls_data[row] = null_map_data[row]; \ | 105 | 0 | } \ | 106 | 0 | for (int i = 1; i < nullable_cols_count; ++i) { \ | 107 | 0 | null_map_data = null_map_datas[i]; \ | 108 | 0 | for (size_t row = 0; row < input_rows_count; ++row) { \ | 109 | 0 | res_nulls_data[row] &= null_map_data[row]; \ | 110 | 0 | } \ | 111 | 0 | } \ | 112 | 0 | } \ | 113 | 1.39k | return Status::OK(); \ | 114 | 1.39k | } \ |
_ZN5doris9BitmapAnd13vector_vectorEPNS_3COWINS_7IColumnEE13immutable_ptrIS2_EEmmRSt6vectorINS_11BitmapValueESaIS8_EEPS2_ Line | Count | Source | 70 | 20 | IColumn* res_nulls) { \ | 71 | 20 | std::vector<const ColumnUInt8::value_type*> null_map_datas(col_size); \ | 72 | 20 | int nullable_cols_count = 0; \ | 73 | 20 | ColumnUInt8::value_type* __restrict res_nulls_data = nullptr; \ | 74 | 20 | if (res_nulls) { \ | 75 | 0 | res_nulls_data = assert_cast<ColumnUInt8*>(res_nulls)->get_data().data(); \ | 76 | 0 | } \ | 77 | 20 | if (auto* nullable = check_and_get_column<ColumnNullable>(*argument_columns[0])) { \ | 78 | 0 | null_map_datas[nullable_cols_count++] = nullable->get_null_map_data().data(); \ | 79 | 0 | BITMAP_OR_NULLABLE(nullable, input_rows_count, res, =); \ | 80 | 20 | } else { \ | 81 | 20 | const auto& mid_data = \ | 82 | 20 | assert_cast<const ColumnBitmap*>(argument_columns[0].get())->get_data(); \ | 83 | 64 | for (size_t row = 0; row < input_rows_count; ++row) { \ | 84 | 44 | res[row] = mid_data[row]; \ | 85 | 44 | } \ | 86 | 20 | } \ | 87 | 43 | for (size_t col = 1; col < col_size; ++col) { \ | 88 | 23 | if (auto* nullable = \ | 89 | 23 | check_and_get_column<ColumnNullable>(*argument_columns[col])) { \ | 90 | 0 | null_map_datas[nullable_cols_count++] = nullable->get_null_map_data().data(); \ | 91 | 0 | BITMAP_OR_NULLABLE(nullable, input_rows_count, res, OP); \ | 92 | 23 | } else { \ | 93 | 23 | const auto& col_data = \ | 94 | 23 | assert_cast<const ColumnBitmap*>(argument_columns[col].get()) \ | 95 | 23 | ->get_data(); \ | 96 | 70 | for (size_t row = 0; row < input_rows_count; ++row) { \ | 97 | 47 | res[row] OP col_data[row]; \ | 98 | 47 | } \ | 99 | 23 | } \ | 100 | 23 | } \ | 101 | 20 | if (res_nulls_data && nullable_cols_count == col_size) { \ | 102 | 0 | const auto* null_map_data = null_map_datas[0]; \ | 103 | 0 | for (size_t row = 0; row < input_rows_count; ++row) { \ | 104 | 0 | res_nulls_data[row] = null_map_data[row]; \ | 105 | 0 | } \ | 106 | 0 | for (int i = 1; i < nullable_cols_count; ++i) { \ | 107 | 0 | null_map_data = null_map_datas[i]; \ | 108 | 0 | for (size_t row = 0; row < input_rows_count; ++row) { \ | 109 | 0 | res_nulls_data[row] &= null_map_data[row]; \ | 110 | 0 | } \ | 111 | 0 | } \ | 112 | 0 | } \ | 113 | 20 | return Status::OK(); \ | 114 | 20 | } \ |
|
115 | | } |
116 | | |
117 | | #define BITMAP_FUNCTION_COUNT_VARIADIC(CLASS, FUNCTION_NAME, OP) \ |
118 | | struct CLASS { \ |
119 | | static constexpr auto name = #FUNCTION_NAME; \ |
120 | | using ResultDataType = DataTypeInt64; \ |
121 | | using TData = std::vector<BitmapValue>; \ |
122 | | using ResTData = typename ColumnInt64::Container; \ |
123 | | static Status vector_vector(ColumnPtr argument_columns[], size_t col_size, \ |
124 | 70 | size_t input_rows_count, ResTData& res, IColumn* res_nulls) { \ |
125 | 70 | TData vals; \ |
126 | 70 | if (auto* nullable = check_and_get_column<ColumnNullable>(*argument_columns[0])) { \ |
127 | 10 | vals.resize(input_rows_count); \ |
128 | 10 | BITMAP_OR_NULLABLE(nullable, input_rows_count, vals, =); \ |
129 | 60 | } else { \ |
130 | 60 | vals = assert_cast<const ColumnBitmap*>(argument_columns[0].get())->get_data(); \ |
131 | 60 | } \ |
132 | 157 | for (size_t col = 1; col < col_size; ++col) { \ |
133 | 87 | if (auto* nullable = \ |
134 | 87 | check_and_get_column<ColumnNullable>(*argument_columns[col])) { \ |
135 | 15 | BITMAP_OR_NULLABLE(nullable, input_rows_count, vals, OP); \ |
136 | 72 | } else { \ |
137 | 72 | const auto& col_data = \ |
138 | 72 | assert_cast<const ColumnBitmap*>(argument_columns[col].get()) \ |
139 | 72 | ->get_data(); \ |
140 | 227 | for (size_t row = 0; row < input_rows_count; ++row) { \ |
141 | 155 | vals[row] OP col_data[row]; \ |
142 | 155 | } \ |
143 | 72 | } \ |
144 | 87 | } \ |
145 | 226 | for (size_t row = 0; row < input_rows_count; ++row) { \ |
146 | 156 | res[row] = vals[row].cardinality(); \ |
147 | 156 | } \ |
148 | 70 | return Status::OK(); \ |
149 | 70 | } \ _ZN5doris13BitmapOrCount13vector_vectorEPNS_3COWINS_7IColumnEE13immutable_ptrIS2_EEmmRNS_8PODArrayIlLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPS2_ Line | Count | Source | 124 | 24 | size_t input_rows_count, ResTData& res, IColumn* res_nulls) { \ | 125 | 24 | TData vals; \ | 126 | 24 | if (auto* nullable = check_and_get_column<ColumnNullable>(*argument_columns[0])) { \ | 127 | 10 | vals.resize(input_rows_count); \ | 128 | 10 | BITMAP_OR_NULLABLE(nullable, input_rows_count, vals, =); \ | 129 | 14 | } else { \ | 130 | 14 | vals = assert_cast<const ColumnBitmap*>(argument_columns[0].get())->get_data(); \ | 131 | 14 | } \ | 132 | 53 | for (size_t col = 1; col < col_size; ++col) { \ | 133 | 29 | if (auto* nullable = \ | 134 | 29 | check_and_get_column<ColumnNullable>(*argument_columns[col])) { \ | 135 | 15 | BITMAP_OR_NULLABLE(nullable, input_rows_count, vals, OP); \ | 136 | 15 | } else { \ | 137 | 14 | const auto& col_data = \ | 138 | 14 | assert_cast<const ColumnBitmap*>(argument_columns[col].get()) \ | 139 | 14 | ->get_data(); \ | 140 | 47 | for (size_t row = 0; row < input_rows_count; ++row) { \ | 141 | 33 | vals[row] OP col_data[row]; \ | 142 | 33 | } \ | 143 | 14 | } \ | 144 | 29 | } \ | 145 | 76 | for (size_t row = 0; row < input_rows_count; ++row) { \ | 146 | 52 | res[row] = vals[row].cardinality(); \ | 147 | 52 | } \ | 148 | 24 | return Status::OK(); \ | 149 | 24 | } \ |
_ZN5doris14BitmapAndCount13vector_vectorEPNS_3COWINS_7IColumnEE13immutable_ptrIS2_EEmmRNS_8PODArrayIlLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPS2_ Line | Count | Source | 124 | 23 | size_t input_rows_count, ResTData& res, IColumn* res_nulls) { \ | 125 | 23 | TData vals; \ | 126 | 23 | if (auto* nullable = check_and_get_column<ColumnNullable>(*argument_columns[0])) { \ | 127 | 0 | vals.resize(input_rows_count); \ | 128 | 0 | BITMAP_OR_NULLABLE(nullable, input_rows_count, vals, =); \ | 129 | 23 | } else { \ | 130 | 23 | vals = assert_cast<const ColumnBitmap*>(argument_columns[0].get())->get_data(); \ | 131 | 23 | } \ | 132 | 52 | for (size_t col = 1; col < col_size; ++col) { \ | 133 | 29 | if (auto* nullable = \ | 134 | 29 | check_and_get_column<ColumnNullable>(*argument_columns[col])) { \ | 135 | 0 | BITMAP_OR_NULLABLE(nullable, input_rows_count, vals, OP); \ | 136 | 29 | } else { \ | 137 | 29 | const auto& col_data = \ | 138 | 29 | assert_cast<const ColumnBitmap*>(argument_columns[col].get()) \ | 139 | 29 | ->get_data(); \ | 140 | 90 | for (size_t row = 0; row < input_rows_count; ++row) { \ | 141 | 61 | vals[row] OP col_data[row]; \ | 142 | 61 | } \ | 143 | 29 | } \ | 144 | 29 | } \ | 145 | 75 | for (size_t row = 0; row < input_rows_count; ++row) { \ | 146 | 52 | res[row] = vals[row].cardinality(); \ | 147 | 52 | } \ | 148 | 23 | return Status::OK(); \ | 149 | 23 | } \ |
_ZN5doris14BitmapXorCount13vector_vectorEPNS_3COWINS_7IColumnEE13immutable_ptrIS2_EEmmRNS_8PODArrayIlLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPS2_ Line | Count | Source | 124 | 23 | size_t input_rows_count, ResTData& res, IColumn* res_nulls) { \ | 125 | 23 | TData vals; \ | 126 | 23 | if (auto* nullable = check_and_get_column<ColumnNullable>(*argument_columns[0])) { \ | 127 | 0 | vals.resize(input_rows_count); \ | 128 | 0 | BITMAP_OR_NULLABLE(nullable, input_rows_count, vals, =); \ | 129 | 23 | } else { \ | 130 | 23 | vals = assert_cast<const ColumnBitmap*>(argument_columns[0].get())->get_data(); \ | 131 | 23 | } \ | 132 | 52 | for (size_t col = 1; col < col_size; ++col) { \ | 133 | 29 | if (auto* nullable = \ | 134 | 29 | check_and_get_column<ColumnNullable>(*argument_columns[col])) { \ | 135 | 0 | BITMAP_OR_NULLABLE(nullable, input_rows_count, vals, OP); \ | 136 | 29 | } else { \ | 137 | 29 | const auto& col_data = \ | 138 | 29 | assert_cast<const ColumnBitmap*>(argument_columns[col].get()) \ | 139 | 29 | ->get_data(); \ | 140 | 90 | for (size_t row = 0; row < input_rows_count; ++row) { \ | 141 | 61 | vals[row] OP col_data[row]; \ | 142 | 61 | } \ | 143 | 29 | } \ | 144 | 29 | } \ | 145 | 75 | for (size_t row = 0; row < input_rows_count; ++row) { \ | 146 | 52 | res[row] = vals[row].cardinality(); \ | 147 | 52 | } \ | 148 | 23 | return Status::OK(); \ | 149 | 23 | } \ |
|
150 | | } |
151 | | |
152 | | BITMAP_FUNCTION_VARIADIC(BitmapOr, bitmap_or, |=); |
153 | | BITMAP_FUNCTION_VARIADIC(BitmapAnd, bitmap_and, &=); |
154 | | BITMAP_FUNCTION_VARIADIC(BitmapXor, bitmap_xor, ^=); |
155 | | BITMAP_FUNCTION_COUNT_VARIADIC(BitmapOrCount, bitmap_or_count, |=); |
156 | | BITMAP_FUNCTION_COUNT_VARIADIC(BitmapAndCount, bitmap_and_count, &=); |
157 | | BITMAP_FUNCTION_COUNT_VARIADIC(BitmapXorCount, bitmap_xor_count, ^=); |
158 | | |
159 | | Status execute_bitmap_op_count_null_to_zero( |
160 | | FunctionContext* context, Block& block, const ColumnNumbers& arguments, uint32_t result, |
161 | | size_t input_rows_count, |
162 | | const std::function<Status(FunctionContext*, Block&, const ColumnNumbers&, size_t, size_t)>& |
163 | | exec_impl_func); |
164 | | |
165 | | template <typename Impl> |
166 | | class FunctionBitMapVariadic : public IFunction { |
167 | | public: |
168 | | static constexpr auto name = Impl::name; |
169 | | |
170 | 208 | static FunctionPtr create() { return std::make_shared<FunctionBitMapVariadic>(); }_ZN5doris22FunctionBitMapVariadicINS_8BitmapOrEE6createEv Line | Count | Source | 170 | 49 | static FunctionPtr create() { return std::make_shared<FunctionBitMapVariadic>(); } |
_ZN5doris22FunctionBitMapVariadicINS_9BitmapXorEE6createEv Line | Count | Source | 170 | 65 | static FunctionPtr create() { return std::make_shared<FunctionBitMapVariadic>(); } |
_ZN5doris22FunctionBitMapVariadicINS_9BitmapAndEE6createEv Line | Count | Source | 170 | 22 | static FunctionPtr create() { return std::make_shared<FunctionBitMapVariadic>(); } |
_ZN5doris22FunctionBitMapVariadicINS_13BitmapOrCountEE6createEv Line | Count | Source | 170 | 24 | static FunctionPtr create() { return std::make_shared<FunctionBitMapVariadic>(); } |
_ZN5doris22FunctionBitMapVariadicINS_14BitmapAndCountEE6createEv Line | Count | Source | 170 | 24 | static FunctionPtr create() { return std::make_shared<FunctionBitMapVariadic>(); } |
_ZN5doris22FunctionBitMapVariadicINS_14BitmapXorCountEE6createEv Line | Count | Source | 170 | 24 | static FunctionPtr create() { return std::make_shared<FunctionBitMapVariadic>(); } |
|
171 | | |
172 | 0 | String get_name() const override { return name; }Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrEE8get_nameB5cxx11Ev Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorEE8get_nameB5cxx11Ev Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndEE8get_nameB5cxx11Ev Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountEE8get_nameB5cxx11Ev Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountEE8get_nameB5cxx11Ev Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountEE8get_nameB5cxx11Ev |
173 | | |
174 | 0 | size_t get_number_of_arguments() const override { return 0; }Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrEE23get_number_of_argumentsEv Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorEE23get_number_of_argumentsEv Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndEE23get_number_of_argumentsEv Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountEE23get_number_of_argumentsEv Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountEE23get_number_of_argumentsEv Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountEE23get_number_of_argumentsEv |
175 | | |
176 | 160 | bool is_variadic() const override { return true; }_ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrEE11is_variadicEv Line | Count | Source | 176 | 41 | bool is_variadic() const override { return true; } |
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorEE11is_variadicEv Line | Count | Source | 176 | 57 | bool is_variadic() const override { return true; } |
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndEE11is_variadicEv Line | Count | Source | 176 | 14 | bool is_variadic() const override { return true; } |
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountEE11is_variadicEv Line | Count | Source | 176 | 16 | bool is_variadic() const override { return true; } |
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountEE11is_variadicEv Line | Count | Source | 176 | 16 | bool is_variadic() const override { return true; } |
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountEE11is_variadicEv Line | Count | Source | 176 | 16 | bool is_variadic() const override { return true; } |
|
177 | | |
178 | 154 | DataTypePtr get_return_type_impl(const DataTypes& arguments) const override { |
179 | 154 | using ResultDataType = typename Impl::ResultDataType; |
180 | 154 | if (std::is_same_v<Impl, BitmapOr> || is_count()) { |
181 | 85 | bool return_nullable = false; |
182 | | // result is nullable only when any columns is nullable for bitmap_or and bitmap_or_count |
183 | 178 | for (size_t i = 0; i < arguments.size(); ++i) { |
184 | 143 | if (arguments[i]->is_nullable()) { |
185 | 50 | return_nullable = true; |
186 | 50 | break; |
187 | 50 | } |
188 | 143 | } |
189 | 85 | auto result_type = std::make_shared<ResultDataType>(); |
190 | 85 | return return_nullable ? make_nullable(result_type) : result_type; |
191 | 85 | } else { |
192 | 69 | return std::make_shared<ResultDataType>(); |
193 | 69 | } |
194 | 154 | } _ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE Line | Count | Source | 178 | 40 | DataTypePtr get_return_type_impl(const DataTypes& arguments) const override { | 179 | 40 | using ResultDataType = typename Impl::ResultDataType; | 180 | 40 | if (std::is_same_v<Impl, BitmapOr> || is_count()) { | 181 | 40 | bool return_nullable = false; | 182 | | // result is nullable only when any columns is nullable for bitmap_or and bitmap_or_count | 183 | 99 | for (size_t i = 0; i < arguments.size(); ++i) { | 184 | 78 | if (arguments[i]->is_nullable()) { | 185 | 19 | return_nullable = true; | 186 | 19 | break; | 187 | 19 | } | 188 | 78 | } | 189 | 40 | auto result_type = std::make_shared<ResultDataType>(); | 190 | 40 | return return_nullable ? make_nullable(result_type) : result_type; | 191 | 40 | } else { | 192 | 0 | return std::make_shared<ResultDataType>(); | 193 | 0 | } | 194 | 40 | } |
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE Line | Count | Source | 178 | 56 | DataTypePtr get_return_type_impl(const DataTypes& arguments) const override { | 179 | 56 | using ResultDataType = typename Impl::ResultDataType; | 180 | 56 | if (std::is_same_v<Impl, BitmapOr> || is_count()) { | 181 | 0 | bool return_nullable = false; | 182 | | // result is nullable only when any columns is nullable for bitmap_or and bitmap_or_count | 183 | 0 | for (size_t i = 0; i < arguments.size(); ++i) { | 184 | 0 | if (arguments[i]->is_nullable()) { | 185 | 0 | return_nullable = true; | 186 | 0 | break; | 187 | 0 | } | 188 | 0 | } | 189 | 0 | auto result_type = std::make_shared<ResultDataType>(); | 190 | 0 | return return_nullable ? make_nullable(result_type) : result_type; | 191 | 56 | } else { | 192 | 56 | return std::make_shared<ResultDataType>(); | 193 | 56 | } | 194 | 56 | } |
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE Line | Count | Source | 178 | 13 | DataTypePtr get_return_type_impl(const DataTypes& arguments) const override { | 179 | 13 | using ResultDataType = typename Impl::ResultDataType; | 180 | 13 | if (std::is_same_v<Impl, BitmapOr> || is_count()) { | 181 | 0 | bool return_nullable = false; | 182 | | // result is nullable only when any columns is nullable for bitmap_or and bitmap_or_count | 183 | 0 | for (size_t i = 0; i < arguments.size(); ++i) { | 184 | 0 | if (arguments[i]->is_nullable()) { | 185 | 0 | return_nullable = true; | 186 | 0 | break; | 187 | 0 | } | 188 | 0 | } | 189 | 0 | auto result_type = std::make_shared<ResultDataType>(); | 190 | 0 | return return_nullable ? make_nullable(result_type) : result_type; | 191 | 13 | } else { | 192 | 13 | return std::make_shared<ResultDataType>(); | 193 | 13 | } | 194 | 13 | } |
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE Line | Count | Source | 178 | 15 | DataTypePtr get_return_type_impl(const DataTypes& arguments) const override { | 179 | 15 | using ResultDataType = typename Impl::ResultDataType; | 180 | 15 | if (std::is_same_v<Impl, BitmapOr> || is_count()) { | 181 | 15 | bool return_nullable = false; | 182 | | // result is nullable only when any columns is nullable for bitmap_or and bitmap_or_count | 183 | 25 | for (size_t i = 0; i < arguments.size(); ++i) { | 184 | 21 | if (arguments[i]->is_nullable()) { | 185 | 11 | return_nullable = true; | 186 | 11 | break; | 187 | 11 | } | 188 | 21 | } | 189 | 15 | auto result_type = std::make_shared<ResultDataType>(); | 190 | 15 | return return_nullable ? make_nullable(result_type) : result_type; | 191 | 15 | } else { | 192 | 0 | return std::make_shared<ResultDataType>(); | 193 | 0 | } | 194 | 15 | } |
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE Line | Count | Source | 178 | 15 | DataTypePtr get_return_type_impl(const DataTypes& arguments) const override { | 179 | 15 | using ResultDataType = typename Impl::ResultDataType; | 180 | 15 | if (std::is_same_v<Impl, BitmapOr> || is_count()) { | 181 | 15 | bool return_nullable = false; | 182 | | // result is nullable only when any columns is nullable for bitmap_or and bitmap_or_count | 183 | 27 | for (size_t i = 0; i < arguments.size(); ++i) { | 184 | 22 | if (arguments[i]->is_nullable()) { | 185 | 10 | return_nullable = true; | 186 | 10 | break; | 187 | 10 | } | 188 | 22 | } | 189 | 15 | auto result_type = std::make_shared<ResultDataType>(); | 190 | 15 | return return_nullable ? make_nullable(result_type) : result_type; | 191 | 15 | } else { | 192 | 0 | return std::make_shared<ResultDataType>(); | 193 | 0 | } | 194 | 15 | } |
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountEE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS_9IDataTypeEESaIS7_EE Line | Count | Source | 178 | 15 | DataTypePtr get_return_type_impl(const DataTypes& arguments) const override { | 179 | 15 | using ResultDataType = typename Impl::ResultDataType; | 180 | 15 | if (std::is_same_v<Impl, BitmapOr> || is_count()) { | 181 | 15 | bool return_nullable = false; | 182 | | // result is nullable only when any columns is nullable for bitmap_or and bitmap_or_count | 183 | 27 | for (size_t i = 0; i < arguments.size(); ++i) { | 184 | 22 | if (arguments[i]->is_nullable()) { | 185 | 10 | return_nullable = true; | 186 | 10 | break; | 187 | 10 | } | 188 | 22 | } | 189 | 15 | auto result_type = std::make_shared<ResultDataType>(); | 190 | 15 | return return_nullable ? make_nullable(result_type) : result_type; | 191 | 15 | } else { | 192 | 0 | return std::make_shared<ResultDataType>(); | 193 | 0 | } | 194 | 15 | } |
|
195 | | |
196 | 4.79k | bool use_default_implementation_for_nulls() const override { |
197 | | // result is null only when all columns is null for bitmap_or. |
198 | | // for count functions, result is always not null, and if the bitmap op result is null, |
199 | | // the count is 0 |
200 | 4.79k | return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count()); |
201 | 4.79k | } _ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrEE36use_default_implementation_for_nullsEv Line | Count | Source | 196 | 208 | bool use_default_implementation_for_nulls() const override { | 197 | | // result is null only when all columns is null for bitmap_or. | 198 | | // for count functions, result is always not null, and if the bitmap op result is null, | 199 | | // the count is 0 | 200 | 208 | return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count()); | 201 | 208 | } |
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorEE36use_default_implementation_for_nullsEv Line | Count | Source | 196 | 4.25k | bool use_default_implementation_for_nulls() const override { | 197 | | // result is null only when all columns is null for bitmap_or. | 198 | | // for count functions, result is always not null, and if the bitmap op result is null, | 199 | | // the count is 0 | 200 | 4.25k | return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count()); | 201 | 4.25k | } |
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndEE36use_default_implementation_for_nullsEv Line | Count | Source | 196 | 81 | bool use_default_implementation_for_nulls() const override { | 197 | | // result is null only when all columns is null for bitmap_or. | 198 | | // for count functions, result is always not null, and if the bitmap op result is null, | 199 | | // the count is 0 | 200 | 81 | return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count()); | 201 | 81 | } |
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountEE36use_default_implementation_for_nullsEv Line | Count | Source | 196 | 87 | bool use_default_implementation_for_nulls() const override { | 197 | | // result is null only when all columns is null for bitmap_or. | 198 | | // for count functions, result is always not null, and if the bitmap op result is null, | 199 | | // the count is 0 | 200 | 87 | return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count()); | 201 | 87 | } |
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountEE36use_default_implementation_for_nullsEv Line | Count | Source | 196 | 84 | bool use_default_implementation_for_nulls() const override { | 197 | | // result is null only when all columns is null for bitmap_or. | 198 | | // for count functions, result is always not null, and if the bitmap op result is null, | 199 | | // the count is 0 | 200 | 84 | return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count()); | 201 | 84 | } |
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountEE36use_default_implementation_for_nullsEv Line | Count | Source | 196 | 84 | bool use_default_implementation_for_nulls() const override { | 197 | | // result is null only when all columns is null for bitmap_or. | 198 | | // for count functions, result is always not null, and if the bitmap op result is null, | 199 | | // the count is 0 | 200 | 84 | return !static_cast<bool>(std::is_same_v<Impl, BitmapOr> || is_count()); | 201 | 84 | } |
|
202 | | |
203 | | Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments, |
204 | 1.54k | uint32_t result, size_t input_rows_count) const override { |
205 | 1.54k | if (std::is_same_v<Impl, BitmapAndCount> || std::is_same_v<Impl, BitmapXorCount>) { |
206 | 46 | auto impl_func = [&](FunctionContext* context, Block& block, |
207 | 46 | const ColumnNumbers& arguments, uint32_t result, |
208 | 46 | size_t input_rows_count) { |
209 | 46 | return execute_impl_internal(context, block, arguments, result, input_rows_count); |
210 | 46 | }; _ZZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlS4_S6_SB_jmE_clES4_S6_SB_jm Line | Count | Source | 208 | 23 | size_t input_rows_count) { | 209 | 23 | return execute_impl_internal(context, block, arguments, result, input_rows_count); | 210 | 23 | }; |
_ZZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlS4_S6_SB_jmE_clES4_S6_SB_jm Line | Count | Source | 208 | 23 | size_t input_rows_count) { | 209 | 23 | return execute_impl_internal(context, block, arguments, result, input_rows_count); | 210 | 23 | }; |
|
211 | 46 | return execute_bitmap_op_count_null_to_zero(context, block, arguments, result, |
212 | 46 | input_rows_count, impl_func); |
213 | 1.49k | } else { |
214 | 1.49k | return execute_impl_internal(context, block, arguments, result, input_rows_count); |
215 | 1.49k | } |
216 | 1.54k | } _ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm Line | Count | Source | 204 | 56 | uint32_t result, size_t input_rows_count) const override { | 205 | 56 | if (std::is_same_v<Impl, BitmapAndCount> || std::is_same_v<Impl, BitmapXorCount>) { | 206 | 0 | auto impl_func = [&](FunctionContext* context, Block& block, | 207 | 0 | const ColumnNumbers& arguments, uint32_t result, | 208 | 0 | size_t input_rows_count) { | 209 | 0 | return execute_impl_internal(context, block, arguments, result, input_rows_count); | 210 | 0 | }; | 211 | 0 | return execute_bitmap_op_count_null_to_zero(context, block, arguments, result, | 212 | 0 | input_rows_count, impl_func); | 213 | 56 | } else { | 214 | 56 | return execute_impl_internal(context, block, arguments, result, input_rows_count); | 215 | 56 | } | 216 | 56 | } |
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm Line | Count | Source | 204 | 1.39k | uint32_t result, size_t input_rows_count) const override { | 205 | 1.39k | if (std::is_same_v<Impl, BitmapAndCount> || std::is_same_v<Impl, BitmapXorCount>) { | 206 | 0 | auto impl_func = [&](FunctionContext* context, Block& block, | 207 | 0 | const ColumnNumbers& arguments, uint32_t result, | 208 | 0 | size_t input_rows_count) { | 209 | 0 | return execute_impl_internal(context, block, arguments, result, input_rows_count); | 210 | 0 | }; | 211 | 0 | return execute_bitmap_op_count_null_to_zero(context, block, arguments, result, | 212 | 0 | input_rows_count, impl_func); | 213 | 1.39k | } else { | 214 | 1.39k | return execute_impl_internal(context, block, arguments, result, input_rows_count); | 215 | 1.39k | } | 216 | 1.39k | } |
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm Line | Count | Source | 204 | 20 | uint32_t result, size_t input_rows_count) const override { | 205 | 20 | if (std::is_same_v<Impl, BitmapAndCount> || std::is_same_v<Impl, BitmapXorCount>) { | 206 | 0 | auto impl_func = [&](FunctionContext* context, Block& block, | 207 | 0 | const ColumnNumbers& arguments, uint32_t result, | 208 | 0 | size_t input_rows_count) { | 209 | 0 | return execute_impl_internal(context, block, arguments, result, input_rows_count); | 210 | 0 | }; | 211 | 0 | return execute_bitmap_op_count_null_to_zero(context, block, arguments, result, | 212 | 0 | input_rows_count, impl_func); | 213 | 20 | } else { | 214 | 20 | return execute_impl_internal(context, block, arguments, result, input_rows_count); | 215 | 20 | } | 216 | 20 | } |
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm Line | Count | Source | 204 | 24 | uint32_t result, size_t input_rows_count) const override { | 205 | 24 | if (std::is_same_v<Impl, BitmapAndCount> || std::is_same_v<Impl, BitmapXorCount>) { | 206 | 0 | auto impl_func = [&](FunctionContext* context, Block& block, | 207 | 0 | const ColumnNumbers& arguments, uint32_t result, | 208 | 0 | size_t input_rows_count) { | 209 | 0 | return execute_impl_internal(context, block, arguments, result, input_rows_count); | 210 | 0 | }; | 211 | 0 | return execute_bitmap_op_count_null_to_zero(context, block, arguments, result, | 212 | 0 | input_rows_count, impl_func); | 213 | 24 | } else { | 214 | 24 | return execute_impl_internal(context, block, arguments, result, input_rows_count); | 215 | 24 | } | 216 | 24 | } |
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm Line | Count | Source | 204 | 23 | uint32_t result, size_t input_rows_count) const override { | 205 | 23 | if (std::is_same_v<Impl, BitmapAndCount> || std::is_same_v<Impl, BitmapXorCount>) { | 206 | 23 | auto impl_func = [&](FunctionContext* context, Block& block, | 207 | 23 | const ColumnNumbers& arguments, uint32_t result, | 208 | 23 | size_t input_rows_count) { | 209 | 23 | return execute_impl_internal(context, block, arguments, result, input_rows_count); | 210 | 23 | }; | 211 | 23 | return execute_bitmap_op_count_null_to_zero(context, block, arguments, result, | 212 | 23 | input_rows_count, impl_func); | 213 | 23 | } else { | 214 | 0 | return execute_impl_internal(context, block, arguments, result, input_rows_count); | 215 | 0 | } | 216 | 23 | } |
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm Line | Count | Source | 204 | 23 | uint32_t result, size_t input_rows_count) const override { | 205 | 23 | if (std::is_same_v<Impl, BitmapAndCount> || std::is_same_v<Impl, BitmapXorCount>) { | 206 | 23 | auto impl_func = [&](FunctionContext* context, Block& block, | 207 | 23 | const ColumnNumbers& arguments, uint32_t result, | 208 | 23 | size_t input_rows_count) { | 209 | 23 | return execute_impl_internal(context, block, arguments, result, input_rows_count); | 210 | 23 | }; | 211 | 23 | return execute_bitmap_op_count_null_to_zero(context, block, arguments, result, | 212 | 23 | input_rows_count, impl_func); | 213 | 23 | } else { | 214 | 0 | return execute_impl_internal(context, block, arguments, result, input_rows_count); | 215 | 0 | } | 216 | 23 | } |
|
217 | | |
218 | | Status execute_impl_internal(FunctionContext* context, Block& block, |
219 | | const ColumnNumbers& arguments, uint32_t result, |
220 | 1.54k | size_t input_rows_count) const { |
221 | 1.54k | size_t argument_size = arguments.size(); |
222 | 1.54k | std::vector<ColumnPtr> argument_columns(argument_size); |
223 | | |
224 | 4.65k | for (size_t i = 0; i < argument_size; ++i) { |
225 | 3.11k | argument_columns[i] = |
226 | 3.11k | block.get_by_position(arguments[i]).column->convert_to_full_column_if_const(); |
227 | 3.11k | } |
228 | | |
229 | 1.54k | using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64 |
230 | 1.54k | using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>, |
231 | 1.54k | ColumnComplexType<ResultDataType::PType>, |
232 | 1.54k | ColumnVector<ResultDataType::PType>>; |
233 | 1.54k | typename ColVecResult::MutablePtr col_res = nullptr; |
234 | | |
235 | 1.54k | typename ColumnUInt8::MutablePtr col_res_nulls; |
236 | 1.54k | auto& result_info = block.get_by_position(result); |
237 | | // special case for bitmap_or and bitmap_or_count |
238 | 1.54k | if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) { |
239 | 65 | col_res_nulls = ColumnUInt8::create(input_rows_count, 0); |
240 | 65 | } |
241 | | |
242 | 1.54k | col_res = ColVecResult::create(); |
243 | | |
244 | 1.54k | auto& vec_res = col_res->get_data(); |
245 | 1.54k | vec_res.resize(input_rows_count); |
246 | | |
247 | 1.54k | RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size, |
248 | 1.54k | input_rows_count, vec_res, col_res_nulls.get())); |
249 | 1.54k | if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) { |
250 | 65 | block.replace_by_position( |
251 | 65 | result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls))); |
252 | 1.47k | } else { |
253 | 1.47k | block.replace_by_position(result, std::move(col_res)); |
254 | 1.47k | } |
255 | 1.54k | return Status::OK(); |
256 | 1.54k | } _ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrEE21execute_impl_internalEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm Line | Count | Source | 220 | 56 | size_t input_rows_count) const { | 221 | 56 | size_t argument_size = arguments.size(); | 222 | 56 | std::vector<ColumnPtr> argument_columns(argument_size); | 223 | | | 224 | 178 | for (size_t i = 0; i < argument_size; ++i) { | 225 | 122 | argument_columns[i] = | 226 | 122 | block.get_by_position(arguments[i]).column->convert_to_full_column_if_const(); | 227 | 122 | } | 228 | | | 229 | 56 | using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64 | 230 | 56 | using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>, | 231 | 56 | ColumnComplexType<ResultDataType::PType>, | 232 | 56 | ColumnVector<ResultDataType::PType>>; | 233 | 56 | typename ColVecResult::MutablePtr col_res = nullptr; | 234 | | | 235 | 56 | typename ColumnUInt8::MutablePtr col_res_nulls; | 236 | 56 | auto& result_info = block.get_by_position(result); | 237 | | // special case for bitmap_or and bitmap_or_count | 238 | 56 | if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) { | 239 | 27 | col_res_nulls = ColumnUInt8::create(input_rows_count, 0); | 240 | 27 | } | 241 | | | 242 | 56 | col_res = ColVecResult::create(); | 243 | | | 244 | 56 | auto& vec_res = col_res->get_data(); | 245 | 56 | vec_res.resize(input_rows_count); | 246 | | | 247 | 56 | RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size, | 248 | 56 | input_rows_count, vec_res, col_res_nulls.get())); | 249 | 56 | if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) { | 250 | 27 | block.replace_by_position( | 251 | 27 | result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls))); | 252 | 29 | } else { | 253 | 29 | block.replace_by_position(result, std::move(col_res)); | 254 | 29 | } | 255 | 56 | return Status::OK(); | 256 | 56 | } |
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorEE21execute_impl_internalEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm Line | Count | Source | 220 | 1.39k | size_t input_rows_count) const { | 221 | 1.39k | size_t argument_size = arguments.size(); | 222 | 1.39k | std::vector<ColumnPtr> argument_columns(argument_size); | 223 | | | 224 | 4.19k | for (size_t i = 0; i < argument_size; ++i) { | 225 | 2.79k | argument_columns[i] = | 226 | 2.79k | block.get_by_position(arguments[i]).column->convert_to_full_column_if_const(); | 227 | 2.79k | } | 228 | | | 229 | 1.39k | using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64 | 230 | 1.39k | using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>, | 231 | 1.39k | ColumnComplexType<ResultDataType::PType>, | 232 | 1.39k | ColumnVector<ResultDataType::PType>>; | 233 | 1.39k | typename ColVecResult::MutablePtr col_res = nullptr; | 234 | | | 235 | 1.39k | typename ColumnUInt8::MutablePtr col_res_nulls; | 236 | 1.39k | auto& result_info = block.get_by_position(result); | 237 | | // special case for bitmap_or and bitmap_or_count | 238 | 1.39k | if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) { | 239 | 0 | col_res_nulls = ColumnUInt8::create(input_rows_count, 0); | 240 | 0 | } | 241 | | | 242 | 1.39k | col_res = ColVecResult::create(); | 243 | | | 244 | 1.39k | auto& vec_res = col_res->get_data(); | 245 | 1.39k | vec_res.resize(input_rows_count); | 246 | | | 247 | 1.39k | RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size, | 248 | 1.39k | input_rows_count, vec_res, col_res_nulls.get())); | 249 | 1.39k | if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) { | 250 | 0 | block.replace_by_position( | 251 | 0 | result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls))); | 252 | 1.39k | } else { | 253 | 1.39k | block.replace_by_position(result, std::move(col_res)); | 254 | 1.39k | } | 255 | 1.39k | return Status::OK(); | 256 | 1.39k | } |
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndEE21execute_impl_internalEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm Line | Count | Source | 220 | 20 | size_t input_rows_count) const { | 221 | 20 | size_t argument_size = arguments.size(); | 222 | 20 | std::vector<ColumnPtr> argument_columns(argument_size); | 223 | | | 224 | 63 | for (size_t i = 0; i < argument_size; ++i) { | 225 | 43 | argument_columns[i] = | 226 | 43 | block.get_by_position(arguments[i]).column->convert_to_full_column_if_const(); | 227 | 43 | } | 228 | | | 229 | 20 | using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64 | 230 | 20 | using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>, | 231 | 20 | ColumnComplexType<ResultDataType::PType>, | 232 | 20 | ColumnVector<ResultDataType::PType>>; | 233 | 20 | typename ColVecResult::MutablePtr col_res = nullptr; | 234 | | | 235 | 20 | typename ColumnUInt8::MutablePtr col_res_nulls; | 236 | 20 | auto& result_info = block.get_by_position(result); | 237 | | // special case for bitmap_or and bitmap_or_count | 238 | 20 | if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) { | 239 | 0 | col_res_nulls = ColumnUInt8::create(input_rows_count, 0); | 240 | 0 | } | 241 | | | 242 | 20 | col_res = ColVecResult::create(); | 243 | | | 244 | 20 | auto& vec_res = col_res->get_data(); | 245 | 20 | vec_res.resize(input_rows_count); | 246 | | | 247 | 20 | RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size, | 248 | 20 | input_rows_count, vec_res, col_res_nulls.get())); | 249 | 20 | if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) { | 250 | 0 | block.replace_by_position( | 251 | 0 | result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls))); | 252 | 20 | } else { | 253 | 20 | block.replace_by_position(result, std::move(col_res)); | 254 | 20 | } | 255 | 20 | return Status::OK(); | 256 | 20 | } |
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountEE21execute_impl_internalEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm Line | Count | Source | 220 | 24 | size_t input_rows_count) const { | 221 | 24 | size_t argument_size = arguments.size(); | 222 | 24 | std::vector<ColumnPtr> argument_columns(argument_size); | 223 | | | 224 | 77 | for (size_t i = 0; i < argument_size; ++i) { | 225 | 53 | argument_columns[i] = | 226 | 53 | block.get_by_position(arguments[i]).column->convert_to_full_column_if_const(); | 227 | 53 | } | 228 | | | 229 | 24 | using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64 | 230 | 24 | using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>, | 231 | 24 | ColumnComplexType<ResultDataType::PType>, | 232 | 24 | ColumnVector<ResultDataType::PType>>; | 233 | 24 | typename ColVecResult::MutablePtr col_res = nullptr; | 234 | | | 235 | 24 | typename ColumnUInt8::MutablePtr col_res_nulls; | 236 | 24 | auto& result_info = block.get_by_position(result); | 237 | | // special case for bitmap_or and bitmap_or_count | 238 | 24 | if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) { | 239 | 14 | col_res_nulls = ColumnUInt8::create(input_rows_count, 0); | 240 | 14 | } | 241 | | | 242 | 24 | col_res = ColVecResult::create(); | 243 | | | 244 | 24 | auto& vec_res = col_res->get_data(); | 245 | 24 | vec_res.resize(input_rows_count); | 246 | | | 247 | 24 | RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size, | 248 | 24 | input_rows_count, vec_res, col_res_nulls.get())); | 249 | 24 | if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) { | 250 | 14 | block.replace_by_position( | 251 | 14 | result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls))); | 252 | 14 | } else { | 253 | 10 | block.replace_by_position(result, std::move(col_res)); | 254 | 10 | } | 255 | 24 | return Status::OK(); | 256 | 24 | } |
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountEE21execute_impl_internalEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm Line | Count | Source | 220 | 23 | size_t input_rows_count) const { | 221 | 23 | size_t argument_size = arguments.size(); | 222 | 23 | std::vector<ColumnPtr> argument_columns(argument_size); | 223 | | | 224 | 75 | for (size_t i = 0; i < argument_size; ++i) { | 225 | 52 | argument_columns[i] = | 226 | 52 | block.get_by_position(arguments[i]).column->convert_to_full_column_if_const(); | 227 | 52 | } | 228 | | | 229 | 23 | using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64 | 230 | 23 | using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>, | 231 | 23 | ColumnComplexType<ResultDataType::PType>, | 232 | 23 | ColumnVector<ResultDataType::PType>>; | 233 | 23 | typename ColVecResult::MutablePtr col_res = nullptr; | 234 | | | 235 | 23 | typename ColumnUInt8::MutablePtr col_res_nulls; | 236 | 23 | auto& result_info = block.get_by_position(result); | 237 | | // special case for bitmap_or and bitmap_or_count | 238 | 23 | if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) { | 239 | 12 | col_res_nulls = ColumnUInt8::create(input_rows_count, 0); | 240 | 12 | } | 241 | | | 242 | 23 | col_res = ColVecResult::create(); | 243 | | | 244 | 23 | auto& vec_res = col_res->get_data(); | 245 | 23 | vec_res.resize(input_rows_count); | 246 | | | 247 | 23 | RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size, | 248 | 23 | input_rows_count, vec_res, col_res_nulls.get())); | 249 | 23 | if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) { | 250 | 12 | block.replace_by_position( | 251 | 12 | result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls))); | 252 | 12 | } else { | 253 | 11 | block.replace_by_position(result, std::move(col_res)); | 254 | 11 | } | 255 | 23 | return Status::OK(); | 256 | 23 | } |
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountEE21execute_impl_internalEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm Line | Count | Source | 220 | 23 | size_t input_rows_count) const { | 221 | 23 | size_t argument_size = arguments.size(); | 222 | 23 | std::vector<ColumnPtr> argument_columns(argument_size); | 223 | | | 224 | 75 | for (size_t i = 0; i < argument_size; ++i) { | 225 | 52 | argument_columns[i] = | 226 | 52 | block.get_by_position(arguments[i]).column->convert_to_full_column_if_const(); | 227 | 52 | } | 228 | | | 229 | 23 | using ResultDataType = typename Impl::ResultDataType; //DataTypeBitMap or DataTypeInt64 | 230 | 23 | using ColVecResult = std::conditional_t<is_complex_v<ResultDataType::PType>, | 231 | 23 | ColumnComplexType<ResultDataType::PType>, | 232 | 23 | ColumnVector<ResultDataType::PType>>; | 233 | 23 | typename ColVecResult::MutablePtr col_res = nullptr; | 234 | | | 235 | 23 | typename ColumnUInt8::MutablePtr col_res_nulls; | 236 | 23 | auto& result_info = block.get_by_position(result); | 237 | | // special case for bitmap_or and bitmap_or_count | 238 | 23 | if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) { | 239 | 12 | col_res_nulls = ColumnUInt8::create(input_rows_count, 0); | 240 | 12 | } | 241 | | | 242 | 23 | col_res = ColVecResult::create(); | 243 | | | 244 | 23 | auto& vec_res = col_res->get_data(); | 245 | 23 | vec_res.resize(input_rows_count); | 246 | | | 247 | 23 | RETURN_IF_ERROR(Impl::vector_vector(argument_columns.data(), argument_size, | 248 | 23 | input_rows_count, vec_res, col_res_nulls.get())); | 249 | 23 | if (!use_default_implementation_for_nulls() && result_info.type->is_nullable()) { | 250 | 12 | block.replace_by_position( | 251 | 12 | result, ColumnNullable::create(std::move(col_res), std::move(col_res_nulls))); | 252 | 12 | } else { | 253 | 11 | block.replace_by_position(result, std::move(col_res)); | 254 | 11 | } | 255 | 23 | return Status::OK(); | 256 | 23 | } |
|
257 | | |
258 | | private: |
259 | 4.70k | bool is_count() const { |
260 | 4.70k | return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> || |
261 | 4.70k | std::is_same_v<Impl, BitmapXorCount>); |
262 | 4.70k | } _ZNK5doris22FunctionBitMapVariadicINS_9BitmapXorEE8is_countEv Line | Count | Source | 259 | 4.30k | bool is_count() const { | 260 | 4.30k | return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> || | 261 | 4.30k | std::is_same_v<Impl, BitmapXorCount>); | 262 | 4.30k | } |
_ZNK5doris22FunctionBitMapVariadicINS_9BitmapAndEE8is_countEv Line | Count | Source | 259 | 94 | bool is_count() const { | 260 | 94 | return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> || | 261 | 94 | std::is_same_v<Impl, BitmapXorCount>); | 262 | 94 | } |
_ZNK5doris22FunctionBitMapVariadicINS_13BitmapOrCountEE8is_countEv Line | Count | Source | 259 | 102 | bool is_count() const { | 260 | 102 | return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> || | 261 | 102 | std::is_same_v<Impl, BitmapXorCount>); | 262 | 102 | } |
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapAndCountEE8is_countEv Line | Count | Source | 259 | 99 | bool is_count() const { | 260 | 99 | return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> || | 261 | 99 | std::is_same_v<Impl, BitmapXorCount>); | 262 | 99 | } |
_ZNK5doris22FunctionBitMapVariadicINS_14BitmapXorCountEE8is_countEv Line | Count | Source | 259 | 99 | bool is_count() const { | 260 | 99 | return (std::is_same_v<Impl, BitmapOrCount> || std::is_same_v<Impl, BitmapAndCount> || | 261 | 99 | std::is_same_v<Impl, BitmapXorCount>); | 262 | 99 | } |
Unexecuted instantiation: _ZNK5doris22FunctionBitMapVariadicINS_8BitmapOrEE8is_countEv |
263 | | }; |
264 | | |
265 | | using FunctionBitmapOr = FunctionBitMapVariadic<BitmapOr>; |
266 | | using FunctionBitmapXor = FunctionBitMapVariadic<BitmapXor>; |
267 | | using FunctionBitmapAnd = FunctionBitMapVariadic<BitmapAnd>; |
268 | | using FunctionBitmapOrCount = FunctionBitMapVariadic<BitmapOrCount>; |
269 | | using FunctionBitmapAndCount = FunctionBitMapVariadic<BitmapAndCount>; |
270 | | using FunctionBitmapXorCount = FunctionBitMapVariadic<BitmapXorCount>; |
271 | | |
272 | 8 | void register_function_bitmap_variadic(SimpleFunctionFactory& factory) { |
273 | 8 | factory.register_function<FunctionBitmapOr>(); |
274 | 8 | factory.register_function<FunctionBitmapXor>(); |
275 | 8 | factory.register_function<FunctionBitmapAnd>(); |
276 | 8 | factory.register_function<FunctionBitmapOrCount>(); |
277 | 8 | factory.register_function<FunctionBitmapAndCount>(); |
278 | 8 | factory.register_function<FunctionBitmapXorCount>(); |
279 | 8 | } |
280 | | } // namespace doris |