mkql_wide_nodes_ut.cpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. #include "mkql_computation_node_ut.h"
  2. #include <yql/essentials/minikql/mkql_runtime_version.h>
  3. namespace NKikimr {
  4. namespace NMiniKQL {
  5. #if !defined(MKQL_RUNTIME_VERSION) || MKQL_RUNTIME_VERSION >= 18u
  6. Y_UNIT_TEST_SUITE(TMiniKQLWideNodesTest) {
  7. // TDOD: fixme
  8. #if 0
  9. Y_UNIT_TEST_LLVM(TestWideDiscard) {
  10. TSetup<LLVM> setup;
  11. TProgramBuilder& pb = *setup.PgmBuilder;
  12. const auto data0 = pb.NewDataLiteral<NUdf::EDataSlot::String>("000");
  13. const auto data1 = pb.NewDataLiteral<NUdf::EDataSlot::String>("100");
  14. const auto data2 = pb.NewDataLiteral<NUdf::EDataSlot::String>("200");
  15. const auto data3 = pb.NewDataLiteral<NUdf::EDataSlot::String>("300");
  16. const auto dataType = pb.NewDataType(NUdf::TDataType<char*>::Id);
  17. const auto list = pb.NewList(dataType, {data0, data1, data2, data3});
  18. const auto pgmReturn = pb.FromFlow(pb.Discard(pb.ExpandMap(pb.ToFlow(list), [](TRuntimeNode) { return TRuntimeNode::TList(); })));
  19. const auto graph = setup.BuildGraph(pgmReturn);
  20. const auto iterator = graph->GetValue();
  21. NUdf::TUnboxedValue item;
  22. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
  23. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
  24. }
  25. #endif
  26. Y_UNIT_TEST_LLVM(TestDiscard) {
  27. TSetup<LLVM> setup;
  28. TProgramBuilder& pb = *setup.PgmBuilder;
  29. const auto data0 = pb.NewDataLiteral<NUdf::EDataSlot::String>("000");
  30. const auto data1 = pb.NewDataLiteral<NUdf::EDataSlot::String>("100");
  31. const auto data2 = pb.NewDataLiteral<NUdf::EDataSlot::String>("200");
  32. const auto data3 = pb.NewDataLiteral<NUdf::EDataSlot::String>("300");
  33. const auto dataType = pb.NewDataType(NUdf::TDataType<char*>::Id);
  34. const auto list = pb.NewList(dataType, {data0, data1, data2, data3});
  35. const auto pgmReturn = pb.FromFlow(pb.Discard(pb.ToFlow(list)));
  36. const auto graph = setup.BuildGraph(pgmReturn);
  37. const auto iterator = graph->GetValue();
  38. NUdf::TUnboxedValue item;
  39. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
  40. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
  41. }
  42. Y_UNIT_TEST_LLVM(TestTakeOverSource) {
  43. TSetup<LLVM> setup;
  44. TProgramBuilder& pb = *setup.PgmBuilder;
  45. const auto pgmReturn = pb.Collect(pb.NarrowMap(pb.Take(pb.Source(), pb.NewDataLiteral<ui64>(666ULL)), [&](TRuntimeNode::TList) { return pb.NewTuple({}); } ));
  46. const auto graph = setup.BuildGraph(pgmReturn);
  47. UNIT_ASSERT_VALUES_EQUAL(graph->GetValue().GetListLength(), 666ULL);
  48. }
  49. Y_UNIT_TEST_LLVM(TestSkipAndTake) {
  50. TSetup<LLVM> setup;
  51. TProgramBuilder& pb = *setup.PgmBuilder;
  52. const auto list = pb.ListFromRange(pb.NewDataLiteral<ui32>(100U), pb.NewDataLiteral<ui32>(666U), pb.NewDataLiteral<ui32>(3U));
  53. const auto pgmReturn = pb.Collect(pb.NarrowMap(pb.Take(pb.Skip(pb.ExpandMap(pb.ToFlow(pb.Enumerate(list)),
  54. [&](TRuntimeNode item) -> TRuntimeNode::TList { return {pb.Nth(item, 1U), pb.Nth(item, 0U)}; }),
  55. pb.NewDataLiteral<ui64>(42ULL)), pb.NewDataLiteral<ui64>(4ULL)),
  56. [&](TRuntimeNode::TList items) -> TRuntimeNode { return pb.NewTuple({items.back(), items.front()}); }
  57. ));
  58. const auto graph = setup.BuildGraph(pgmReturn);
  59. const auto iterator = graph->GetValue().GetListIterator();
  60. NUdf::TUnboxedValue item;
  61. UNIT_ASSERT(iterator.Next(item));
  62. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).template Get<ui64>(), 42);
  63. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(1).template Get<ui32>(), 226);
  64. UNIT_ASSERT(iterator.Next(item));
  65. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).template Get<ui64>(), 43);
  66. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(1).template Get<ui32>(), 229);
  67. UNIT_ASSERT(iterator.Next(item));
  68. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).template Get<ui64>(), 44);
  69. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(1).template Get<ui32>(), 232);
  70. UNIT_ASSERT(iterator.Next(item));
  71. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).template Get<ui64>(), 45);
  72. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(1).template Get<ui32>(), 235);
  73. UNIT_ASSERT(!iterator.Next(item));
  74. UNIT_ASSERT(!iterator.Next(item));
  75. }
  76. Y_UNIT_TEST_LLVM(TestDoNotCalculateSkipped) {
  77. TSetup<LLVM> setup;
  78. TProgramBuilder& pb = *setup.PgmBuilder;
  79. const auto list = pb.ListFromRange(pb.NewDataLiteral<ui64>(100ULL), pb.NewDataLiteral<ui64>(135ULL), pb.NewDataLiteral<ui64>(5ULL));
  80. const auto trap = pb.NewDataLiteral<NUdf::EDataSlot::String>("IT'S A TRAP!");
  81. const auto pgmReturn = pb.Collect(pb.NarrowMap(pb.Skip(pb.WideMap(pb.ExpandMap(pb.ToFlow(pb.Enumerate(list)),
  82. [&](TRuntimeNode item) -> TRuntimeNode::TList { return {pb.Nth(item, 1U), pb.Nth(item, 0U)}; }),
  83. [&](TRuntimeNode::TList items) -> TRuntimeNode::TList { return {pb.Unwrap(pb.Div(items.front(), items.back()), trap, __FILE__, __LINE__, 0)}; }),
  84. pb.NewDataLiteral<ui64>(3ULL)),
  85. [&](TRuntimeNode::TList items) -> TRuntimeNode { return items.front(); }
  86. ));
  87. const auto graph = setup.BuildGraph(pgmReturn);
  88. const auto iterator = graph->GetValue().GetListIterator();
  89. NUdf::TUnboxedValue item;
  90. UNIT_ASSERT(iterator.Next(item));
  91. UNIT_ASSERT_VALUES_EQUAL(item.template Get<ui64>(), 38ULL);
  92. UNIT_ASSERT(iterator.Next(item));
  93. UNIT_ASSERT_VALUES_EQUAL(item.template Get<ui64>(), 30ULL);
  94. UNIT_ASSERT(iterator.Next(item));
  95. UNIT_ASSERT_VALUES_EQUAL(item.template Get<ui64>(), 25ULL);
  96. UNIT_ASSERT(iterator.Next(item));
  97. UNIT_ASSERT_VALUES_EQUAL(item.template Get<ui64>(), 21ULL);
  98. UNIT_ASSERT(!iterator.Next(item));
  99. UNIT_ASSERT(!iterator.Next(item));
  100. }
  101. }
  102. #endif
  103. }
  104. }