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: commits-unsubscr...@doris.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org