aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorzverevgeny <zverevgeny@yandex-team.com>2023-06-30 13:16:40 +0300
committerzverevgeny <zverevgeny@yandex-team.com>2023-06-30 13:16:40 +0300
commitf5e2b02714d0b963adb9b8729fba513d0d71fdc0 (patch)
tree81a156974cbd25af889a79d0a9e5fe9f4dcecb6d
parent94e9dfa9f438035e679983171e79340ea85a7f2d (diff)
downloadydb-f5e2b02714d0b963adb9b8729fba513d0d71fdc0.tar.gz
YQL-16017 named args for inputs
-rw-r--r--ydb/library/yql/minikql/comp_nodes/mkql_addmember.cpp14
-rw-r--r--ydb/library/yql/minikql/comp_nodes/mkql_addmember.h2
-rw-r--r--ydb/library/yql/minikql/comp_nodes/mkql_factory.cpp10
-rw-r--r--ydb/library/yql/minikql/computation/mkql_computation_node.h15
4 files changed, 24 insertions, 17 deletions
diff --git a/ydb/library/yql/minikql/comp_nodes/mkql_addmember.cpp b/ydb/library/yql/minikql/comp_nodes/mkql_addmember.cpp
index 4dd232b742e..10205fd4469 100644
--- a/ydb/library/yql/minikql/comp_nodes/mkql_addmember.cpp
+++ b/ydb/library/yql/minikql/comp_nodes/mkql_addmember.cpp
@@ -146,13 +146,9 @@ private:
}
-IComputationNode* WrapAddMember(TCallable& callable, const TComputationNodeFactoryContext& ctx) {
- MKQL_ENSURE(callable.GetInputsCount() == 3, "Expected 3 args");
-
- const auto structType = AS_TYPE(TStructType, callable.GetInput(0));
- const auto indexData = AS_VALUE(TDataLiteral, callable.GetInput(2));
-
- const ui32 index = indexData->AsValue().Get<ui32>();
+IComputationNode* AddMember(const TComputationNodeFactoryContext& ctx, TRuntimeNode structData, TRuntimeNode memberData, TRuntimeNode indexData) {
+ const auto structType = AS_TYPE(TStructType, structData);
+ const ui32 index = AS_VALUE(TDataLiteral, indexData)->AsValue().Get<ui32>();
MKQL_ENSURE(index <= structType->GetMembersCount(), "Bad member index");
std::vector<EValueRepresentation> representations;
@@ -161,8 +157,8 @@ IComputationNode* WrapAddMember(TCallable& callable, const TComputationNodeFacto
representations.emplace_back(GetValueRepresentation(structType->GetMemberType(i)));
}
- const auto structObj = LocateNode(ctx.NodeLocator, callable, 0);
- const auto member = LocateNode(ctx.NodeLocator, callable, 1);
+ const auto structObj = LocateNode(ctx.NodeLocator, *structData.GetNode());
+ const auto member = LocateNode(ctx.NodeLocator, *memberData.GetNode());
return new TAddMemberWrapper(ctx.Mutables, structObj, member, index, std::move(representations));
}
diff --git a/ydb/library/yql/minikql/comp_nodes/mkql_addmember.h b/ydb/library/yql/minikql/comp_nodes/mkql_addmember.h
index e7c00ccd84f..9e276867f3b 100644
--- a/ydb/library/yql/minikql/comp_nodes/mkql_addmember.h
+++ b/ydb/library/yql/minikql/comp_nodes/mkql_addmember.h
@@ -4,7 +4,7 @@
namespace NKikimr {
namespace NMiniKQL {
-IComputationNode* WrapAddMember(TCallable& callable, const TComputationNodeFactoryContext& ctx);
+IComputationNode* AddMember(const TComputationNodeFactoryContext& ctx, TRuntimeNode structData, TRuntimeNode memberData, TRuntimeNode indexData);
}
}
diff --git a/ydb/library/yql/minikql/comp_nodes/mkql_factory.cpp b/ydb/library/yql/minikql/comp_nodes/mkql_factory.cpp
index baa887625e0..26905d3bf27 100644
--- a/ydb/library/yql/minikql/comp_nodes/mkql_factory.cpp
+++ b/ydb/library/yql/minikql/comp_nodes/mkql_factory.cpp
@@ -131,19 +131,15 @@ IComputationNode* WrapWideFlowArg(TCallable& callable, const TComputationNodeFac
return new TWideFlowProxyCodegeneratorNode;
}
-using TCallableComputationNodeBuilderPtr = IComputationNode* (*const)(TCallable& callable, const TComputationNodeFactoryContext& ctx);
-using TCallableComputationNodeBuilderMap = std::unordered_map<std::string_view, TCallableComputationNodeBuilderPtr>;
+using TCallableComputationNodeBuilderMap = std::unordered_map<std::string_view, TCallableComputationNodeBuilder>;
namespace {
struct TCallableComputationNodeBuilderFuncMapFiller {
- const TCallableComputationNodeBuilderMap Map;
-
TCallableComputationNodeBuilderFuncMapFiller()
- : Map(InitList)
{}
- static constexpr std::initializer_list<TCallableComputationNodeBuilderMap::value_type> InitList = {
+ const TCallableComputationNodeBuilderMap Map = {
{"Append", &WrapAppend},
{"Prepend", &WrapPrepend},
{"Extend", &WrapExtend},
@@ -170,7 +166,7 @@ struct TCallableComputationNodeBuilderFuncMapFiller {
{"SkipWhile", &WrapSkipWhile},
{"TakeWhileInclusive", &WrapTakeWhileInclusive},
{"SkipWhileInclusive", &WrapSkipWhileInclusive},
- {"AddMember", &WrapAddMember},
+ {"AddMember", WrapComputationBuilder(&AddMember)},
{"Member", &WrapMember},
{"RemoveMember", &WrapRemoveMember},
{"Exists", &WrapExists},
diff --git a/ydb/library/yql/minikql/computation/mkql_computation_node.h b/ydb/library/yql/minikql/computation/mkql_computation_node.h
index 8b9d49d5004..4fbb13a650b 100644
--- a/ydb/library/yql/minikql/computation/mkql_computation_node.h
+++ b/ydb/library/yql/minikql/computation/mkql_computation_node.h
@@ -418,5 +418,20 @@ IComputationPattern::TPtr MakeComputationPattern(
std::unique_ptr<NUdf::ISecureParamsProvider> MakeSimpleSecureParamsProvider(const THashMap<TString, TString>& secureParams);
+using TCallableComputationNodeBuilder = std::function<IComputationNode* (TCallable&, const TComputationNodeFactoryContext& ctx)>;
+
+template<typename... Ts>
+TCallableComputationNodeBuilder WrapComputationBuilder(IComputationNode* (*f)(const TComputationNodeFactoryContext&, Ts...)){
+ return [f](TCallable& callable, const TComputationNodeFactoryContext& ctx) {
+ MKQL_ENSURE(callable.GetInputsCount() == sizeof...(Ts), "Incorrect number of inputs");
+ return CallComputationBuilderWithArgs(f, callable, ctx, std::make_index_sequence<sizeof...(Ts)>());
+ };
+}
+template<typename F, size_t... Is>
+auto CallComputationBuilderWithArgs(F* f, TCallable& callable, const TComputationNodeFactoryContext& ctx,
+ const std::integer_sequence<size_t, Is...> &) {
+ return f(ctx, callable.GetInput(Is)...);
+}
+
} // namespace NMiniKQL
} // namespace NKikimr