mkql_mapnext_ut.cpp 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. #include "mkql_computation_node_ut.h"
  2. #include <yql/essentials/minikql/mkql_runtime_version.h>
  3. namespace NKikimr {
  4. namespace NMiniKQL {
  5. Y_UNIT_TEST_SUITE(TMiniKQLMapNextTest) {
  6. Y_UNIT_TEST_LLVM(OverStream) {
  7. TSetup<LLVM> setup;
  8. TProgramBuilder& pb = *setup.PgmBuilder;
  9. const auto data1 = pb.NewDataLiteral<ui16>(10);
  10. const auto data2 = pb.NewDataLiteral<ui16>(20);
  11. const auto data3 = pb.NewDataLiteral<ui16>(30);
  12. const auto dataType = pb.NewDataType(NUdf::TDataType<ui16>::Id);
  13. const auto optDataType = pb.NewOptionalType(dataType);
  14. const auto tupleType = pb.NewTupleType({dataType, optDataType});
  15. const auto list = pb.NewList(dataType, {data1, data2, data3});
  16. const auto pgmReturn = pb.MapNext(pb.Iterator(list, {}),
  17. [&](TRuntimeNode item, TRuntimeNode nextItem) {
  18. return pb.NewTuple(tupleType, {item, nextItem});
  19. });
  20. const auto graph = setup.BuildGraph(pgmReturn);
  21. const auto iterator = graph->GetValue();
  22. NUdf::TUnboxedValue item;
  23. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  24. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).template Get<ui16>(), 10);
  25. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(1).template Get<ui16>(), 20);
  26. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  27. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).template Get<ui16>(), 20);
  28. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(1).template Get<ui16>(), 30);
  29. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  30. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).template Get<ui16>(), 30);
  31. UNIT_ASSERT(!item.GetElement(1).HasValue());
  32. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
  33. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
  34. }
  35. Y_UNIT_TEST_LLVM(OverSingleElementStream) {
  36. TSetup<LLVM> setup;
  37. TProgramBuilder& pb = *setup.PgmBuilder;
  38. const auto data1 = pb.NewDataLiteral<ui16>(10);
  39. const auto dataType = pb.NewDataType(NUdf::TDataType<ui16>::Id);
  40. const auto optDataType = pb.NewOptionalType(dataType);
  41. const auto tupleType = pb.NewTupleType({dataType, optDataType});
  42. const auto list = pb.NewList(dataType, {data1});
  43. const auto pgmReturn = pb.MapNext(pb.Iterator(list, {}),
  44. [&](TRuntimeNode item, TRuntimeNode nextItem) {
  45. return pb.NewTuple(tupleType, {item, nextItem});
  46. });
  47. const auto graph = setup.BuildGraph(pgmReturn);
  48. const auto iterator = graph->GetValue();
  49. NUdf::TUnboxedValue item;
  50. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  51. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).template Get<ui16>(), 10);
  52. UNIT_ASSERT(!item.GetElement(1).HasValue());
  53. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
  54. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
  55. }
  56. Y_UNIT_TEST_LLVM(OverEmptyStream) {
  57. TSetup<LLVM> setup;
  58. TProgramBuilder& pb = *setup.PgmBuilder;
  59. const auto dataType = pb.NewDataType(NUdf::TDataType<ui16>::Id);
  60. const auto optDataType = pb.NewOptionalType(dataType);
  61. const auto tupleType = pb.NewTupleType({dataType, optDataType});
  62. const auto list = pb.NewList(dataType, {});
  63. const auto pgmReturn = pb.MapNext(pb.Iterator(list, {}),
  64. [&](TRuntimeNode item, TRuntimeNode nextItem) {
  65. return pb.NewTuple(tupleType, {item, nextItem});
  66. });
  67. const auto graph = setup.BuildGraph(pgmReturn);
  68. const auto iterator = graph->GetValue();
  69. NUdf::TUnboxedValue item;
  70. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
  71. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
  72. }
  73. Y_UNIT_TEST_LLVM(OverFlow) {
  74. TSetup<LLVM> setup;
  75. TProgramBuilder& pb = *setup.PgmBuilder;
  76. const auto data1 = pb.NewDataLiteral<ui16>(10);
  77. const auto data2 = pb.NewDataLiteral<ui16>(20);
  78. const auto data3 = pb.NewDataLiteral<ui16>(30);
  79. const auto dataType = pb.NewDataType(NUdf::TDataType<ui16>::Id);
  80. const auto optDataType = pb.NewOptionalType(dataType);
  81. const auto tupleType = pb.NewTupleType({dataType, optDataType});
  82. const auto list = pb.NewList(dataType, {data1, data2, data3});
  83. const auto pgmReturn = pb.FromFlow(pb.MapNext(pb.ToFlow(pb.Iterator(list, {})),
  84. [&](TRuntimeNode item, TRuntimeNode nextItem) {
  85. return pb.NewTuple(tupleType, {item, nextItem});
  86. }));
  87. const auto graph = setup.BuildGraph(pgmReturn);
  88. const auto iterator = graph->GetValue();
  89. NUdf::TUnboxedValue item;
  90. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  91. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).template Get<ui16>(), 10);
  92. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(1).template Get<ui16>(), 20);
  93. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  94. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).template Get<ui16>(), 20);
  95. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(1).template Get<ui16>(), 30);
  96. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  97. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).template Get<ui16>(), 30);
  98. UNIT_ASSERT(!item.GetElement(1).HasValue());
  99. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
  100. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
  101. }
  102. Y_UNIT_TEST_LLVM(OverSingleElementFlow) {
  103. TSetup<LLVM> setup;
  104. TProgramBuilder& pb = *setup.PgmBuilder;
  105. const auto data1 = pb.NewDataLiteral<ui16>(10);
  106. const auto dataType = pb.NewDataType(NUdf::TDataType<ui16>::Id);
  107. const auto optDataType = pb.NewOptionalType(dataType);
  108. const auto tupleType = pb.NewTupleType({dataType, optDataType});
  109. const auto list = pb.NewList(dataType, {data1});
  110. const auto pgmReturn = pb.FromFlow(pb.MapNext(pb.ToFlow(pb.Iterator(list, {})),
  111. [&](TRuntimeNode item, TRuntimeNode nextItem) {
  112. return pb.NewTuple(tupleType, {item, nextItem});
  113. }));
  114. const auto graph = setup.BuildGraph(pgmReturn);
  115. const auto iterator = graph->GetValue();
  116. NUdf::TUnboxedValue item;
  117. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  118. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).template Get<ui16>(), 10);
  119. UNIT_ASSERT(!item.GetElement(1).HasValue());
  120. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
  121. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
  122. }
  123. Y_UNIT_TEST_LLVM(OverEmptyFlow) {
  124. TSetup<LLVM> setup;
  125. TProgramBuilder& pb = *setup.PgmBuilder;
  126. const auto dataType = pb.NewDataType(NUdf::TDataType<ui16>::Id);
  127. const auto optDataType = pb.NewOptionalType(dataType);
  128. const auto tupleType = pb.NewTupleType({dataType, optDataType});
  129. const auto list = pb.NewList(dataType, {});
  130. const auto pgmReturn = pb.FromFlow(pb.MapNext(pb.ToFlow(pb.Iterator(list, {})),
  131. [&](TRuntimeNode item, TRuntimeNode nextItem) {
  132. return pb.NewTuple(tupleType, {item, nextItem});
  133. }));
  134. const auto graph = setup.BuildGraph(pgmReturn);
  135. const auto iterator = graph->GetValue();
  136. NUdf::TUnboxedValue item;
  137. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
  138. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
  139. }
  140. }
  141. }
  142. }