#include "mkql_computation_node_ut.h" #include namespace NKikimr { namespace NMiniKQL { #if !defined(MKQL_RUNTIME_VERSION) || MKQL_RUNTIME_VERSION >= 18u Y_UNIT_TEST_SUITE(TMiniKQLWideNodesTest) { // TDOD: fixme #if 0 Y_UNIT_TEST_LLVM(TestWideDiscard) { TSetup setup; TProgramBuilder& pb = *setup.PgmBuilder; const auto data0 = pb.NewDataLiteral("000"); const auto data1 = pb.NewDataLiteral("100"); const auto data2 = pb.NewDataLiteral("200"); const auto data3 = pb.NewDataLiteral("300"); const auto dataType = pb.NewDataType(NUdf::TDataType::Id); const auto list = pb.NewList(dataType, {data0, data1, data2, data3}); const auto pgmReturn = pb.FromFlow(pb.Discard(pb.ExpandMap(pb.ToFlow(list), [](TRuntimeNode) { return TRuntimeNode::TList(); }))); 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)); } #endif Y_UNIT_TEST_LLVM(TestDiscard) { TSetup setup; TProgramBuilder& pb = *setup.PgmBuilder; const auto data0 = pb.NewDataLiteral("000"); const auto data1 = pb.NewDataLiteral("100"); const auto data2 = pb.NewDataLiteral("200"); const auto data3 = pb.NewDataLiteral("300"); const auto dataType = pb.NewDataType(NUdf::TDataType::Id); const auto list = pb.NewList(dataType, {data0, data1, data2, data3}); const auto pgmReturn = pb.FromFlow(pb.Discard(pb.ToFlow(list))); 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(TestTakeOverSource) { TSetup setup; TProgramBuilder& pb = *setup.PgmBuilder; const auto pgmReturn = pb.Collect(pb.NarrowMap(pb.Take(pb.Source(), pb.NewDataLiteral(666ULL)), [&](TRuntimeNode::TList) { return pb.NewTuple({}); } )); const auto graph = setup.BuildGraph(pgmReturn); UNIT_ASSERT_VALUES_EQUAL(graph->GetValue().GetListLength(), 666ULL); } Y_UNIT_TEST_LLVM(TestSkipAndTake) { TSetup setup; TProgramBuilder& pb = *setup.PgmBuilder; const auto list = pb.ListFromRange(pb.NewDataLiteral(100U), pb.NewDataLiteral(666U), pb.NewDataLiteral(3U)); const auto pgmReturn = pb.Collect(pb.NarrowMap(pb.Take(pb.Skip(pb.ExpandMap(pb.ToFlow(pb.Enumerate(list)), [&](TRuntimeNode item) -> TRuntimeNode::TList { return {pb.Nth(item, 1U), pb.Nth(item, 0U)}; }), pb.NewDataLiteral(42ULL)), pb.NewDataLiteral(4ULL)), [&](TRuntimeNode::TList items) -> TRuntimeNode { return pb.NewTuple({items.back(), items.front()}); } )); 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.GetElement(0).template Get(), 42); UNIT_ASSERT_VALUES_EQUAL(item.GetElement(1).template Get(), 226); UNIT_ASSERT(iterator.Next(item)); UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).template Get(), 43); UNIT_ASSERT_VALUES_EQUAL(item.GetElement(1).template Get(), 229); UNIT_ASSERT(iterator.Next(item)); UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).template Get(), 44); UNIT_ASSERT_VALUES_EQUAL(item.GetElement(1).template Get(), 232); UNIT_ASSERT(iterator.Next(item)); UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).template Get(), 45); UNIT_ASSERT_VALUES_EQUAL(item.GetElement(1).template Get(), 235); UNIT_ASSERT(!iterator.Next(item)); UNIT_ASSERT(!iterator.Next(item)); } Y_UNIT_TEST_LLVM(TestDoNotCalculateSkipped) { TSetup setup; TProgramBuilder& pb = *setup.PgmBuilder; const auto list = pb.ListFromRange(pb.NewDataLiteral(100ULL), pb.NewDataLiteral(135ULL), pb.NewDataLiteral(5ULL)); const auto trap = pb.NewDataLiteral("IT'S A TRAP!"); const auto pgmReturn = pb.Collect(pb.NarrowMap(pb.Skip(pb.WideMap(pb.ExpandMap(pb.ToFlow(pb.Enumerate(list)), [&](TRuntimeNode item) -> TRuntimeNode::TList { return {pb.Nth(item, 1U), pb.Nth(item, 0U)}; }), [&](TRuntimeNode::TList items) -> TRuntimeNode::TList { return {pb.Unwrap(pb.Div(items.front(), items.back()), trap, __FILE__, __LINE__, 0)}; }), pb.NewDataLiteral(3ULL)), [&](TRuntimeNode::TList items) -> TRuntimeNode { return items.front(); } )); 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(), 38ULL); UNIT_ASSERT(iterator.Next(item)); UNIT_ASSERT_VALUES_EQUAL(item.template Get(), 30ULL); UNIT_ASSERT(iterator.Next(item)); UNIT_ASSERT_VALUES_EQUAL(item.template Get(), 25ULL); UNIT_ASSERT(iterator.Next(item)); UNIT_ASSERT_VALUES_EQUAL(item.template Get(), 21ULL); UNIT_ASSERT(!iterator.Next(item)); UNIT_ASSERT(!iterator.Next(item)); } } #endif } }