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 c5c984b79b [refactor](bitmap) using template to reduce duplicate code
(#23060)
c5c984b79b is described below
commit c5c984b79b56f0d2d0819f8b374b146f635486fe
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]