mkql_switch_ut.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  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(TMiniKQLSwitchTest) {
  7. Y_UNIT_TEST_LLVM(TestStreamOfVariantsSwap) {
  8. TSetup<LLVM> setup;
  9. TProgramBuilder& pb = *setup.PgmBuilder;
  10. const auto data1 = pb.NewDataLiteral<ui32>(1U);
  11. const auto data2 = pb.NewDataLiteral<ui32>(2U);
  12. const auto data3 = pb.NewDataLiteral<ui32>(3U);
  13. const auto data4 = pb.NewDataLiteral<NUdf::EDataSlot::String>("123");
  14. const auto data5 = pb.NewDataLiteral<NUdf::EDataSlot::String>("456");
  15. const auto data6 = pb.NewDataLiteral<NUdf::EDataSlot::String>("789");
  16. const auto intType = pb.NewDataType(NUdf::TDataType<ui32>::Id);
  17. const auto strType = pb.NewDataType(NUdf::TDataType<char*>::Id);
  18. const auto varInType = pb.NewVariantType(pb.NewTupleType({intType, strType}));
  19. const auto var1 = pb.NewVariant(data1, 0U, varInType);
  20. const auto var2 = pb.NewVariant(data2, 0U, varInType);
  21. const auto var3 = pb.NewVariant(data3, 0U, varInType);
  22. const auto var4 = pb.NewVariant(data4, 1U, varInType);
  23. const auto var5 = pb.NewVariant(data5, 1U, varInType);
  24. const auto var6 = pb.NewVariant(data6, 1U, varInType);
  25. const auto varOutType = pb.NewVariantType(pb.NewTupleType({strType, intType}));
  26. const auto list = pb.NewList(varInType, {var1, var2, var3, var4, var5, var6});
  27. const auto pgmReturn = pb.Switch(pb.Iterator(list, {}),
  28. {{{0U}, pb.NewStreamType(intType), std::nullopt}, {{1U}, pb.NewStreamType(strType), std::nullopt}},
  29. [&](ui32 index, TRuntimeNode stream) {
  30. switch (index) {
  31. case 0U: return pb.Map(stream, [&](TRuntimeNode item) { return pb.NewVariant(pb.ToString(item), 0U, varOutType); });
  32. case 1U: return pb.Map(stream, [&](TRuntimeNode item) { return pb.NewVariant(pb.StrictFromString(item, intType), 1U, varOutType); });
  33. }
  34. Y_ABORT("Wrong case!");
  35. },
  36. 0ULL,
  37. pb.NewStreamType(varOutType)
  38. );
  39. const auto graph = setup.BuildGraph(pgmReturn);
  40. const auto iterator = graph->GetValue();
  41. NUdf::TUnboxedValue item;
  42. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  43. UNIT_ASSERT_VALUES_EQUAL(item.GetVariantIndex(), 0U);
  44. UNBOXED_VALUE_STR_EQUAL(item, "1");
  45. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  46. UNIT_ASSERT_VALUES_EQUAL(item.GetVariantIndex(), 0U);
  47. UNBOXED_VALUE_STR_EQUAL(item, "2");
  48. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  49. UNIT_ASSERT_VALUES_EQUAL(item.GetVariantIndex(), 0U);
  50. UNBOXED_VALUE_STR_EQUAL(item, "3");
  51. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  52. UNIT_ASSERT_VALUES_EQUAL(item.GetVariantIndex(), 1U);
  53. UNIT_ASSERT_VALUES_EQUAL(item.Get<ui32>(), 123U);
  54. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  55. UNIT_ASSERT_VALUES_EQUAL(item.GetVariantIndex(), 1U);
  56. UNIT_ASSERT_VALUES_EQUAL(item.Get<ui32>(), 456U);
  57. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  58. UNIT_ASSERT_VALUES_EQUAL(item.GetVariantIndex(), 1U);
  59. UNIT_ASSERT_VALUES_EQUAL(item.Get<ui32>(), 789U);
  60. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
  61. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
  62. }
  63. Y_UNIT_TEST_LLVM(TestStreamOfVariantsTwoInOne) {
  64. TSetup<LLVM> setup;
  65. TProgramBuilder& pb = *setup.PgmBuilder;
  66. const auto data1 = pb.NewDataLiteral<ui32>(1U);
  67. const auto data2 = pb.NewDataLiteral<ui32>(2U);
  68. const auto data3 = pb.NewDataLiteral<ui32>(3U);
  69. const auto data4 = pb.NewDataLiteral<NUdf::EDataSlot::String>("123");
  70. const auto data5 = pb.NewDataLiteral<NUdf::EDataSlot::String>("456");
  71. const auto data6 = pb.NewDataLiteral<NUdf::EDataSlot::String>("789");
  72. const auto intType = pb.NewDataType(NUdf::TDataType<ui32>::Id);
  73. const auto strType = pb.NewDataType(NUdf::TDataType<char*>::Id);
  74. const auto varInType = pb.NewVariantType(pb.NewTupleType({intType, strType}));
  75. const auto var1 = pb.NewVariant(data1, 0U, varInType);
  76. const auto var2 = pb.NewVariant(data2, 0U, varInType);
  77. const auto var3 = pb.NewVariant(data3, 0U, varInType);
  78. const auto var4 = pb.NewVariant(data4, 1U, varInType);
  79. const auto var5 = pb.NewVariant(data5, 1U, varInType);
  80. const auto var6 = pb.NewVariant(data6, 1U, varInType);
  81. const auto varOutType = pb.NewVariantType(pb.NewTupleType({strType, intType}));
  82. const auto list = pb.NewList(varInType, {var1, var2, var3, var4, var5, var6});
  83. const auto pgmReturn = pb.Switch(pb.Iterator(list, {}),
  84. {{{0U}, pb.NewStreamType(intType), 1U}, {{1U}, pb.NewStreamType(strType), std::nullopt}},
  85. [&](ui32 index, TRuntimeNode stream) {
  86. switch (index) {
  87. case 0U: return pb.Map(stream, [&](TRuntimeNode item) { return item; });
  88. case 1U: return pb.Map(stream, [&](TRuntimeNode item) { return pb.NewVariant(pb.StrictFromString(item, intType), 1U, varOutType); });
  89. }
  90. Y_ABORT("Wrong case!");
  91. },
  92. 0ULL,
  93. pb.NewStreamType(varOutType)
  94. );
  95. const auto graph = setup.BuildGraph(pgmReturn);
  96. const auto iterator = graph->GetValue();
  97. NUdf::TUnboxedValue item;
  98. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  99. UNIT_ASSERT_VALUES_EQUAL(item.GetVariantIndex(), 1U);
  100. UNIT_ASSERT_VALUES_EQUAL(item.Get<ui32>(), 1U);
  101. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  102. UNIT_ASSERT_VALUES_EQUAL(item.GetVariantIndex(), 1U);
  103. UNIT_ASSERT_VALUES_EQUAL(item.Get<ui32>(), 2U);
  104. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  105. UNIT_ASSERT_VALUES_EQUAL(item.GetVariantIndex(), 1U);
  106. UNIT_ASSERT_VALUES_EQUAL(item.Get<ui32>(), 3U);
  107. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  108. UNIT_ASSERT_VALUES_EQUAL(item.GetVariantIndex(), 1U);
  109. UNIT_ASSERT_VALUES_EQUAL(item.Get<ui32>(), 123U);
  110. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  111. UNIT_ASSERT_VALUES_EQUAL(item.GetVariantIndex(), 1U);
  112. UNIT_ASSERT_VALUES_EQUAL(item.Get<ui32>(), 456U);
  113. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  114. UNIT_ASSERT_VALUES_EQUAL(item.GetVariantIndex(), 1U);
  115. UNIT_ASSERT_VALUES_EQUAL(item.Get<ui32>(), 789U);
  116. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
  117. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
  118. }
  119. Y_UNIT_TEST_LLVM(TestFlowOfVariantsSwap) {
  120. TSetup<LLVM> setup;
  121. TProgramBuilder& pb = *setup.PgmBuilder;
  122. const auto data1 = pb.NewDataLiteral<ui32>(1U);
  123. const auto data2 = pb.NewDataLiteral<ui32>(2U);
  124. const auto data3 = pb.NewDataLiteral<ui32>(3U);
  125. const auto data4 = pb.NewDataLiteral<NUdf::EDataSlot::String>("123");
  126. const auto data5 = pb.NewDataLiteral<NUdf::EDataSlot::String>("456");
  127. const auto data6 = pb.NewDataLiteral<NUdf::EDataSlot::String>("789");
  128. const auto intType = pb.NewDataType(NUdf::TDataType<ui32>::Id);
  129. const auto strType = pb.NewDataType(NUdf::TDataType<char*>::Id);
  130. const auto varInType = pb.NewVariantType(pb.NewTupleType({intType, strType}));
  131. const auto var1 = pb.NewVariant(data1, 0U, varInType);
  132. const auto var2 = pb.NewVariant(data2, 0U, varInType);
  133. const auto var3 = pb.NewVariant(data3, 0U, varInType);
  134. const auto var4 = pb.NewVariant(data4, 1U, varInType);
  135. const auto var5 = pb.NewVariant(data5, 1U, varInType);
  136. const auto var6 = pb.NewVariant(data6, 1U, varInType);
  137. const auto varOutType = pb.NewVariantType(pb.NewTupleType({strType, intType}));
  138. const auto list = pb.NewList(varInType, {var1, var2, var3, var4, var5, var6});
  139. const auto pgmReturn = pb.FromFlow(pb.Switch(pb.ToFlow(list),
  140. {{{0U}, pb.NewFlowType(intType), std::nullopt}, {{1U}, pb.NewFlowType(strType), std::nullopt}},
  141. [&](ui32 index, TRuntimeNode stream) {
  142. switch (index) {
  143. case 0U: return pb.Map(stream, [&](TRuntimeNode item) { return pb.NewVariant(pb.ToString(item), 0U, varOutType); });
  144. case 1U: return pb.Map(stream, [&](TRuntimeNode item) { return pb.NewVariant(pb.StrictFromString(item, intType), 1U, varOutType); });
  145. }
  146. Y_ABORT("Wrong case!");
  147. },
  148. 0ULL,
  149. pb.NewFlowType(varOutType)
  150. ));
  151. const auto graph = setup.BuildGraph(pgmReturn);
  152. const auto iterator = graph->GetValue();
  153. NUdf::TUnboxedValue item;
  154. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  155. UNIT_ASSERT_VALUES_EQUAL(item.GetVariantIndex(), 0U);
  156. UNBOXED_VALUE_STR_EQUAL(item, "1");
  157. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  158. UNIT_ASSERT_VALUES_EQUAL(item.GetVariantIndex(), 0U);
  159. UNBOXED_VALUE_STR_EQUAL(item, "2");
  160. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  161. UNIT_ASSERT_VALUES_EQUAL(item.GetVariantIndex(), 0U);
  162. UNBOXED_VALUE_STR_EQUAL(item, "3");
  163. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  164. UNIT_ASSERT_VALUES_EQUAL(item.GetVariantIndex(), 1U);
  165. UNIT_ASSERT_VALUES_EQUAL(item.Get<ui32>(), 123U);
  166. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  167. UNIT_ASSERT_VALUES_EQUAL(item.GetVariantIndex(), 1U);
  168. UNIT_ASSERT_VALUES_EQUAL(item.Get<ui32>(), 456U);
  169. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  170. UNIT_ASSERT_VALUES_EQUAL(item.GetVariantIndex(), 1U);
  171. UNIT_ASSERT_VALUES_EQUAL(item.Get<ui32>(), 789U);
  172. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
  173. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
  174. }
  175. Y_UNIT_TEST_LLVM(TestFlowOfVariantsTwoInOne) {
  176. TSetup<LLVM> setup;
  177. TProgramBuilder& pb = *setup.PgmBuilder;
  178. const auto data1 = pb.NewDataLiteral<ui32>(1U);
  179. const auto data2 = pb.NewDataLiteral<ui32>(2U);
  180. const auto data3 = pb.NewDataLiteral<ui32>(3U);
  181. const auto data4 = pb.NewDataLiteral<NUdf::EDataSlot::String>("123");
  182. const auto data5 = pb.NewDataLiteral<NUdf::EDataSlot::String>("456");
  183. const auto data6 = pb.NewDataLiteral<NUdf::EDataSlot::String>("789");
  184. const auto intType = pb.NewDataType(NUdf::TDataType<ui32>::Id);
  185. const auto strType = pb.NewDataType(NUdf::TDataType<char*>::Id);
  186. const auto varInType = pb.NewVariantType(pb.NewTupleType({intType, strType}));
  187. const auto var1 = pb.NewVariant(data1, 0U, varInType);
  188. const auto var2 = pb.NewVariant(data2, 0U, varInType);
  189. const auto var3 = pb.NewVariant(data3, 0U, varInType);
  190. const auto var4 = pb.NewVariant(data4, 1U, varInType);
  191. const auto var5 = pb.NewVariant(data5, 1U, varInType);
  192. const auto var6 = pb.NewVariant(data6, 1U, varInType);
  193. const auto varOutType = pb.NewVariantType(pb.NewTupleType({strType, intType}));
  194. const auto list = pb.NewList(varInType, {var1, var2, var3, var4, var5, var6});
  195. const auto pgmReturn = pb.FromFlow(pb.Switch(pb.ToFlow(list),
  196. {{{0U}, pb.NewFlowType(intType), 1U}, {{1U}, pb.NewFlowType(strType), std::nullopt}},
  197. [&](ui32 index, TRuntimeNode stream) {
  198. switch (index) {
  199. case 0U: return pb.Map(stream, [&](TRuntimeNode item) { return item; });
  200. case 1U: return pb.Map(stream, [&](TRuntimeNode item) { return pb.NewVariant(pb.StrictFromString(item, intType), 1U, varOutType); });
  201. }
  202. Y_ABORT("Wrong case!");
  203. },
  204. 0ULL,
  205. pb.NewFlowType(varOutType)
  206. ));
  207. const auto graph = setup.BuildGraph(pgmReturn);
  208. const auto iterator = graph->GetValue();
  209. NUdf::TUnboxedValue item;
  210. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  211. UNIT_ASSERT_VALUES_EQUAL(item.GetVariantIndex(), 1U);
  212. UNIT_ASSERT_VALUES_EQUAL(item.Get<ui32>(), 1U);
  213. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  214. UNIT_ASSERT_VALUES_EQUAL(item.GetVariantIndex(), 1U);
  215. UNIT_ASSERT_VALUES_EQUAL(item.Get<ui32>(), 2U);
  216. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  217. UNIT_ASSERT_VALUES_EQUAL(item.GetVariantIndex(), 1U);
  218. UNIT_ASSERT_VALUES_EQUAL(item.Get<ui32>(), 3U);
  219. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  220. UNIT_ASSERT_VALUES_EQUAL(item.GetVariantIndex(), 1U);
  221. UNIT_ASSERT_VALUES_EQUAL(item.Get<ui32>(), 123U);
  222. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  223. UNIT_ASSERT_VALUES_EQUAL(item.GetVariantIndex(), 1U);
  224. UNIT_ASSERT_VALUES_EQUAL(item.Get<ui32>(), 456U);
  225. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Ok, iterator.Fetch(item));
  226. UNIT_ASSERT_VALUES_EQUAL(item.GetVariantIndex(), 1U);
  227. UNIT_ASSERT_VALUES_EQUAL(item.Get<ui32>(), 789U);
  228. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
  229. UNIT_ASSERT_VALUES_EQUAL(NUdf::EFetchStatus::Finish, iterator.Fetch(item));
  230. }
  231. }
  232. }
  233. }