diff options
author | zverevgeny <zverevgeny@yandex-team.com> | 2023-06-30 13:16:40 +0300 |
---|---|---|
committer | zverevgeny <zverevgeny@yandex-team.com> | 2023-06-30 13:16:40 +0300 |
commit | f5e2b02714d0b963adb9b8729fba513d0d71fdc0 (patch) | |
tree | 81a156974cbd25af889a79d0a9e5fe9f4dcecb6d | |
parent | 94e9dfa9f438035e679983171e79340ea85a7f2d (diff) | |
download | ydb-f5e2b02714d0b963adb9b8729fba513d0d71fdc0.tar.gz |
YQL-16017 named args for inputs
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 |