From b931832ccbfa1d08d641dfe3b5f28687f5aac162 Mon Sep 17 00:00:00 2001 From: vvvv <vvvv@yandex-team.com> Date: Fri, 24 Jan 2025 16:13:52 +0300 Subject: DynamicVariant YQL-19499 commit_hash:b609442fce4217e33f5d5421582e4a145afde95d --- yql/essentials/minikql/mkql_program_builder.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'yql/essentials/minikql/mkql_program_builder.cpp') diff --git a/yql/essentials/minikql/mkql_program_builder.cpp b/yql/essentials/minikql/mkql_program_builder.cpp index 320566c496..7b0322bfb4 100644 --- a/yql/essentials/minikql/mkql_program_builder.cpp +++ b/yql/essentials/minikql/mkql_program_builder.cpp @@ -3447,6 +3447,25 @@ TRuntimeNode TProgramBuilder::VariantItem(TRuntimeNode variant) { return TRuntimeNode(callableBuilder.Build(), false); } +TRuntimeNode TProgramBuilder::DynamicVariant(TRuntimeNode item, TRuntimeNode index, TType* variantType) { + if constexpr (RuntimeVersion < 56U) { + THROW yexception() << "Runtime version (" << RuntimeVersion << ") too old for " << __func__; + } + + auto type = AS_TYPE(TVariantType, variantType); + auto expectedIndexSlot = type->GetUnderlyingType()->IsTuple() ? NUdf::EDataSlot::Uint32 : NUdf::EDataSlot::Utf8; + auto indexType = AS_TYPE(TDataType, index.GetStaticType()); + MKQL_ENSURE(indexType->GetDataSlot() == expectedIndexSlot, "Mismatch type of index"); + + auto resType = TOptionalType::Create(type, Env); + + TCallableBuilder callableBuilder(Env, __func__, resType); + callableBuilder.Add(item); + callableBuilder.Add(index); + callableBuilder.Add(TRuntimeNode(variantType, true)); + return TRuntimeNode(callableBuilder.Build(), false); +} + TRuntimeNode TProgramBuilder::VisitAll(TRuntimeNode variant, std::function<TRuntimeNode(ui32, TRuntimeNode)> handler) { const auto type = AS_TYPE(TVariantType, variant); std::vector<TRuntimeNode> items; -- cgit v1.2.3