HappenLee commented on code in PR #23172:
URL: https://github.com/apache/doris/pull/23172#discussion_r1299145595
##########
be/src/vec/aggregate_functions/aggregate_function_bitmap.h:
##########
@@ -146,10 +146,127 @@ struct AggregateFunctionBitmapData {
BitmapValue& get() { return value; }
};
+template <typename Data, typename Derived>
+class AggregateFunctionBitmapSerializationHelper
+ : public IAggregateFunctionDataHelper<Data, Derived> {
+public:
+ using BaseHelper = IAggregateFunctionHelper<Derived>;
+
+ AggregateFunctionBitmapSerializationHelper(const DataTypes&
argument_types_)
+ : IAggregateFunctionDataHelper<Data, Derived>(argument_types_) {}
+
+ void serialize_to_column(const std::vector<AggregateDataPtr>& places,
size_t offset,
+ MutableColumnPtr& dst, const size_t num_rows)
const override {
+ if (version >= 3) {
+ auto& col = assert_cast<ColumnBitmap&>(*dst);
+ col.resize(num_rows);
+ auto* data = col.get_data().data();
+ for (size_t i = 0; i != num_rows; ++i) {
+ data[i] = this->data(places[i] + offset).value;
+ }
+ } else {
+ BaseHelper::serialize_to_column(places, offset, dst, num_rows);
+ }
+ }
+
+ void deserialize_and_merge_from_column(AggregateDataPtr __restrict place,
const IColumn& column,
+ Arena* arena) const override {
+ if (version >= 3) {
+ auto& col = assert_cast<const ColumnBitmap&>(column);
+ const size_t num_rows = column.size();
+ auto* data = col.get_data().data();
+
+ for (size_t i = 0; i != num_rows; ++i) {
+ this->data(place).merge(data[i]);
+ }
+ } else {
+ BaseHelper::deserialize_and_merge_from_column(place, column,
arena);
+ }
+ }
+
+ void deserialize_and_merge_from_column_range(AggregateDataPtr __restrict
place,
+ const IColumn& column, size_t
begin, size_t end,
+ Arena* arena) const override {
+ DCHECK(end <= column.size() && begin <= end)
+ << ", begin:" << begin << ", end:" << end << ",
column.size():" << column.size();
+ if (version >= 3) {
+ auto& col = assert_cast<const ColumnBitmap&>(column);
+ auto* data = col.get_data().data();
+ for (size_t i = begin; i <= end; ++i) {
+ this->data(place).merge(data[i]);
+ }
+ } else {
+ BaseHelper::deserialize_and_merge_from_column_range(place, column,
begin, end, arena);
+ }
+ }
+
+ void deserialize_and_merge_vec(const AggregateDataPtr* places, size_t
offset,
+ AggregateDataPtr rhs, const ColumnString*
column, Arena* arena,
+ const size_t num_rows) const override {
+ if (version >= 3) {
+ auto& col = assert_cast<const ColumnBitmap&>(*assert_cast<const
IColumn*>(column));
+ auto* data = col.get_data().data();
+ for (size_t i = 0; i != num_rows; ++i) {
+ this->data(places[i]).merge(data[i]);
+ }
+ } else {
+ BaseHelper::deserialize_and_merge_vec(places, offset, rhs, column,
arena, num_rows);
+ }
+ }
+
+ void deserialize_and_merge_vec_selected(const AggregateDataPtr* places,
size_t offset,
+ AggregateDataPtr rhs, const
ColumnString* column,
+ Arena* arena, const size_t
num_rows) const override {
+ if (version >= 3) {
+ auto& col = assert_cast<const ColumnBitmap&>(*assert_cast<const
IColumn*>(column));
+ auto* data = col.get_data().data();
+ for (size_t i = 0; i != num_rows; ++i) {
+ if (places[i]) {
+ this->data(places[i]).merge(data[i]);
+ }
+ }
+ } else {
+ BaseHelper::deserialize_and_merge_vec_selected(places, offset,
rhs, column, arena,
+ num_rows);
+ }
+ }
+
+ void serialize_without_key_to_column(ConstAggregateDataPtr __restrict
place,
+ IColumn& to) const override {
+ if (version >= 3) {
+ auto& col = assert_cast<ColumnBitmap&>(to);
+ size_t old_size = col.size();
+ col.resize(old_size + 1);
+ col.get_data()[old_size] = this->data(place).value;
Review Comment:
seems better use std::move?
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]