mkql_chain_map_ut.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. #include "mkql_computation_node_ut.h"
  2. #include <yql/essentials/minikql/mkql_node_cast.h>
  3. #include <yql/essentials/minikql/mkql_string_util.h>
  4. namespace NKikimr {
  5. namespace NMiniKQL {
  6. Y_UNIT_TEST_SUITE(TMiniKQLChainMapNodeTest) {
  7. Y_UNIT_TEST_LLVM(TestOverList) {
  8. TSetup<LLVM> setup;
  9. TProgramBuilder& pb = *setup.PgmBuilder;
  10. auto dataType = pb.NewOptionalType(pb.NewTupleType({pb.NewDataType(NUdf::TDataType<i32>::Id), pb.NewDataType(NUdf::TDataType<char*>::Id)}));
  11. auto data0 = pb.NewEmptyOptional(dataType);
  12. auto data2 = pb.NewOptional(pb.NewTuple({
  13. pb.NewDataLiteral<i32>(7),
  14. pb.NewDataLiteral<NUdf::EDataSlot::String>("A")
  15. }));
  16. auto data3 = pb.NewOptional(pb.NewTuple({
  17. pb.NewDataLiteral<i32>(1),
  18. pb.NewDataLiteral<NUdf::EDataSlot::String>("D")
  19. }));
  20. auto list = pb.NewList(dataType, {data2, data0, data3});
  21. auto init = pb.NewTuple({
  22. pb.NewOptional(pb.NewDataLiteral<i32>(3)),
  23. pb.NewOptional(pb.NewDataLiteral<NUdf::EDataSlot::String>("B"))
  24. });
  25. auto pgmReturn = pb.ChainMap(list, init,
  26. [&](TRuntimeNode item, TRuntimeNode state) -> TRuntimeNodePair {
  27. auto key = pb.Nth(item, 0);
  28. auto val = pb.Nth(item, 1);
  29. auto skey = pb.AggrAdd(pb.Nth(state, 0), key);
  30. auto sval = pb.AggrConcat(pb.Nth(state, 1), val);
  31. return {pb.NewTuple({key, val, skey, sval}), pb.NewTuple({skey, sval})};
  32. }
  33. );
  34. auto graph = setup.BuildGraph(pgmReturn);
  35. auto iterator = graph->GetValue().GetListIterator();
  36. NUdf::TUnboxedValue item;
  37. UNIT_ASSERT(iterator.Next(item));
  38. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).template Get<i32>(), 7);
  39. UNBOXED_VALUE_STR_EQUAL(item.GetElement(1), "A");
  40. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(2).template Get<i32>(), 10);
  41. UNBOXED_VALUE_STR_EQUAL(item.GetElement(3), "BA");
  42. UNIT_ASSERT(iterator.Next(item));
  43. UNIT_ASSERT(!item.GetElement(0));
  44. UNIT_ASSERT(!item.GetElement(1));
  45. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(2).template Get<i32>(), 10);
  46. UNBOXED_VALUE_STR_EQUAL(item.GetElement(3), "BA");
  47. UNIT_ASSERT(iterator.Next(item));
  48. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).template Get<i32>(), 1);
  49. UNBOXED_VALUE_STR_EQUAL(item.GetElement(1), "D");
  50. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(2).template Get<i32>(), 11);
  51. UNBOXED_VALUE_STR_EQUAL(item.GetElement(3), "BAD");
  52. UNIT_ASSERT(!iterator.Next(item));
  53. UNIT_ASSERT(!iterator.Next(item));
  54. }
  55. Y_UNIT_TEST_LLVM(Test1OverList) {
  56. TSetup<LLVM> setup;
  57. TProgramBuilder& pb = *setup.PgmBuilder;
  58. auto dataType = pb.NewOptionalType(pb.NewTupleType({pb.NewDataType(NUdf::TDataType<i32>::Id), pb.NewDataType(NUdf::TDataType<char*>::Id)}));
  59. auto data0 = pb.NewEmptyOptional(dataType);
  60. auto data1 = pb.NewOptional(pb.NewTuple({
  61. pb.NewDataLiteral<i32>(3),
  62. pb.NewDataLiteral<NUdf::EDataSlot::String>("B")
  63. }));
  64. auto data2 = pb.NewOptional(pb.NewTuple({
  65. pb.NewDataLiteral<i32>(7),
  66. pb.NewDataLiteral<NUdf::EDataSlot::String>("A")
  67. }));
  68. auto data3 = pb.NewOptional(pb.NewTuple({
  69. pb.NewDataLiteral<i32>(1),
  70. pb.NewDataLiteral<NUdf::EDataSlot::String>("D")
  71. }));
  72. auto list = pb.NewList(dataType, {data1, data2, data3, data0});
  73. auto pgmReturn = pb.Chain1Map(list,
  74. [&](TRuntimeNode item) -> TRuntimeNodePair {
  75. auto key = pb.Nth(item, 0);
  76. auto val = pb.Nth(item, 1);
  77. return {pb.NewTuple({key, val, key, val}), pb.NewTuple({key, val})};
  78. },
  79. [&](TRuntimeNode item, TRuntimeNode state) -> TRuntimeNodePair {
  80. auto key = pb.Nth(item, 0);
  81. auto val = pb.Nth(item, 1);
  82. auto skey = pb.Add(pb.Nth(state, 0), key);
  83. auto sval = pb.Concat(pb.Nth(state, 1), val);
  84. return {pb.NewTuple({key, val, skey, sval}), pb.NewTuple({skey, sval})};
  85. }
  86. );
  87. auto graph = setup.BuildGraph(pgmReturn);
  88. auto iterator = graph->GetValue().GetListIterator();
  89. NUdf::TUnboxedValue item;
  90. UNIT_ASSERT(iterator.Next(item));
  91. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).template Get<i32>(), 3);
  92. UNBOXED_VALUE_STR_EQUAL(item.GetElement(1), "B");
  93. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(2).template Get<i32>(), 3);
  94. UNBOXED_VALUE_STR_EQUAL(item.GetElement(3), "B");
  95. UNIT_ASSERT(iterator.Next(item));
  96. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).template Get<i32>(), 7);
  97. UNBOXED_VALUE_STR_EQUAL(item.GetElement(1), "A");
  98. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(2).template Get<i32>(), 10);
  99. UNBOXED_VALUE_STR_EQUAL(item.GetElement(3), "BA");
  100. UNIT_ASSERT(iterator.Next(item));
  101. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).template Get<i32>(), 1);
  102. UNBOXED_VALUE_STR_EQUAL(item.GetElement(1), "D");
  103. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(2).template Get<i32>(), 11);
  104. UNBOXED_VALUE_STR_EQUAL(item.GetElement(3), "BAD");
  105. UNIT_ASSERT(iterator.Next(item));
  106. UNIT_ASSERT(!item.GetElement(0));
  107. UNIT_ASSERT(!item.GetElement(1));
  108. UNIT_ASSERT(!item.GetElement(2));
  109. UNIT_ASSERT(!item.GetElement(3));
  110. UNIT_ASSERT(!iterator.Next(item));
  111. UNIT_ASSERT(!iterator.Next(item));
  112. }
  113. Y_UNIT_TEST_LLVM(TestOverFlow) {
  114. TSetup<LLVM> setup;
  115. TProgramBuilder& pb = *setup.PgmBuilder;
  116. auto dataType = pb.NewOptionalType(pb.NewTupleType({pb.NewDataType(NUdf::TDataType<i32>::Id), pb.NewDataType(NUdf::TDataType<char*>::Id)}));
  117. auto data0 = pb.NewEmptyOptional(dataType);
  118. auto data2 = pb.NewOptional(pb.NewTuple({
  119. pb.NewDataLiteral<i32>(7),
  120. pb.NewDataLiteral<NUdf::EDataSlot::String>("A")
  121. }));
  122. auto data3 = pb.NewOptional(pb.NewTuple({
  123. pb.NewDataLiteral<i32>(1),
  124. pb.NewDataLiteral<NUdf::EDataSlot::String>("D")
  125. }));
  126. auto list = pb.NewList(dataType, {data2, data0, data3});
  127. auto init = pb.NewTuple({
  128. pb.NewOptional(pb.NewDataLiteral<i32>(3)),
  129. pb.NewOptional(pb.NewDataLiteral<NUdf::EDataSlot::String>("B"))
  130. });
  131. auto pgmReturn = pb.FromFlow(pb.ChainMap(pb.ToFlow(list), init,
  132. [&](TRuntimeNode item, TRuntimeNode state) -> TRuntimeNodePair {
  133. auto key = pb.Nth(item, 0);
  134. auto val = pb.Nth(item, 1);
  135. auto skey = pb.AggrAdd(pb.Nth(state, 0), key);
  136. auto sval = pb.AggrConcat(pb.Nth(state, 1), val);
  137. return {pb.NewTuple({key, val, skey, sval}), pb.NewTuple({skey, sval})};
  138. }
  139. ));
  140. auto graph = setup.BuildGraph(pgmReturn);
  141. auto iterator = graph->GetValue();
  142. NUdf::TUnboxedValue item;
  143. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  144. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).template Get<i32>(), 7);
  145. UNBOXED_VALUE_STR_EQUAL(item.GetElement(1), "A");
  146. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(2).template Get<i32>(), 10);
  147. UNBOXED_VALUE_STR_EQUAL(item.GetElement(3), "BA");
  148. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  149. UNIT_ASSERT(!item.GetElement(0));
  150. UNIT_ASSERT(!item.GetElement(1));
  151. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(2).template Get<i32>(), 10);
  152. UNBOXED_VALUE_STR_EQUAL(item.GetElement(3), "BA");
  153. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  154. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).template Get<i32>(), 1);
  155. UNBOXED_VALUE_STR_EQUAL(item.GetElement(1), "D");
  156. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(2).template Get<i32>(), 11);
  157. UNBOXED_VALUE_STR_EQUAL(item.GetElement(3), "BAD");
  158. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
  159. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
  160. }
  161. Y_UNIT_TEST_LLVM(Test1OverFlow) {
  162. TSetup<LLVM> setup;
  163. TProgramBuilder& pb = *setup.PgmBuilder;
  164. auto dataType = pb.NewOptionalType(pb.NewTupleType({pb.NewDataType(NUdf::TDataType<i32>::Id), pb.NewDataType(NUdf::TDataType<char*>::Id)}));
  165. auto data0 = pb.NewEmptyOptional(dataType);
  166. auto data1 = pb.NewOptional(pb.NewTuple({
  167. pb.NewDataLiteral<i32>(3),
  168. pb.NewDataLiteral<NUdf::EDataSlot::String>("B")
  169. }));
  170. auto data2 = pb.NewOptional(pb.NewTuple({
  171. pb.NewDataLiteral<i32>(7),
  172. pb.NewDataLiteral<NUdf::EDataSlot::String>("A")
  173. }));
  174. auto data3 = pb.NewOptional(pb.NewTuple({
  175. pb.NewDataLiteral<i32>(1),
  176. pb.NewDataLiteral<NUdf::EDataSlot::String>("D")
  177. }));
  178. auto list = pb.NewList(dataType, {data1, data2, data3, data0});
  179. auto pgmReturn = pb.FromFlow(pb.Chain1Map(pb.ToFlow(list),
  180. [&](TRuntimeNode item) -> TRuntimeNodePair {
  181. auto key = pb.Nth(item, 0);
  182. auto val = pb.Nth(item, 1);
  183. return {pb.NewTuple({key, val, key, val}), pb.NewTuple({key, val})};
  184. },
  185. [&](TRuntimeNode item, TRuntimeNode state) -> TRuntimeNodePair {
  186. auto key = pb.Nth(item, 0);
  187. auto val = pb.Nth(item, 1);
  188. auto skey = pb.Add(pb.Nth(state, 0), key);
  189. auto sval = pb.Concat(pb.Nth(state, 1), val);
  190. return {pb.NewTuple({key, val, skey, sval}), pb.NewTuple({skey, sval})};
  191. }
  192. ));
  193. auto graph = setup.BuildGraph(pgmReturn);
  194. auto iterator = graph->GetValue();
  195. NUdf::TUnboxedValue item;
  196. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  197. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).template Get<i32>(), 3);
  198. UNBOXED_VALUE_STR_EQUAL(item.GetElement(1), "B");
  199. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(2).template Get<i32>(), 3);
  200. UNBOXED_VALUE_STR_EQUAL(item.GetElement(3), "B");
  201. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  202. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).template Get<i32>(), 7);
  203. UNBOXED_VALUE_STR_EQUAL(item.GetElement(1), "A");
  204. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(2).template Get<i32>(), 10);
  205. UNBOXED_VALUE_STR_EQUAL(item.GetElement(3), "BA");
  206. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  207. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).template Get<i32>(), 1);
  208. UNBOXED_VALUE_STR_EQUAL(item.GetElement(1), "D");
  209. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(2).template Get<i32>(), 11);
  210. UNBOXED_VALUE_STR_EQUAL(item.GetElement(3), "BAD");
  211. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  212. UNIT_ASSERT(!item.GetElement(0));
  213. UNIT_ASSERT(!item.GetElement(1));
  214. UNIT_ASSERT(!item.GetElement(2));
  215. UNIT_ASSERT(!item.GetElement(3));
  216. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
  217. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
  218. }
  219. }
  220. }
  221. }