This is an automated email from the ASF dual-hosted git repository. kxiao pushed a commit to branch branch-2.0 in repository https://gitbox.apache.org/repos/asf/doris.git
commit 7d0fb311c26a0503df95be985deff0342e74371f Author: Jerry Hu <[email protected]> AuthorDate: Thu Aug 17 18:14:29 2023 +0800 [refactor](bitmap) using template to reduce duplicate code (#23060) * [refactor](bitmap) support for batch value insertion * fix values was not filled for int8 and int16 --- be/src/util/bitmap_value.h | 74 +++++++++++++++++++--- .../aggregate_function_bitmap_agg.h | 19 ++++++ 2 files changed, 85 insertions(+), 8 deletions(-) diff --git a/be/src/util/bitmap_value.h b/be/src/util/bitmap_value.h index 5ada50fb59..52c4caaa41 100644 --- a/be/src/util/bitmap_value.h +++ b/be/src/util/bitmap_value.h @@ -187,16 +187,28 @@ public: return result; } - /** - * Add value n_args from pointer vals - * - */ - void addMany(size_t n_args, const uint32_t* vals) { - for (size_t lcv = 0; lcv < n_args; lcv++) { - roarings[0].add(vals[lcv]); - roarings[0].setCopyOnWrite(copyOnWrite); + template <typename T> + void addMany(size_t n_args, const T* vals) { + if constexpr (sizeof(T) == sizeof(uint32_t)) { + auto& roaring = roarings[0]; + roaring.addMany(n_args, reinterpret_cast<const uint32_t*>(vals)); + roaring.setCopyOnWrite(copyOnWrite); + } else if constexpr (sizeof(T) < sizeof(uint32_t)) { + auto& roaring = roarings[0]; + std::vector<uint32_t> values(n_args); + for (size_t i = 0; i != n_args; ++i) { + values[i] = uint32_t(vals[i]); + } + roaring.addMany(n_args, values.data()); + roaring.setCopyOnWrite(copyOnWrite); + } else { + for (size_t lcv = 0; lcv < n_args; lcv++) { + roarings[highBytes(vals[lcv])].add(lowBytes(vals[lcv])); + roarings[highBytes(vals[lcv])].setCopyOnWrite(copyOnWrite); + } } } + void addMany(size_t n_args, const uint64_t* vals) { for (size_t lcv = 0; lcv < n_args; lcv++) { roarings[highBytes(vals[lcv])].add(lowBytes(vals[lcv])); @@ -1231,6 +1243,52 @@ public: } } + template <typename T> + void add_many(const T* values, const size_t count) { + switch (_type) { + case EMPTY: + if (count == 1) { + _sv = values[0]; + _type = SINGLE; + } else if (config::enable_set_in_bitmap_value && count < SET_TYPE_THRESHOLD) { + for (size_t i = 0; i != count; ++i) { + _set.insert(values[i]); + } + _type = SET; + } else { + _prepare_bitmap_for_write(); + _bitmap->addMany(count, values); + _type = BITMAP; + } + break; + case SINGLE: + if (config::enable_set_in_bitmap_value && count < SET_TYPE_THRESHOLD) { + _set.insert(_sv); + for (size_t i = 0; i != count; ++i) { + _set.insert(values[i]); + } + _type = SET; + _convert_to_bitmap_if_need(); + } else { + _prepare_bitmap_for_write(); + _bitmap->add(_sv); + _bitmap->addMany(count, values); + _type = BITMAP; + } + break; + case BITMAP: + _prepare_bitmap_for_write(); + _bitmap->addMany(count, values); + break; + case SET: + for (size_t i = 0; i != count; ++i) { + _set.insert(values[i]); + } + _convert_to_bitmap_if_need(); + break; + } + } + void add(uint64_t value) { switch (_type) { case EMPTY: diff --git a/be/src/vec/aggregate_functions/aggregate_function_bitmap_agg.h b/be/src/vec/aggregate_functions/aggregate_function_bitmap_agg.h index 43ebb73249..02e3b8f28e 100644 --- a/be/src/vec/aggregate_functions/aggregate_function_bitmap_agg.h +++ b/be/src/vec/aggregate_functions/aggregate_function_bitmap_agg.h @@ -82,6 +82,25 @@ public: } } + void add_batch_single_place(size_t batch_size, AggregateDataPtr place, const IColumn** columns, + Arena* arena) const override { + if constexpr (arg_nullable) { + auto& nullable_column = assert_cast<const ColumnNullable&>(*columns[0]); + const auto& column = + assert_cast<const ColVecType&>(nullable_column.get_nested_column()); + std::vector<T> values; + for (int i = 0; i < batch_size; ++i) { + if (!nullable_column.is_null_at(i)) { + values.push_back(column.get_data()[i]); + } + } + this->data(place).value.add_many(values.data(), values.size()); + } else { + const auto& column = assert_cast<const ColVecType&>(*columns[0]); + this->data(place).value.add_many(column.get_data().data(), column.size()); + } + } + void reset(AggregateDataPtr place) const override { this->data(place).reset(); } void merge(AggregateDataPtr __restrict place, ConstAggregateDataPtr rhs, --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
