summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorzverevgeny <[email protected]>2023-08-31 15:46:06 +0300
committerzverevgeny <[email protected]>2023-08-31 16:04:57 +0300
commit33d656d5e54a37961631b3a17c759ccd391bd94a (patch)
tree49ae266417ebe042aefa32c4caef234c5bc945e9
parent0e4d03424887d8d908796791a17b515fe6718f1e (diff)
YQL-16325 TupleLiteralBuilder
-rw-r--r--ydb/library/yql/minikql/mkql_node_builder.cpp24
-rw-r--r--ydb/library/yql/minikql/mkql_node_builder.h15
-rw-r--r--ydb/library/yql/minikql/mkql_node_builder_ut.cpp14
3 files changed, 53 insertions, 0 deletions
diff --git a/ydb/library/yql/minikql/mkql_node_builder.cpp b/ydb/library/yql/minikql/mkql_node_builder.cpp
index 920940aa96f..967e5bf0f53 100644
--- a/ydb/library/yql/minikql/mkql_node_builder.cpp
+++ b/ydb/library/yql/minikql/mkql_node_builder.cpp
@@ -106,6 +106,30 @@ TBlockType::EShape GetResultShape(const TVector<TType*>& types) {
return result;
}
+TTupleLiteralBuilder::TTupleLiteralBuilder(const TTypeEnvironment& env) : Env(env)
+{}
+
+void TTupleLiteralBuilder::Reserve(ui32 size) {
+ Types.reserve(size);
+ Values.reserve(size);
+}
+
+TTupleLiteralBuilder& TTupleLiteralBuilder::Add(TRuntimeNode value) {
+ Types.push_back(value.GetRuntimeType());
+ Values.push_back(value);
+ return *this;
+}
+
+TTupleLiteral* TTupleLiteralBuilder::Build() {
+ const auto& type = TTupleType::Create(Types.size(), Types.data(), Env);
+ return TTupleLiteral::Create(Values.size(), Values.data(), type, Env);
+}
+
+void TTupleLiteralBuilder::Clear() {
+ Values.clear();
+ Types.clear();
+}
+
TStructTypeBuilder::TStructTypeBuilder(const TTypeEnvironment& env)
: Env(&env)
{
diff --git a/ydb/library/yql/minikql/mkql_node_builder.h b/ydb/library/yql/minikql/mkql_node_builder.h
index b854d539e72..ae4ea9a8b83 100644
--- a/ydb/library/yql/minikql/mkql_node_builder.h
+++ b/ydb/library/yql/minikql/mkql_node_builder.h
@@ -25,6 +25,21 @@ TDataType* UnpackOptionalData(TType* type, bool& isOptional);
TBlockType::EShape GetResultShape(const TVector<TType*>& types);
+class TTupleLiteralBuilder {
+public:
+ TTupleLiteralBuilder(const TTypeEnvironment& env);
+ TTupleLiteralBuilder(const TTupleLiteralBuilder&) = default;
+ TTupleLiteralBuilder& operator=(const TTupleLiteralBuilder&) = default;
+ void Reserve(ui32 size);
+ TTupleLiteralBuilder& Add(TRuntimeNode value);
+ TTupleLiteral* Build();
+ void Clear();
+private:
+ const TTypeEnvironment& Env;
+ TVector<TType*> Types;
+ TVector<TRuntimeNode> Values;
+};
+
class TStructTypeBuilder {
public:
TStructTypeBuilder(const TTypeEnvironment& env);
diff --git a/ydb/library/yql/minikql/mkql_node_builder_ut.cpp b/ydb/library/yql/minikql/mkql_node_builder_ut.cpp
index fcf32448f40..3a8b229326c 100644
--- a/ydb/library/yql/minikql/mkql_node_builder_ut.cpp
+++ b/ydb/library/yql/minikql/mkql_node_builder_ut.cpp
@@ -16,6 +16,20 @@ Y_UNIT_TEST_SUITE(TMiniKQLNodeBuilderTest) {
UNIT_ASSERT_EQUAL(d2->GetType()->GetSchemeType(), NUdf::TDataType<ui32>::Id);
}
+ Y_UNIT_TEST(TestTupleBuilder) {
+ TScopedAlloc alloc(__LOCATION__);
+ TTypeEnvironment env(alloc);
+ auto builder = TTupleLiteralBuilder(env);
+ const auto tuple = builder
+ .Add(TRuntimeNode(BuildDataLiteral(NUdf::TUnboxedValuePod(true), NUdf::EDataSlot::Bool, env), true))
+ .Add(TRuntimeNode(BuildDataLiteral(NUdf::TUnboxedValuePod(132), NUdf::EDataSlot::Uint32, env), true))
+ .Build();
+ UNIT_ASSERT_EQUAL(tuple->GetType()->GetKind(), TType::EKind::Tuple);
+ UNIT_ASSERT_VALUES_EQUAL(tuple->GetValuesCount(), 2);
+ builder.Clear();
+ UNIT_ASSERT_VALUES_EQUAL(builder.Build()->GetValuesCount(), 0);
+ }
+
Y_UNIT_TEST(TestStructTypeBuilder) {
TScopedAlloc alloc(__LOCATION__);
TTypeEnvironment env(alloc);