123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496 |
- #include "mkql_computation_node_ut.h"
- #include <yql/essentials/minikql/mkql_node_cast.h>
- #include <yql/essentials/minikql/mkql_string_util.h>
- namespace NKikimr {
- namespace NMiniKQL {
- Y_UNIT_TEST_SUITE(TMiniKQLCondenseNodeTest) {
- Y_UNIT_TEST_LLVM(TestSqueeze) {
- TSetup<LLVM> setup;
- TProgramBuilder& pb = *setup.PgmBuilder;
- const auto dataType = pb.NewOptionalType(pb.NewDataType(NUdf::TDataType<double>::Id));
- const auto data1 = pb.NewOptional(pb.NewDataLiteral<double>(3.8));
- const auto data2 = pb.NewOptional(pb.NewDataLiteral<double>(-53.2));
- const auto data3 = pb.NewOptional(pb.NewDataLiteral<double>(233.8));
- const auto data4 = pb.NewEmptyOptionalDataLiteral(NUdf::TDataType<double>::Id);
- const auto data0 = pb.NewOptional(pb.NewDataLiteral<double>(HUGE_VAL));
- const auto list = pb.NewList(dataType, {data4, data3, data2, data1});
- const auto pgmReturn = pb.Squeeze(pb.Iterator(list, {}), data0,
- [&](TRuntimeNode item, TRuntimeNode state) {
- return pb.AggrMin(item, state);
- }
- );
- const auto graph = setup.BuildGraph(pgmReturn);
- const auto iterator = graph->GetValue();
- NUdf::TUnboxedValue item;
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
- UNIT_ASSERT_VALUES_EQUAL(item.template Get<double>(), -53.2);
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
- }
- Y_UNIT_TEST_LLVM(TestSqueezeOnEmpty) {
- TSetup<LLVM> setup;
- TProgramBuilder& pb = *setup.PgmBuilder;
- const auto dataType = pb.NewOptionalType(pb.NewDataType(NUdf::TDataType<double>::Id));
- const auto data0 = pb.NewOptional(pb.NewDataLiteral<double>(HUGE_VAL));
- const auto list = pb.NewEmptyList(dataType);
- const auto pgmReturn = pb.Squeeze(pb.Iterator(list, {}), data0,
- [&](TRuntimeNode item, TRuntimeNode state) {
- return pb.AggrMin(item, state);
- }
- );
- const auto graph = setup.BuildGraph(pgmReturn);
- const auto iterator = graph->GetValue();
- NUdf::TUnboxedValue item;
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
- UNIT_ASSERT_VALUES_EQUAL(item.template Get<double>(), HUGE_VAL);
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
- }
- Y_UNIT_TEST_LLVM(TestSqueeze1OverEmpty) {
- TSetup<LLVM> setup;
- TProgramBuilder& pb = *setup.PgmBuilder;
- const auto dataType = pb.NewDataType(NUdf::TDataType<i32>::Id);
- const auto list = pb.NewEmptyList(dataType);
- const auto pgmReturn = pb.Squeeze1(pb.Iterator(list, {}),
- [&](TRuntimeNode item) {
- return pb.Minus(item);
- },
- [&](TRuntimeNode item, TRuntimeNode state) {
- return pb.Mul(item, state);
- }
- );
- const auto graph = setup.BuildGraph(pgmReturn);
- const auto iterator = graph->GetValue();
- NUdf::TUnboxedValue item;
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
- }
- Y_UNIT_TEST_LLVM(TestSqueeze1OverSingle) {
- TSetup<LLVM> setup;
- TProgramBuilder& pb = *setup.PgmBuilder;
- const auto dataType = pb.NewDataType(NUdf::TDataType<i32>::Id);
- const auto data1 = pb.NewDataLiteral<i32>(1);
- const auto list = pb.NewList(dataType, {data1});
- const auto pgmReturn = pb.Squeeze1(pb.Iterator(list, {}),
- [&](TRuntimeNode item) {
- return pb.Minus(item);
- },
- [&](TRuntimeNode item, TRuntimeNode state) {
- return pb.Mul(item, state);
- }
- );
- const auto graph = setup.BuildGraph(pgmReturn);
- const auto iterator = graph->GetValue();
- NUdf::TUnboxedValue item;
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
- UNIT_ASSERT_VALUES_EQUAL(item.template Get<i32>(), -1);
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
- }
- Y_UNIT_TEST_LLVM(TestSqueeze1OverMany) {
- TSetup<LLVM> setup;
- TProgramBuilder& pb = *setup.PgmBuilder;
- const auto dataType = pb.NewDataType(NUdf::TDataType<i32>::Id);
- const auto data1 = pb.NewDataLiteral<i32>(1);
- const auto data2 = pb.NewDataLiteral<i32>(2);
- const auto data3 = pb.NewDataLiteral<i32>(7);
- const auto list = pb.NewList(dataType, {data1, data2, data3});
- const auto pgmReturn = pb.Squeeze1(pb.Iterator(list, {}),
- [&](TRuntimeNode item) {
- return pb.Minus(item);
- },
- [&](TRuntimeNode item, TRuntimeNode state) {
- return pb.Mul(item, state);
- }
- );
- const auto graph = setup.BuildGraph(pgmReturn);
- const auto iterator = graph->GetValue();
- NUdf::TUnboxedValue item;
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
- UNIT_ASSERT_VALUES_EQUAL(item.template Get<i32>(), -14);
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
- }
- Y_UNIT_TEST_LLVM(TestCondense) {
- TSetup<LLVM> setup;
- TProgramBuilder& pb = *setup.PgmBuilder;
- const auto dataType = pb.NewOptionalType(pb.NewDataType(NUdf::TDataType<double>::Id));
- const auto data0 = pb.NewOptional(pb.NewDataLiteral<double>(0.0));
- const auto data1 = pb.NewOptional(pb.NewDataLiteral<double>(3.8));
- const auto data2 = pb.NewEmptyOptionalDataLiteral(NUdf::TDataType<double>::Id);
- const auto data3 = pb.NewOptional(pb.NewDataLiteral<double>(-53.2));
- const auto data4 = pb.NewOptional(pb.NewDataLiteral<double>(233.8));
- const auto data5 = pb.NewOptional(pb.NewDataLiteral<double>(3.14));
- const auto data6 = pb.NewOptional(pb.NewDataLiteral<double>(-73.12));
- const auto data7 = pb.NewEmptyOptionalDataLiteral(NUdf::TDataType<double>::Id);
- const auto data8 = pb.NewOptional(pb.NewDataLiteral<double>(233.8));
- const auto data9 = pb.NewOptional(pb.NewDataLiteral<double>(1221.8));
- const auto list = pb.NewList(dataType, {data0, data1, data2, data3, data4, data5, data6, data7, data8, data9});
- const auto pgmReturn = pb.Condense(pb.Iterator(list, {}), data0,
- [&](TRuntimeNode item, TRuntimeNode state) {
- return pb.Or({pb.Not(pb.Exists(item)), pb.Less(state, data0)});
- },
- [&](TRuntimeNode item, TRuntimeNode state) {
- return pb.AggrAdd(item, state);
- }
- );
- const auto graph = setup.BuildGraph(pgmReturn);
- const auto iterator = graph->GetValue();
- NUdf::TUnboxedValue item;
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
- UNIT_ASSERT_VALUES_EQUAL(item.template Get<double>(), 3.8);
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
- UNIT_ASSERT_VALUES_EQUAL(item.template Get<double>(), -53.2);
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
- UNIT_ASSERT_VALUES_EQUAL(item.template Get<double>(), 163.82);
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
- UNIT_ASSERT_VALUES_EQUAL(item.template Get<double>(), 1455.6);
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
- }
- Y_UNIT_TEST_LLVM(TestCondense1) {
- TSetup<LLVM> setup;
- TProgramBuilder& pb = *setup.PgmBuilder;
- const auto dataType = pb.NewDataType(NUdf::TDataType<i32>::Id);
- const auto data0 = pb.NewDataLiteral<i32>(-1);
- const auto data1 = pb.NewDataLiteral<i32>(2);
- const auto data2 = pb.NewDataLiteral<i32>(0);
- const auto data3 = pb.NewDataLiteral<i32>(7);
- const auto data4 = pb.NewDataLiteral<i32>(5);
- const auto data5 = pb.NewDataLiteral<i32>(-7);
- const auto data6 = pb.NewDataLiteral<i32>(-6);
- const auto data7 = pb.NewDataLiteral<i32>(4);
- const auto data8 = pb.NewDataLiteral<i32>(8);
- const auto data9 = pb.NewDataLiteral<i32>(9);
- const auto list = pb.NewList(dataType, {data0, data1, data2, data3, data4, data5, data6, data7, data8, data9});
- const auto pgmReturn = pb.Condense1(pb.Iterator(list, {}),
- [&](TRuntimeNode item) {
- return pb.Minus(item);
- },
- [&](TRuntimeNode item, TRuntimeNode state) {
- return pb.LessOrEqual(item, state);
- },
- [&](TRuntimeNode item, TRuntimeNode state) {
- return pb.Mul(item, state);
- }
- );
- const auto graph = setup.BuildGraph(pgmReturn);
- const auto iterator = graph->GetValue();
- NUdf::TUnboxedValue item;
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
- UNIT_ASSERT_VALUES_EQUAL(item.template Get<i32>(), 2);
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
- UNIT_ASSERT_VALUES_EQUAL(item.template Get<i32>(), 0);
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
- UNIT_ASSERT_VALUES_EQUAL(item.template Get<i32>(), 7);
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
- UNIT_ASSERT_VALUES_EQUAL(item.template Get<i32>(), 6);
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
- UNIT_ASSERT_VALUES_EQUAL(item.template Get<i32>(), -288);
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
- }
- Y_UNIT_TEST_LLVM(TestCondenseOverList) {
- TSetup<LLVM> setup;
- TProgramBuilder& pb = *setup.PgmBuilder;
- const auto dataType = pb.NewOptionalType(pb.NewDataType(NUdf::TDataType<double>::Id));
- const auto data0 = pb.NewOptional(pb.NewDataLiteral<double>(0.0));
- const auto data1 = pb.NewOptional(pb.NewDataLiteral<double>(3.8));
- const auto data2 = pb.NewEmptyOptionalDataLiteral(NUdf::TDataType<double>::Id);
- const auto data3 = pb.NewOptional(pb.NewDataLiteral<double>(-53.2));
- const auto data4 = pb.NewOptional(pb.NewDataLiteral<double>(233.8));
- const auto data5 = pb.NewOptional(pb.NewDataLiteral<double>(3.14));
- const auto data6 = pb.NewOptional(pb.NewDataLiteral<double>(-73.12));
- const auto data7 = pb.NewEmptyOptionalDataLiteral(NUdf::TDataType<double>::Id);
- const auto data8 = pb.NewOptional(pb.NewDataLiteral<double>(233.8));
- const auto data9 = pb.NewOptional(pb.NewDataLiteral<double>(1221.8));
- const auto list = pb.NewList(dataType, {data0, data1, data2, data3, data4, data5, data6, data7, data8, data9});
- const auto pgmReturn = pb.Condense(list, data0,
- [&](TRuntimeNode item, TRuntimeNode state) {
- return pb.Or({pb.Not(pb.Exists(item)), pb.Less(state, data0)});
- },
- [&](TRuntimeNode item, TRuntimeNode state) {
- return pb.AggrAdd(item, state);
- }
- );
- const auto graph = setup.BuildGraph(pgmReturn);
- const auto iterator = graph->GetValue().GetListIterator();
- NUdf::TUnboxedValue item;
- UNIT_ASSERT(iterator.Next(item));
- UNIT_ASSERT_VALUES_EQUAL(item.template Get<double>(), 3.8);
- UNIT_ASSERT(iterator.Next(item));
- UNIT_ASSERT_VALUES_EQUAL(item.template Get<double>(), -53.2);
- UNIT_ASSERT(iterator.Next(item));
- UNIT_ASSERT_VALUES_EQUAL(item.template Get<double>(), 163.82);
- UNIT_ASSERT(iterator.Next(item));
- UNIT_ASSERT_VALUES_EQUAL(item.template Get<double>(), 1455.6);
- UNIT_ASSERT(!iterator.Next(item));
- UNIT_ASSERT(!iterator.Next(item));
- }
- Y_UNIT_TEST_LLVM(TestCondense1OverList) {
- TSetup<LLVM> setup;
- TProgramBuilder& pb = *setup.PgmBuilder;
- const auto dataType = pb.NewDataType(NUdf::TDataType<i32>::Id);
- const auto data0 = pb.NewDataLiteral<i32>(-1);
- const auto data1 = pb.NewDataLiteral<i32>(2);
- const auto data2 = pb.NewDataLiteral<i32>(0);
- const auto data3 = pb.NewDataLiteral<i32>(7);
- const auto data4 = pb.NewDataLiteral<i32>(5);
- const auto data5 = pb.NewDataLiteral<i32>(-7);
- const auto data6 = pb.NewDataLiteral<i32>(-6);
- const auto data7 = pb.NewDataLiteral<i32>(4);
- const auto data8 = pb.NewDataLiteral<i32>(8);
- const auto data9 = pb.NewDataLiteral<i32>(9);
- const auto list = pb.NewList(dataType, {data0, data1, data2, data3, data4, data5, data6, data7, data8, data9});
- const auto pgmReturn = pb.Condense1(list,
- [&](TRuntimeNode item) {
- return pb.Minus(item);
- },
- [&](TRuntimeNode item, TRuntimeNode state) {
- return pb.LessOrEqual(item, state);
- },
- [&](TRuntimeNode item, TRuntimeNode state) {
- return pb.Mul(item, state);
- }
- );
- const auto graph = setup.BuildGraph(pgmReturn);
- const auto iterator = graph->GetValue().GetListIterator();
- NUdf::TUnboxedValue item;
- UNIT_ASSERT(iterator.Next(item));
- UNIT_ASSERT_VALUES_EQUAL(item.template Get<i32>(), 2);
- UNIT_ASSERT(iterator.Next(item));
- UNIT_ASSERT_VALUES_EQUAL(item.template Get<i32>(), 0);
- UNIT_ASSERT(iterator.Next(item));
- UNIT_ASSERT_VALUES_EQUAL(item.template Get<i32>(), 7);
- UNIT_ASSERT(iterator.Next(item));
- UNIT_ASSERT_VALUES_EQUAL(item.template Get<i32>(), 6);
- UNIT_ASSERT(iterator.Next(item));
- UNIT_ASSERT_VALUES_EQUAL(item.template Get<i32>(), -288);
- UNIT_ASSERT(!iterator.Next(item));
- UNIT_ASSERT(!iterator.Next(item));
- }
- Y_UNIT_TEST_LLVM(TestCondenseInterrupt) {
- TSetup<LLVM> setup;
- TProgramBuilder& pb = *setup.PgmBuilder;
- const auto dataType = pb.NewOptionalType(pb.NewDataType(NUdf::TDataType<bool>::Id));
- const auto data0 = pb.NewOptional(pb.NewDataLiteral<bool>(false));
- const auto data1 = pb.NewOptional(pb.NewDataLiteral<bool>(false));
- const auto data2 = pb.NewOptional(pb.NewDataLiteral<bool>(false));
- const auto data3 = pb.NewOptional(pb.NewDataLiteral<bool>(false));
- const auto data4 = pb.NewOptional(pb.NewDataLiteral<bool>(true));
- const auto data5 = pb.NewEmptyOptionalDataLiteral(NUdf::TDataType<bool>::Id);
- const auto data6 = pb.NewEmptyOptionalDataLiteral(NUdf::TDataType<bool>::Id);
- const auto list = pb.NewList(dataType, {data0, data1, data2, data3, data4, data5, data6});
- const auto pgmReturn = pb.FromFlow(pb.Condense(pb.ToFlow(list), pb.NewDataLiteral<bool>(false),
- [&](TRuntimeNode, TRuntimeNode state) {
- return pb.If(state, pb.NewEmptyOptionalDataLiteral(NUdf::TDataType<bool>::Id), pb.NewDataLiteral<bool>(false));
- },
- [&](TRuntimeNode item, TRuntimeNode state) {
- return pb.Or({pb.Unwrap(item, pb.NewDataLiteral<NUdf::EDataSlot::String>(""), "", 0, 0), state});
- }
- ));
- const auto graph = setup.BuildGraph(pgmReturn);
- const auto iterator = graph->GetValue();
- NUdf::TUnboxedValue item;
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
- UNIT_ASSERT(item.template Get<bool>());
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
- }
- Y_UNIT_TEST_LLVM(TestCondense1Interrupt) {
- TSetup<LLVM> setup;
- TProgramBuilder& pb = *setup.PgmBuilder;
- const auto dataType = pb.NewOptionalType(pb.NewDataType(NUdf::TDataType<bool>::Id));
- const auto data0 = pb.NewOptional(pb.NewDataLiteral<bool>(true));
- const auto data1 = pb.NewOptional(pb.NewDataLiteral<bool>(true));
- const auto data2 = pb.NewOptional(pb.NewDataLiteral<bool>(true));
- const auto data3 = pb.NewOptional(pb.NewDataLiteral<bool>(true));
- const auto data4 = pb.NewOptional(pb.NewDataLiteral<bool>(false));
- const auto data5 = pb.NewEmptyOptionalDataLiteral(NUdf::TDataType<bool>::Id);
- const auto data6 = pb.NewEmptyOptionalDataLiteral(NUdf::TDataType<bool>::Id);
- const auto list = pb.NewList(dataType, {data0, data1, data2, data3, data4, data5, data6});
- const auto pgmReturn = pb.FromFlow(pb.Condense1(pb.ToFlow(list),
- [&](TRuntimeNode item) {
- return pb.Unwrap(item, pb.NewDataLiteral<NUdf::EDataSlot::String>(""), "", 0, 0);
- },
- [&](TRuntimeNode, TRuntimeNode state) {
- return pb.If(state, pb.NewDataLiteral<bool>(false), pb.NewEmptyOptionalDataLiteral(NUdf::TDataType<bool>::Id));
- },
- [&](TRuntimeNode item, TRuntimeNode state) {
- return pb.And({pb.Unwrap(item, pb.NewDataLiteral<NUdf::EDataSlot::String>(""), "", 0, 0), state});
- }
- ));
- const auto graph = setup.BuildGraph(pgmReturn);
- const auto iterator = graph->GetValue();
- NUdf::TUnboxedValue item;
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
- UNIT_ASSERT(!item.template Get<bool>());
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
- }
- Y_UNIT_TEST_LLVM(TestCondenseInterruptEndlessStream) {
- TSetup<LLVM> setup;
- TProgramBuilder& pb = *setup.PgmBuilder;
- const auto pgmReturn = pb.Condense(pb.SourceOf(pb.NewStreamType(pb.NewNull().GetStaticType())), pb.NewDataLiteral<ui32>(0U),
- [&](TRuntimeNode, TRuntimeNode state) {
- return pb.If(pb.AggrLess(state, pb.NewDataLiteral<ui32>(123456U)), pb.NewDataLiteral<bool>(false), pb.NewEmptyOptionalDataLiteral(NUdf::TDataType<bool>::Id));
- },
- [&](TRuntimeNode, TRuntimeNode state) {
- return pb.AggrAdd(pb.NewDataLiteral<ui32>(1U), state);
- }
- );
- const auto graph = setup.BuildGraph(pgmReturn);
- const auto iterator = graph->GetValue();
- NUdf::TUnboxedValue item;
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
- UNIT_ASSERT_VALUES_EQUAL(item.template Get<ui32>(), 123456U);
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
- }
- Y_UNIT_TEST_LLVM(TestCondense1InterruptEndlessFlow) {
- TSetup<LLVM> setup;
- TProgramBuilder& pb = *setup.PgmBuilder;
- const auto pgmReturn = pb.FromFlow(pb.Condense1(pb.SourceOf(pb.NewFlowType(pb.NewNull().GetStaticType())),
- [&](TRuntimeNode) {
- return pb.NewDataLiteral<ui32>(0U);
- },
- [&](TRuntimeNode, TRuntimeNode state) {
- return pb.If(pb.AggrLess(state, pb.NewDataLiteral<ui32>(123456U)), pb.NewDataLiteral<bool>(false), pb.NewEmptyOptionalDataLiteral(NUdf::TDataType<bool>::Id));
- },
- [&](TRuntimeNode, TRuntimeNode state) {
- return pb.AggrAdd(pb.NewDataLiteral<ui32>(1U), state);
- }
- ));
- const auto graph = setup.BuildGraph(pgmReturn);
- const auto iterator = graph->GetValue();
- NUdf::TUnboxedValue item;
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
- UNIT_ASSERT_VALUES_EQUAL(item.template Get<ui32>(), 123456U);
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
- UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
- }
- Y_UNIT_TEST_LLVM(TestCondenseListeralListInMap) {
- TSetup<LLVM> setup;
- TProgramBuilder& pb = *setup.PgmBuilder;
- const auto data0 = pb.NewDataLiteral<NUdf::EDataSlot::String>("other");
- const auto data1 = pb.NewDataLiteral<NUdf::EDataSlot::String>("foo");
- const auto data2 = pb.NewDataLiteral<NUdf::EDataSlot::String>("bar");
- const auto type = pb.NewDataType(NUdf::EDataSlot::String);
- const auto list2 = pb.NewList(type, {data1, data2});
- const auto list0 = pb.NewList(type, {data1, data2, data0});
- const auto pgmReturn = pb.Map(list0,
- [&](TRuntimeNode item) {
- return pb.Head(pb.Condense(list2,
- pb.NewDataLiteral(false),
- [&](TRuntimeNode, TRuntimeNode) { return pb.NewDataLiteral(false); },
- [&](TRuntimeNode it, TRuntimeNode state) { return pb.Or({state, pb.AggrEquals(item, it)}); }
- ));
- });
- const auto graph = setup.BuildGraph(pgmReturn);
- const auto iterator = graph->GetValue().GetListIterator();
- NUdf::TUnboxedValue item;
- UNIT_ASSERT(iterator.Next(item));
- UNIT_ASSERT(item.Get<bool>());
- UNIT_ASSERT(iterator.Next(item));
- UNIT_ASSERT(item.Get<bool>());
- UNIT_ASSERT(iterator.Next(item));
- UNIT_ASSERT(!item.Get<bool>());
- UNIT_ASSERT(!iterator.Next(item));
- UNIT_ASSERT(!iterator.Next(item));
- }
- Y_UNIT_TEST_LLVM(TestCondense1ListeralListInMap) {
- TSetup<LLVM> setup;
- TProgramBuilder& pb = *setup.PgmBuilder;
- const auto data0 = pb.NewDataLiteral<NUdf::EDataSlot::String>("other");
- const auto data1 = pb.NewDataLiteral<NUdf::EDataSlot::String>("foo");
- const auto data2 = pb.NewDataLiteral<NUdf::EDataSlot::String>("bar");
- const auto type = pb.NewDataType(NUdf::EDataSlot::String);
- const auto list2 = pb.NewList(type, {data1, data2});
- const auto list0 = pb.NewList(type, {data1, data2, data0});
- const auto pgmReturn = pb.Map(list0,
- [&](TRuntimeNode item) {
- return pb.Head(pb.Condense1(list2,
- [&](TRuntimeNode it) { return pb.AggrEquals(item, it); },
- [&](TRuntimeNode, TRuntimeNode) { return pb.NewDataLiteral(false); },
- [&](TRuntimeNode it, TRuntimeNode state) { return pb.Or({state, pb.AggrEquals(item, it)}); }
- ));
- });
- const auto graph = setup.BuildGraph(pgmReturn);
- const auto iterator = graph->GetValue().GetListIterator();
- NUdf::TUnboxedValue item;
- UNIT_ASSERT(iterator.Next(item));
- UNIT_ASSERT(item.Get<bool>());
- UNIT_ASSERT(iterator.Next(item));
- UNIT_ASSERT(item.Get<bool>());
- UNIT_ASSERT(iterator.Next(item));
- UNIT_ASSERT(!item.Get<bool>());
- UNIT_ASSERT(!iterator.Next(item));
- UNIT_ASSERT(!iterator.Next(item));
- }
- }
- }
- }
|