From 99cd41e65d2f8a932e4ee33db6c5808a5f1a8c36 Mon Sep 17 00:00:00 2001 From: Mryange Date: Thu, 2 Apr 2026 16:31:31 +0800 Subject: [PATCH 1/2] upd --- .../aggregate_function_reader_first_last.h | 304 +----------------- .../aggregate_function_reader_replace.cpp | 260 +++++++++++++-- 2 files changed, 240 insertions(+), 324 deletions(-) diff --git a/be/src/exprs/aggregate/aggregate_function_reader_first_last.h b/be/src/exprs/aggregate/aggregate_function_reader_first_last.h index 4a2caaee43feaf..b3826723f1e6b4 100644 --- a/be/src/exprs/aggregate/aggregate_function_reader_first_last.h +++ b/be/src/exprs/aggregate/aggregate_function_reader_first_last.h @@ -19,17 +19,7 @@ #include -#include "core/column/column_array.h" -#include "core/column/column_map.h" #include "core/column/column_nullable.h" -#include "core/column/column_struct.h" -#include "core/column/column_variant.h" -#include "core/column/column_vector.h" -#include "core/data_type/data_type_decimal.h" -#include "core/data_type/data_type_nullable.h" -#include "core/data_type/data_type_string.h" -#include "exprs/aggregate/aggregate_function.h" -#include "exprs/function/function.h" namespace doris { #include "common/compile_check_begin.h" @@ -177,297 +167,5 @@ struct ReaderFirstAndLastData { bool _has_value = false; }; -template -struct ReaderFunctionFirstData - : ReaderFirstAndLastData { - void add(int64_t row, const IColumn** columns) { - if (this->has_set_value()) { - return; - } - this->set_value(columns, row); - } - static const char* name() { return "first_value"; } -}; - -template -struct ReaderFunctionFirstNonNullData - : ReaderFirstAndLastData { - void add(int64_t row, const IColumn** columns) { - if (this->has_set_value()) { - return; - } - if constexpr (ReaderFirstAndLastData::nullable) { - const auto* nullable_column = - assert_cast(columns[0]); - if (nullable_column->is_null_at(row)) { - return; - } - } - this->set_value(columns, row); - } - static const char* name() { return "first_non_null_value"; } -}; - -template -struct ReaderFunctionLastData - : ReaderFirstAndLastData { - void add(int64_t row, const IColumn** columns) { this->set_value(columns, row); } - static const char* name() { return "last_value"; } -}; - -template -struct ReaderFunctionLastNonNullData - : ReaderFirstAndLastData { - void add(int64_t row, const IColumn** columns) { - if constexpr (ReaderFirstAndLastData::nullable) { - const auto* nullable_column = - assert_cast(columns[0]); - if (nullable_column->is_null_at(row)) { - return; - } - } - this->set_value(columns, row); - } - - static const char* name() { return "last_non_null_value"; } -}; - -template -class ReaderFunctionData final - : public IAggregateFunctionDataHelper> { -public: - ReaderFunctionData(const DataTypes& argument_types_) - : IAggregateFunctionDataHelper>(argument_types_), - _argument_type(argument_types_[0]) {} - - String get_name() const override { return Data::name(); } - - DataTypePtr get_return_type() const override { - if constexpr (Data::result_nullable) { - return make_nullable(_argument_type); - } else { - return _argument_type; - } - } - - void insert_result_into(ConstAggregateDataPtr place, IColumn& to) const override { - this->data(place).insert_result_into(to); - } - - void add(AggregateDataPtr place, const IColumn** columns, ssize_t row_num, - Arena&) const override { - this->data(place).add(row_num, columns); - } - - void reset(AggregateDataPtr place) const override { this->data(place).reset(); } - - void add_range_single_place(int64_t partition_start, int64_t partition_end, int64_t frame_start, - int64_t frame_end, AggregateDataPtr place, const IColumn** columns, - Arena& arena, UInt8*, UInt8*) const override { - throw doris::Exception( - Status::FatalError("ReaderFunctionData do not support add_range_single_place")); - } - void merge(AggregateDataPtr place, ConstAggregateDataPtr rhs, Arena&) const override { - throw doris::Exception(Status::FatalError("ReaderFunctionData do not support merge")); - } - void serialize(ConstAggregateDataPtr place, BufferWritable& buf) const override { - throw doris::Exception(Status::FatalError("ReaderFunctionData do not support serialize")); - } - void deserialize(AggregateDataPtr place, BufferReadable& buf, Arena&) const override { - throw doris::Exception(Status::FatalError("ReaderFunctionData do not support deserialize")); - } - -private: - DataTypePtr _argument_type; -}; - -template