aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraneporada <aneporada@ydb.tech>2023-01-06 09:23:03 +0300
committeraneporada <aneporada@ydb.tech>2023-01-06 09:23:03 +0300
commit3cc14e8259c8f4e7023ea7cf5ecc45fa3f94815d (patch)
treea069be078a5265d293860980a70635baed864324
parent935916bda3969ae8aaea170129ec0db8a8392270 (diff)
downloadydb-3cc14e8259c8f4e7023ea7cf5ecc45fa3f94815d.tar.gz
Support StartsWith/EndsWith/StringContains arrow kernels
-rw-r--r--ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp5
-rw-r--r--ydb/library/yql/minikql/invoke_builtins/mkql_builtins.cpp1
-rw-r--r--ydb/library/yql/minikql/invoke_builtins/mkql_builtins_string_kernels.cpp68
-rw-r--r--ydb/library/yql/minikql/invoke_builtins/mkql_builtins_string_kernels.h5
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);
}
}