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]

Reply via email to