Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

#include <glog/logging.h>

#include "core/call_on_type_index.h"
#include "core/data_type/define_primitive_type.h"
#include "core/data_type/primitive_type.h"
#include "exprs/aggregate/aggregate_function.h"
Expand All @@ -35,81 +36,26 @@ inline AggregateFunctionPtr create_aggregate_function_group_array_impl(
const AggregateFunctionAttr& attr) {
const auto& nested_type = remove_nullable(
assert_cast<const DataTypeArray&>(*(argument_types[0])).get_nested_type());
auto pt = nested_type->get_primitive_type();

switch (nested_type->get_primitive_type()) {
case doris::PrimitiveType::TYPE_BOOLEAN:
return creator_without_type::create<
AggregateFunctionGroupArraySetOp<ImplNumericData<TYPE_BOOLEAN>>>(
argument_types, result_is_nullable, attr);
case PrimitiveType::TYPE_TINYINT:
return creator_without_type::create<
AggregateFunctionGroupArraySetOp<ImplNumericData<TYPE_TINYINT>>>(
argument_types, result_is_nullable, attr);
case PrimitiveType::TYPE_SMALLINT:
return creator_without_type::create<
AggregateFunctionGroupArraySetOp<ImplNumericData<TYPE_SMALLINT>>>(
argument_types, result_is_nullable, attr);
case PrimitiveType::TYPE_INT:
return creator_without_type::create<
AggregateFunctionGroupArraySetOp<ImplNumericData<TYPE_INT>>>(
argument_types, result_is_nullable, attr);
case PrimitiveType::TYPE_BIGINT:
return creator_without_type::create<
AggregateFunctionGroupArraySetOp<ImplNumericData<TYPE_BIGINT>>>(
argument_types, result_is_nullable, attr);
case PrimitiveType::TYPE_LARGEINT:
return creator_without_type::create<
AggregateFunctionGroupArraySetOp<ImplNumericData<TYPE_LARGEINT>>>(
argument_types, result_is_nullable, attr);
case PrimitiveType::TYPE_DATEV2:
return creator_without_type::create<
AggregateFunctionGroupArraySetOp<ImplNumericData<TYPE_DATEV2>>>(
argument_types, result_is_nullable, attr);
case PrimitiveType::TYPE_DATETIMEV2:
return creator_without_type::create<
AggregateFunctionGroupArraySetOp<ImplNumericData<TYPE_DATETIMEV2>>>(
argument_types, result_is_nullable, attr);
case PrimitiveType::TYPE_DOUBLE:
return creator_without_type::create<
AggregateFunctionGroupArraySetOp<ImplNumericData<TYPE_DOUBLE>>>(
argument_types, result_is_nullable, attr);
case PrimitiveType::TYPE_FLOAT:
return creator_without_type::create<
AggregateFunctionGroupArraySetOp<ImplNumericData<TYPE_FLOAT>>>(
argument_types, result_is_nullable, attr);
case PrimitiveType::TYPE_DECIMAL32:
return creator_without_type::create<
AggregateFunctionGroupArraySetOp<ImplNumericData<TYPE_DECIMAL32>>>(
argument_types, result_is_nullable, attr);
case PrimitiveType::TYPE_DECIMAL64:
return creator_without_type::create<
AggregateFunctionGroupArraySetOp<ImplNumericData<TYPE_DECIMAL64>>>(
argument_types, result_is_nullable, attr);
case PrimitiveType::TYPE_DECIMAL128I:
return creator_without_type::create<
AggregateFunctionGroupArraySetOp<ImplNumericData<TYPE_DECIMAL128I>>>(
argument_types, result_is_nullable, attr);
case PrimitiveType::TYPE_DECIMAL256:
return creator_without_type::create<
AggregateFunctionGroupArraySetOp<ImplNumericData<TYPE_DECIMAL256>>>(
argument_types, result_is_nullable, attr);
case PrimitiveType::TYPE_IPV4:
return creator_without_type::create<
AggregateFunctionGroupArraySetOp<ImplNumericData<TYPE_IPV4>>>(
argument_types, result_is_nullable, attr);
case PrimitiveType::TYPE_IPV6:
return creator_without_type::create<
AggregateFunctionGroupArraySetOp<ImplNumericData<TYPE_IPV6>>>(
argument_types, result_is_nullable, attr);
case PrimitiveType::TYPE_STRING:
case PrimitiveType::TYPE_VARCHAR:
case PrimitiveType::TYPE_CHAR:
AggregateFunctionPtr result;
auto call = [&](const auto& dispatch_type) -> bool {
using DispatchType = std::decay_t<decltype(dispatch_type)>;
constexpr auto PT = DispatchType::PType;
result =
creator_without_type::create<AggregateFunctionGroupArraySetOp<ImplNumericData<PT>>>(
argument_types, result_is_nullable, attr);
return true;
};
if (dispatch_switch_scalar(pt, call)) {
return result;
}
if (is_string_type(pt)) {
return creator_without_type::create<AggregateFunctionGroupArraySetOp<ImplStringData>>(
argument_types, result_is_nullable, attr);
default:
LOG(WARNING) << " got invalid of nested type: " << nested_type->get_name();
return nullptr;
}
LOG(WARNING) << " got invalid of nested type: " << nested_type->get_name();
return nullptr;
}

} // namespace doris
Expand Down
2 changes: 1 addition & 1 deletion be/src/exprs/aggregate/aggregate_function_histogram.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ AggregateFunctionPtr create_aggregate_function_histogram(const std::string& name
creator_with_type_list<TYPE_BOOLEAN, TYPE_TINYINT, TYPE_SMALLINT, TYPE_INT, TYPE_BIGINT,
TYPE_LARGEINT, TYPE_FLOAT, TYPE_DOUBLE, TYPE_DECIMAL32,
TYPE_DECIMAL64, TYPE_DECIMAL128I, TYPE_DECIMAL256, TYPE_VARCHAR,
TYPE_DATEV2, TYPE_DATETIMEV2>;
TYPE_DATEV2, TYPE_DATETIMEV2, TYPE_TIMESTAMPTZ>;
if (argument_types.size() == 2) {
return creator::create<HistogramWithInputParam, AggregateFunctionHistogramData>(
argument_types, result_is_nullable, attr);
Expand Down
1 change: 1 addition & 0 deletions be/src/exprs/aggregate/aggregate_function_map_v2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ AggregateFunctionPtr create_aggregate_function_map_agg_v2(const std::string& nam
case PrimitiveType::TYPE_DATEV2:
case PrimitiveType::TYPE_DATETIMEV2:
case PrimitiveType::TYPE_TIMEV2:
case PrimitiveType::TYPE_TIMESTAMPTZ:
return create_agg_function_map_agg_v2(argument_types, result_is_nullable, attr);
default:
LOG(WARNING) << fmt::format("unsupported input type {} for aggregate function {}",
Expand Down
66 changes: 31 additions & 35 deletions be/src/exprs/aggregate/aggregate_function_min_max_by.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,52 +17,39 @@

#include "exprs/aggregate/aggregate_function_min_max_by.h"

#include "core/call_on_type_index.h"
#include "core/data_type/primitive_type.h"
#include "exprs/aggregate/aggregate_function_simple_factory.h"

namespace doris {
#include "common/compile_check_begin.h"
std::unique_ptr<MaxMinValueBase> create_max_min_value(const DataTypePtr& type) {
std::unique_ptr<MaxMinValueBase> create_max_min_value(const DataTypePtr& type, int be_version) {
std::unique_ptr<MaxMinValueBase> result;
auto call = [&](const auto& dispatch_type) -> bool {
using DispatchType = std::decay_t<decltype(dispatch_type)>;
constexpr auto PT = DispatchType::PType;
if constexpr (is_decimal(PT)) {
result = std::make_unique<MaxMinValue<SingleValueDataDecimal<PT>>>();
} else {
result = std::make_unique<MaxMinValue<SingleValueDataFixed<PT>>>();
}
return true;
};
if (dispatch_switch_scalar(type->get_primitive_type(), call)) {
return result;
}
switch (type->get_primitive_type()) {
case PrimitiveType::TYPE_BOOLEAN:
return std::make_unique<MaxMinValue<SingleValueDataFixed<TYPE_BOOLEAN>>>();
case PrimitiveType::TYPE_TINYINT:
return std::make_unique<MaxMinValue<SingleValueDataFixed<TYPE_TINYINT>>>();
case PrimitiveType::TYPE_SMALLINT:
return std::make_unique<MaxMinValue<SingleValueDataFixed<TYPE_SMALLINT>>>();
case PrimitiveType::TYPE_INT:
return std::make_unique<MaxMinValue<SingleValueDataFixed<TYPE_INT>>>();
case PrimitiveType::TYPE_BIGINT:
return std::make_unique<MaxMinValue<SingleValueDataFixed<TYPE_BIGINT>>>();
case PrimitiveType::TYPE_LARGEINT:
return std::make_unique<MaxMinValue<SingleValueDataFixed<TYPE_LARGEINT>>>();
case PrimitiveType::TYPE_FLOAT:
return std::make_unique<MaxMinValue<SingleValueDataFixed<TYPE_FLOAT>>>();
case PrimitiveType::TYPE_DOUBLE:
return std::make_unique<MaxMinValue<SingleValueDataFixed<TYPE_DOUBLE>>>();
case PrimitiveType::TYPE_DECIMAL32:
return std::make_unique<MaxMinValue<SingleValueDataDecimal<TYPE_DECIMAL32>>>();
case PrimitiveType::TYPE_DECIMAL64:
return std::make_unique<MaxMinValue<SingleValueDataDecimal<TYPE_DECIMAL64>>>();
case PrimitiveType::TYPE_DECIMAL128I:
return std::make_unique<MaxMinValue<SingleValueDataDecimal<TYPE_DECIMAL128I>>>();
case PrimitiveType::TYPE_DECIMALV2:
return std::make_unique<MaxMinValue<SingleValueDataDecimal<TYPE_DECIMALV2>>>();
case PrimitiveType::TYPE_DECIMAL256:
return std::make_unique<MaxMinValue<SingleValueDataDecimal<TYPE_DECIMAL256>>>();
case PrimitiveType::TYPE_STRING:
case PrimitiveType::TYPE_CHAR:
case PrimitiveType::TYPE_VARCHAR:
return std::make_unique<MaxMinValue<SingleValueDataString>>();
case PrimitiveType::TYPE_DATE:
return std::make_unique<MaxMinValue<SingleValueDataFixed<TYPE_DATE>>>();
case PrimitiveType::TYPE_DATETIME:
return std::make_unique<MaxMinValue<SingleValueDataFixed<TYPE_DATETIME>>>();
case PrimitiveType::TYPE_DATEV2:
return std::make_unique<MaxMinValue<SingleValueDataFixed<TYPE_DATEV2>>>();
case PrimitiveType::TYPE_DATETIMEV2:
return std::make_unique<MaxMinValue<SingleValueDataFixed<TYPE_DATETIMEV2>>>();
case PrimitiveType::TYPE_BITMAP:
return std::make_unique<MaxMinValue<BitmapValueData>>();
case PrimitiveType::TYPE_ARRAY:
case PrimitiveType::TYPE_MAP:
case PrimitiveType::TYPE_STRUCT:
return std::make_unique<MaxMinValue<SingleValueDataComplexType>>(DataTypes {type},
be_version);
default:
throw doris::Exception(ErrorCode::INTERNAL_ERROR,
"Illegal type {} of argument of aggregate function min/max_by",
Expand All @@ -71,6 +58,15 @@ std::unique_ptr<MaxMinValueBase> create_max_min_value(const DataTypePtr& type) {
}
}

void register_aggregate_function_max_min_by(AggregateFunctionSimpleFactory& factory) {
factory.register_function_both(
"min_by", create_aggregate_function_min_max_by<AggregateFunctionsMinMaxBy,
AggregateFunctionMinByData>);
factory.register_function_both(
"max_by", create_aggregate_function_min_max_by<AggregateFunctionsMinMaxBy,
AggregateFunctionMaxByData>);
}

} // namespace doris

#include "common/compile_check_end.h"
Loading
Loading