diff options
author | aneporada <aneporada@ydb.tech> | 2023-01-06 09:23:03 +0300 |
---|---|---|
committer | aneporada <aneporada@ydb.tech> | 2023-01-06 09:23:03 +0300 |
commit | 3cc14e8259c8f4e7023ea7cf5ecc45fa3f94815d (patch) | |
tree | a069be078a5265d293860980a70635baed864324 | |
parent | 935916bda3969ae8aaea170129ec0db8a8392270 (diff) | |
download | ydb-3cc14e8259c8f4e7023ea7cf5ecc45fa3f94815d.tar.gz |
Support StartsWith/EndsWith/StringContains arrow kernels
4 files changed, 78 insertions, 1 deletions
diff --git a/ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp b/ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp index db7aedc5857..d6cf42c96c1 100644 --- a/ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp +++ b/ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp @@ -4654,8 +4654,11 @@ struct TBlockRules { {">", { "Greater" } }, {">=", { "GreaterOrEqual" } }, - // size kernel + // string kernels {"Size", { "Size" } }, + {"StartsWith", { "StartsWith" } }, + {"EndsWith", { "EndsWith" } }, + {"StringContains", { "StringContains" } }, }; TBlockRules() diff --git a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins.cpp b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins.cpp index 7a651a660c8..8bca6fdc39b 100644 --- a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins.cpp +++ b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins.cpp @@ -109,6 +109,7 @@ void RegisterDefaultOperations(IBuiltinFunctionRegistry& registry, TKernelFamily RegisterSubstring(registry); RegisterFind(registry); RegisterWith(registry); + RegisterWith(kernelFamilyMap); RegisterInversePresortString(registry); RegisterInverseString(registry); RegisterNanvl(registry); diff --git a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_string_kernels.cpp b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_string_kernels.cpp index 1cf606ab3d2..a291f463eb8 100644 --- a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_string_kernels.cpp +++ b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_string_kernels.cpp @@ -246,6 +246,48 @@ struct TStrGreaterOrEqualOp { } }; +struct TStrStartsWithOp { + static inline bool Do(std::string_view left, std::string_view right) { + return left.starts_with(right); + } + + static inline bool DoWithEmptyLeft(size_t rightLen) { + return rightLen == 0; + } + + static constexpr bool DoWithEmptyRight() { + return true; + } +}; + +struct TStrEndsWithOp { + static inline bool Do(std::string_view left, std::string_view right) { + return left.ends_with(right); + } + + static inline bool DoWithEmptyLeft(size_t rightLen) { + return rightLen == 0; + } + + static constexpr bool DoWithEmptyRight() { + return true; + } +}; + +struct TStrContainsOp { + static inline bool Do(std::string_view left, std::string_view right) { + return left.contains(right); + } + + static inline bool DoWithEmptyLeft(size_t rightLen) { + return rightLen == 0; + } + + static constexpr bool DoWithEmptyRight() { + return true; + } +}; + template<typename TInput1, typename TInput2, typename TOp> void AddCompareStringKernel(TKernelFamilyBase& kernelFamily) { // ui8 type is used as bool replacement @@ -325,6 +367,18 @@ void RegisterStringKernelSize(TKernelFamilyBase& kernelFamily) { AddSizeStringKernel<NUdf::TUtf8>(kernelFamily); } +void RegisterStringKernelStartsWith(TKernelFamilyBase& kernelFamily) { + AddCompareStringKernels<TStrStartsWithOp>(kernelFamily); +} + +void RegisterStringKernelEndsWith(TKernelFamilyBase& kernelFamily) { + AddCompareStringKernels<TStrEndsWithOp>(kernelFamily); +} + +void RegisterStringKernelContains(TKernelFamilyBase& kernelFamily) { + AddCompareStringKernels<TStrContainsOp>(kernelFamily); +} + void RegisterSizeBuiltin(TKernelFamilyMap& kernelFamilyMap) { auto family = std::make_unique<TKernelFamilyBase>(); @@ -333,5 +387,19 @@ void RegisterSizeBuiltin(TKernelFamilyMap& kernelFamilyMap) { kernelFamilyMap["Size"] = std::move(family); } +void RegisterWith(TKernelFamilyMap& kernelFamilyMap) { + auto family = std::make_unique<TKernelFamilyBase>(); + RegisterStringKernelStartsWith(*family); + kernelFamilyMap["StartsWith"] = std::move(family); + + family = std::make_unique<TKernelFamilyBase>(); + RegisterStringKernelEndsWith(*family); + kernelFamilyMap["EndsWith"] = std::move(family); + + family = std::make_unique<TKernelFamilyBase>(); + RegisterStringKernelContains(*family); + kernelFamilyMap["StringContains"] = std::move(family); +} + } } diff --git a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_string_kernels.h b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_string_kernels.h index 77a5db506ed..f17f51d757e 100644 --- a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_string_kernels.h +++ b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_string_kernels.h @@ -13,6 +13,11 @@ void RegisterStringKernelGreater(TKernelFamilyBase& kernelFamily); void RegisterStringKernelGreaterOrEqual(TKernelFamilyBase& kernelFamily); void RegisterStringKernelSize(TKernelFamilyBase& kernelFamily); +void RegisterStringKernelStartsWith(TKernelFamilyBase& kernelFamily); +void RegisterStringKernelEndsWith(TKernelFamilyBase& kernelFamily); +void RegisterStringKernelContains(TKernelFamilyBase& kernelFamily); + void RegisterSizeBuiltin(TKernelFamilyMap& kernelFamilyMap); +void RegisterWith(TKernelFamilyMap& kernelFamilyMap); } } |