[Enchancement](function) nullable inline refactor of min_max_by/bitmap && add register_functio… (#17228)
1. nullable inline refactor of min_max_by/bitmap/group_concat/histogram/topn 2. add register_function_both method 3. add datetimev2 type creator of min_max_by 4. remove uint16/32/64 in FOR_INTEGER_TYPES
This commit is contained in:
@ -18,50 +18,45 @@
|
||||
#include "vec/aggregate_functions/aggregate_function_bitmap.h"
|
||||
|
||||
#include "vec/aggregate_functions/aggregate_function_simple_factory.h"
|
||||
#include "vec/aggregate_functions/helpers.h"
|
||||
|
||||
namespace doris::vectorized {
|
||||
|
||||
template <bool nullable, template <bool, typename> class AggregateFunctionTemplate>
|
||||
static IAggregateFunction* createWithIntDataType(const DataTypes& argument_type) {
|
||||
auto type = argument_type[0].get();
|
||||
if (type->is_nullable()) {
|
||||
type = assert_cast<const DataTypeNullable*>(type)->get_nested_type().get();
|
||||
}
|
||||
static IAggregateFunction* create_with_int_data_type(const DataTypes& argument_type) {
|
||||
auto type = remove_nullable(argument_type[0]);
|
||||
WhichDataType which(type);
|
||||
if (which.idx == TypeIndex::Int8) {
|
||||
return new AggregateFunctionTemplate<nullable, ColumnVector<Int8>>(argument_type);
|
||||
}
|
||||
if (which.idx == TypeIndex::Int16) {
|
||||
return new AggregateFunctionTemplate<nullable, ColumnVector<Int16>>(argument_type);
|
||||
}
|
||||
if (which.idx == TypeIndex::Int32) {
|
||||
return new AggregateFunctionTemplate<nullable, ColumnVector<Int32>>(argument_type);
|
||||
}
|
||||
if (which.idx == TypeIndex::Int64) {
|
||||
return new AggregateFunctionTemplate<nullable, ColumnVector<Int64>>(argument_type);
|
||||
#define DISPATCH(TYPE) \
|
||||
if (which.idx == TypeIndex::TYPE) { \
|
||||
return new AggregateFunctionTemplate<nullable, ColumnVector<TYPE>>(argument_type); \
|
||||
}
|
||||
FOR_INTEGER_TYPES(DISPATCH)
|
||||
#undef DISPATCH
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
AggregateFunctionPtr create_aggregate_function_bitmap_union(const std::string& name,
|
||||
const DataTypes& argument_types,
|
||||
const bool result_is_nullable) {
|
||||
return std::make_shared<AggregateFunctionBitmapOp<AggregateFunctionBitmapUnionOp>>(
|
||||
argument_types);
|
||||
return AggregateFunctionPtr(
|
||||
creator_without_type::create<AggregateFunctionBitmapOp<AggregateFunctionBitmapUnionOp>>(
|
||||
result_is_nullable, argument_types));
|
||||
}
|
||||
|
||||
AggregateFunctionPtr create_aggregate_function_bitmap_intersect(const std::string& name,
|
||||
const DataTypes& argument_types,
|
||||
const bool result_is_nullable) {
|
||||
return std::make_shared<AggregateFunctionBitmapOp<AggregateFunctionBitmapIntersectOp>>(
|
||||
argument_types);
|
||||
return AggregateFunctionPtr(creator_without_type::create<
|
||||
AggregateFunctionBitmapOp<AggregateFunctionBitmapIntersectOp>>(
|
||||
result_is_nullable, argument_types));
|
||||
}
|
||||
|
||||
AggregateFunctionPtr create_aggregate_function_group_bitmap_xor(const std::string& name,
|
||||
const DataTypes& argument_types,
|
||||
const bool result_is_nullable) {
|
||||
return std::make_shared<AggregateFunctionBitmapOp<AggregateFunctionGroupBitmapXorOp>>(
|
||||
argument_types);
|
||||
return AggregateFunctionPtr(creator_without_type::create<
|
||||
AggregateFunctionBitmapOp<AggregateFunctionGroupBitmapXorOp>>(
|
||||
result_is_nullable, argument_types));
|
||||
}
|
||||
|
||||
AggregateFunctionPtr create_aggregate_function_bitmap_union_count(const std::string& name,
|
||||
@ -81,22 +76,19 @@ AggregateFunctionPtr create_aggregate_function_bitmap_union_int(const std::strin
|
||||
const bool arg_is_nullable = argument_types[0]->is_nullable();
|
||||
if (arg_is_nullable) {
|
||||
return std::shared_ptr<IAggregateFunction>(
|
||||
createWithIntDataType<true, AggregateFunctionBitmapCount>(argument_types));
|
||||
create_with_int_data_type<true, AggregateFunctionBitmapCount>(argument_types));
|
||||
} else {
|
||||
return std::shared_ptr<IAggregateFunction>(
|
||||
createWithIntDataType<false, AggregateFunctionBitmapCount>(argument_types));
|
||||
create_with_int_data_type<false, AggregateFunctionBitmapCount>(argument_types));
|
||||
}
|
||||
}
|
||||
|
||||
void register_aggregate_function_bitmap(AggregateFunctionSimpleFactory& factory) {
|
||||
factory.register_function("bitmap_union", create_aggregate_function_bitmap_union);
|
||||
factory.register_function("bitmap_intersect", create_aggregate_function_bitmap_intersect);
|
||||
factory.register_function("group_bitmap_xor", create_aggregate_function_group_bitmap_xor);
|
||||
factory.register_function("bitmap_union_count", create_aggregate_function_bitmap_union_count);
|
||||
factory.register_function("bitmap_union_count", create_aggregate_function_bitmap_union_count,
|
||||
true);
|
||||
|
||||
factory.register_function("bitmap_union_int", create_aggregate_function_bitmap_union_int);
|
||||
factory.register_function("bitmap_union_int", create_aggregate_function_bitmap_union_int, true);
|
||||
factory.register_function_both("bitmap_union", create_aggregate_function_bitmap_union);
|
||||
factory.register_function_both("bitmap_intersect", create_aggregate_function_bitmap_intersect);
|
||||
factory.register_function_both("group_bitmap_xor", create_aggregate_function_group_bitmap_xor);
|
||||
factory.register_function_both("bitmap_union_count",
|
||||
create_aggregate_function_bitmap_union_count);
|
||||
factory.register_function_both("bitmap_union_int", create_aggregate_function_bitmap_union_int);
|
||||
}
|
||||
} // namespace doris::vectorized
|
||||
Reference in New Issue
Block a user