diff options
author | vvvv <vvvv@yandex-team.com> | 2025-01-24 16:13:52 +0300 |
---|---|---|
committer | vvvv <vvvv@yandex-team.com> | 2025-01-24 16:30:59 +0300 |
commit | b931832ccbfa1d08d641dfe3b5f28687f5aac162 (patch) | |
tree | 3140696ec6fec1bcc10b7224481d31d91dd1098c /yql/essentials/minikql/mkql_program_builder.cpp | |
parent | b6545608166d359be492bb14ea1c8bd539b85f6d (diff) | |
download | ydb-b931832ccbfa1d08d641dfe3b5f28687f5aac162.tar.gz |
DynamicVariant YQL-19499
commit_hash:b609442fce4217e33f5d5421582e4a145afde95d
Diffstat (limited to 'yql/essentials/minikql/mkql_program_builder.cpp')
-rw-r--r-- | yql/essentials/minikql/mkql_program_builder.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
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; |