This is an automated email from the ASF dual-hosted git repository. lihaopeng pushed a commit to branch vectorized in repository https://gitbox.apache.org/repos/asf/incubator-doris.git
commit cc451e7126235327872f1d043ce41d09460fbd79 Author: Pxl <952130...@qq.com> AuthorDate: Fri Jan 7 15:04:55 2022 +0800 [Vectorized][Feature] support money_format/ucase/character_length (#7649) --- be/src/vec/functions/function_string.cpp | 12 +++- be/src/vec/functions/function_string.h | 110 +++++++++++++++++++++++++++++- gensrc/script/doris_builtins_functions.py | 8 +-- 3 files changed, 120 insertions(+), 10 deletions(-) diff --git a/be/src/vec/functions/function_string.cpp b/be/src/vec/functions/function_string.cpp index 34f1c6b..bdeb7e5 100644 --- a/be/src/vec/functions/function_string.cpp +++ b/be/src/vec/functions/function_string.cpp @@ -272,7 +272,7 @@ struct HexStringName { struct HexStringImpl { static DataTypes get_variadic_argument_types() { - return {std::make_shared<vectorized::DataTypeString>()}; + return {std::make_shared<DataTypeString>()}; } static Status vector(const ColumnString::Chars& data, const ColumnString::Offsets& offsets, @@ -774,8 +774,8 @@ void register_function_string(SimpleFunctionFactory& factory) { factory.register_function<FunctionLTrim>(); factory.register_function<FunctionRTrim>(); factory.register_function<FunctionTrim>(); - factory.register_function<FunctionSubstring<Substr3Imp>>(); - factory.register_function<FunctionSubstring<Substr2Imp>>(); + factory.register_function<FunctionSubstring<Substr3Impl>>(); + factory.register_function<FunctionSubstring<Substr2Impl>>(); factory.register_function<FunctionLeft>(); factory.register_function<FunctionRight>(); factory.register_function<FunctionNullOrEmpty>(); @@ -792,12 +792,18 @@ void register_function_string(SimpleFunctionFactory& factory) { factory.register_function<FunctionSplitPart>(); factory.register_function<FunctionStringMd5sum>(); factory.register_function<FunctionStringParseUrl>(); + factory.register_function<FunctionMoneyFormat<MoneyFormatDoubleImpl>>(); + factory.register_function<FunctionMoneyFormat<MoneyFormatInt64Impl>>(); + factory.register_function<FunctionMoneyFormat<MoneyFormatInt128Impl>>(); + factory.register_function<FunctionMoneyFormat<MoneyFormatDecimalImpl>>(); factory.register_alias(FunctionLeft::name, "strleft"); factory.register_alias(FunctionRight::name, "strright"); factory.register_alias(SubstringUtil::name, "substr"); factory.register_alias(FunctionToLower::name, "lcase"); + factory.register_alias(FunctionToUpper::name, "ucase"); factory.register_alias(FunctionStringMd5sum::name, "md5"); + factory.register_alias(FunctionStringUTF8Length::name, "character_length"); } } // namespace doris::vectorized diff --git a/be/src/vec/functions/function_string.h b/be/src/vec/functions/function_string.h index 3f3e538..af58062 100644 --- a/be/src/vec/functions/function_string.h +++ b/be/src/vec/functions/function_string.h @@ -24,9 +24,12 @@ #include <string_view> #include "exprs/anyval_util.h" +#include "exprs/math_functions.h" +#include "exprs/string_functions.h" #include "runtime/string_value.hpp" #include "util/md5.h" #include "util/url_parser.h" +#include "vec/columns/column_decimal.h" #include "vec/columns/column_nullable.h" #include "vec/columns/column_string.h" #include "vec/columns/columns_number.h" @@ -211,7 +214,7 @@ public: } }; -struct Substr3Imp { +struct Substr3Impl { static DataTypes get_variadic_argument_types() { return {std::make_shared<DataTypeString>(), std::make_shared<DataTypeInt32>(), std::make_shared<DataTypeInt32>()}; @@ -225,7 +228,7 @@ struct Substr3Imp { } }; -struct Substr2Imp { +struct Substr2Impl { static DataTypes get_variadic_argument_types() { return {std::make_shared<DataTypeString>(), std::make_shared<DataTypeInt32>()}; } @@ -558,7 +561,7 @@ public: } return Status::OK(); } -}; // namespace doris::vectorized +}; class FunctionStringRepeat : public IFunction { public: @@ -1038,4 +1041,105 @@ public: } }; +template <typename Impl> +class FunctionMoneyFormat : public IFunction { +public: + static constexpr auto name = "money_format"; + static FunctionPtr create() { return std::make_shared<FunctionMoneyFormat<Impl>>(); } + String get_name() const override { return name; } + + DataTypePtr get_return_type_impl(const DataTypes& arguments) const override { + return std::make_shared<DataTypeString>(); + } + DataTypes get_variadic_argument_types_impl() const override { + return Impl::get_variadic_argument_types(); + } + size_t get_number_of_arguments() const override { return 1; } + + bool use_default_implementation_for_constants() const override { return true; } + + Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments, + size_t result, size_t input_rows_count) override { + auto res_column = ColumnString::create(); + ColumnPtr argument_column = block.get_by_position(arguments[0]).column; + + auto result_column = assert_cast<ColumnString*>(res_column.get()); + auto data_column = assert_cast<const typename Impl::ColumnType*>(argument_column.get()); + + Impl::execute(context, result_column, data_column, input_rows_count); + + block.replace_by_position(result, std::move(res_column)); + return Status::OK(); + } +}; + +struct MoneyFormatDoubleImpl { + using ColumnType = ColumnVector<Float64>; + + static DataTypes get_variadic_argument_types() { return {std::make_shared<DataTypeFloat64>()}; } + + static void execute(FunctionContext* context, ColumnString* result_column, + const ColumnType* data_column, size_t input_rows_count) { + for (size_t i = 0; i < input_rows_count; i++) { + double value = + MathFunctions::my_double_round(data_column->get_element(i), 2, false, false); + StringVal str = StringFunctions::do_money_format(context, fmt::format("{:.2f}", value)); + result_column->insert_data(reinterpret_cast<const char*>(str.ptr), str.len); + } + } +}; + +struct MoneyFormatInt64Impl { + using ColumnType = ColumnVector<Int64>; + + static DataTypes get_variadic_argument_types() { return {std::make_shared<DataTypeInt64>()}; } + + static void execute(FunctionContext* context, ColumnString* result_column, + const ColumnType* data_column, size_t input_rows_count) { + for (size_t i = 0; i < input_rows_count; i++) { + Int64 value = data_column->get_element(i); + StringVal str = StringFunctions::do_money_format<Int64, 26>(context, value); + result_column->insert_data(reinterpret_cast<const char*>(str.ptr), str.len); + } + } +}; + +struct MoneyFormatInt128Impl { + using ColumnType = ColumnVector<Int128>; + + static DataTypes get_variadic_argument_types() { return {std::make_shared<DataTypeInt128>()}; } + + static void execute(FunctionContext* context, ColumnString* result_column, + const ColumnType* data_column, size_t input_rows_count) { + for (size_t i = 0; i < input_rows_count; i++) { + Int128 value = data_column->get_element(i); + StringVal str = StringFunctions::do_money_format<Int128, 52>(context, value); + result_column->insert_data(reinterpret_cast<const char*>(str.ptr), str.len); + } + } +}; + +struct MoneyFormatDecimalImpl { + using ColumnType = ColumnDecimal<Decimal128>; + + static DataTypes get_variadic_argument_types() { + return {std::make_shared<DataTypeDecimal<Decimal128>>(27, 9)}; + } + + static void execute(FunctionContext* context, ColumnString* result_column, + const ColumnType* data_column, size_t input_rows_count) { + for (size_t i = 0; i < input_rows_count; i++) { + DecimalV2Val value = DecimalV2Val(data_column->get_element(i)); + + DecimalV2Value rounded(0); + DecimalV2Value::from_decimal_val(value).round(&rounded, 2, HALF_UP); + + StringVal str = StringFunctions::do_money_format<int64_t, 26>( + context, rounded.int_value(), abs(rounded.frac_value() / 10000000)); + + result_column->insert_data(reinterpret_cast<const char*>(str.ptr), str.len); + } + } +}; + } // namespace doris::vectorized \ No newline at end of file diff --git a/gensrc/script/doris_builtins_functions.py b/gensrc/script/doris_builtins_functions.py index 5d96751..2fe936a 100755 --- a/gensrc/script/doris_builtins_functions.py +++ b/gensrc/script/doris_builtins_functions.py @@ -933,16 +933,16 @@ visible_functions = [ '15FunctionContextENS2_18FunctionStateScopeE', 'vec', 'ALWAYS_NULLABLE'], [['money_format'], 'VARCHAR', ['BIGINT'], '_ZN5doris15StringFunctions12money_formatEPN9doris_udf15FunctionContextERKNS1_9BigIntValE', - '', '', '', ''], + '', '', 'vec', ''], [['money_format'], 'VARCHAR', ['LARGEINT'], '_ZN5doris15StringFunctions12money_formatEPN9doris_udf15FunctionContextERKNS1_11LargeIntValE', - '', '', '', ''], + '', '', 'vec', ''], [['money_format'], 'VARCHAR', ['DOUBLE'], '_ZN5doris15StringFunctions12money_formatEPN9doris_udf15FunctionContextERKNS1_9DoubleValE', - '', '', '', ''], + '', '', 'vec', ''], [['money_format'], 'VARCHAR', ['DECIMALV2'], '_ZN5doris15StringFunctions12money_formatEPN9doris_udf15FunctionContextERKNS1_12DecimalV2ValE', - '', '', '', ''], + '', '', 'vec', ''], [['split_part'], 'VARCHAR', ['VARCHAR', 'VARCHAR', 'INT'], '_ZN5doris15StringFunctions10split_partEPN9doris_udf15FunctionContextERKNS1_9StringValES6_RKNS1_6IntValE', '', '', 'vec', 'ALWAYS_NULLABLE'], --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org