mkql_wide_condense_ut.cpp 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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(TMiniKQLWideCondense1Test) {
  7. Y_UNIT_TEST_LLVM(TestConcatItemsToKey) {
  8. TSetup<LLVM> setup;
  9. TProgramBuilder& pb = *setup.PgmBuilder;
  10. const auto dataType = pb.NewDataType(NUdf::TDataType<const char*>::Id);
  11. const auto tupleType = pb.NewTupleType({dataType, dataType});
  12. const auto keyOne = pb.NewDataLiteral<NUdf::EDataSlot::String>("key one");
  13. const auto keyTwo = pb.NewDataLiteral<NUdf::EDataSlot::String>("key two");
  14. const auto longKeyOne = pb.NewDataLiteral<NUdf::EDataSlot::String>("very long key one");
  15. const auto longKeyTwo = pb.NewDataLiteral<NUdf::EDataSlot::String>("very long key two");
  16. const auto value1 = pb.NewDataLiteral<NUdf::EDataSlot::String>("very long value 1");
  17. const auto value2 = pb.NewDataLiteral<NUdf::EDataSlot::String>("very long value 2");
  18. const auto value3 = pb.NewDataLiteral<NUdf::EDataSlot::String>("very long value 3");
  19. const auto value4 = pb.NewDataLiteral<NUdf::EDataSlot::String>("very long value 4");
  20. const auto value5 = pb.NewDataLiteral<NUdf::EDataSlot::String>("very long value 5");
  21. const auto value6 = pb.NewDataLiteral<NUdf::EDataSlot::String>("very long value 6");
  22. const auto value7 = pb.NewDataLiteral<NUdf::EDataSlot::String>("very long value 7");
  23. const auto value8 = pb.NewDataLiteral<NUdf::EDataSlot::String>("very long value 8");
  24. const auto value9 = pb.NewDataLiteral<NUdf::EDataSlot::String>("very long value 9");
  25. const auto data1 = pb.NewTuple(tupleType, {keyOne, value1});
  26. const auto data2 = pb.NewTuple(tupleType, {keyTwo, value2});
  27. const auto data3 = pb.NewTuple(tupleType, {keyTwo, value3});
  28. const auto data4 = pb.NewTuple(tupleType, {longKeyOne, value4});
  29. const auto data5 = pb.NewTuple(tupleType, {longKeyTwo, value5});
  30. const auto data6 = pb.NewTuple(tupleType, {longKeyTwo, value6});
  31. const auto data7 = pb.NewTuple(tupleType, {longKeyTwo, value7});
  32. const auto data8 = pb.NewTuple(tupleType, {longKeyTwo, value8});
  33. const auto data9 = pb.NewTuple(tupleType, {longKeyTwo, value9});
  34. const auto list = pb.NewList(tupleType, {data1, data2, data3, data4, data5, data6, data7, data8, data9});
  35. const auto pgmReturn = pb.Collect(pb.NarrowMap(pb.WideCondense1(pb.ExpandMap(pb.ToFlow(list),
  36. [&](TRuntimeNode item) -> TRuntimeNode::TList { return {pb.Nth(item, 0U), pb.Nth(item, 1U)}; }),
  37. [&](TRuntimeNode::TList items) -> TRuntimeNode::TList {
  38. return {items.front(), pb.AggrConcat(pb.AggrConcat(items.front(), pb.NewDataLiteral<NUdf::EDataSlot::String>(": ")), items.back())};
  39. },
  40. [&](TRuntimeNode::TList items, TRuntimeNode::TList state) {
  41. return pb.AggrNotEquals(items.front(), state.front());
  42. },
  43. [&](TRuntimeNode::TList items, TRuntimeNode::TList state) -> TRuntimeNode::TList {
  44. return {state.front(), pb.AggrConcat(pb.AggrConcat(state.back(), pb.NewDataLiteral<NUdf::EDataSlot::String>(", ")), items.back())};
  45. }),
  46. [&](TRuntimeNode::TList items) { return items.back(); }
  47. ));
  48. const auto graph = setup.BuildGraph(pgmReturn);
  49. const auto iterator = graph->GetValue().GetListIterator();
  50. NUdf::TUnboxedValue item;
  51. UNIT_ASSERT(iterator.Next(item));
  52. UNBOXED_VALUE_STR_EQUAL(item, "key one: very long value 1");
  53. UNIT_ASSERT(iterator.Next(item));
  54. UNBOXED_VALUE_STR_EQUAL(item, "key two: very long value 2, very long value 3");
  55. UNIT_ASSERT(iterator.Next(item));
  56. UNBOXED_VALUE_STR_EQUAL(item, "very long key one: very long value 4");
  57. UNIT_ASSERT(iterator.Next(item));
  58. UNBOXED_VALUE_STR_EQUAL(item, "very long key two: very long value 5, very long value 6, very long value 7, very long value 8, very long value 9");
  59. UNIT_ASSERT(!iterator.Next(item));
  60. UNIT_ASSERT(!iterator.Next(item));
  61. }
  62. Y_UNIT_TEST_LLVM(TestSwitchByBoolFieldAndDontUseKey) {
  63. TSetup<LLVM> setup;
  64. TProgramBuilder& pb = *setup.PgmBuilder;
  65. const auto dataType = pb.NewDataType(NUdf::TDataType<const char*>::Id);
  66. const auto boolType = pb.NewDataType(NUdf::TDataType<bool>::Id);
  67. const auto tupleType = pb.NewTupleType({pb.NewOptionalType(dataType), dataType, boolType});
  68. const auto key0 = pb.NewEmptyOptional(pb.NewOptionalType(dataType));
  69. const auto key1 = pb.NewOptional(pb.NewDataLiteral<NUdf::EDataSlot::String>("one"));
  70. const auto key2 = pb.NewOptional(pb.NewDataLiteral<NUdf::EDataSlot::String>("two"));
  71. const auto trueVal = pb.NewDataLiteral<bool>(true);
  72. const auto falseVal = pb.NewDataLiteral<bool>(false);
  73. const auto value1 = pb.NewDataLiteral<NUdf::EDataSlot::String>("value 1");
  74. const auto value2 = pb.NewDataLiteral<NUdf::EDataSlot::String>("value 2");
  75. const auto value3 = pb.NewDataLiteral<NUdf::EDataSlot::String>("value 3");
  76. const auto value4 = pb.NewDataLiteral<NUdf::EDataSlot::String>("value 4");
  77. const auto value5 = pb.NewDataLiteral<NUdf::EDataSlot::String>("value 5");
  78. const auto value6 = pb.NewDataLiteral<NUdf::EDataSlot::String>("value 6");
  79. const auto value7 = pb.NewDataLiteral<NUdf::EDataSlot::String>("value 7");
  80. const auto value8 = pb.NewDataLiteral<NUdf::EDataSlot::String>("value 8");
  81. const auto value9 = pb.NewDataLiteral<NUdf::EDataSlot::String>("value 9");
  82. const auto data1 = pb.NewTuple(tupleType, {key0, value1, trueVal});
  83. const auto data2 = pb.NewTuple(tupleType, {key1, value2, falseVal});
  84. const auto data3 = pb.NewTuple(tupleType, {key2, value3, falseVal});
  85. const auto data4 = pb.NewTuple(tupleType, {key0, value4, trueVal});
  86. const auto data5 = pb.NewTuple(tupleType, {key1, value5, falseVal});
  87. const auto data6 = pb.NewTuple(tupleType, {key2, value6, falseVal});
  88. const auto data7 = pb.NewTuple(tupleType, {key0, value7, falseVal});
  89. const auto data8 = pb.NewTuple(tupleType, {key1, value8, falseVal});
  90. const auto data9 = pb.NewTuple(tupleType, {key2, value9, trueVal});
  91. const auto list = pb.NewList(tupleType, {data1, data2, data3, data4, data5, data6, data7, data8, data9});
  92. const auto landmine = pb.NewDataLiteral<NUdf::EDataSlot::String>("ACHTUNG MINEN!");
  93. const auto pgmReturn = pb.Collect(pb.NarrowMap(pb.WideCondense1(pb.ExpandMap(pb.ToFlow(list),
  94. [&](TRuntimeNode item) -> TRuntimeNode::TList { return {pb.Unwrap(pb.Nth(item, 0U), landmine, __FILE__, __LINE__, 0), pb.Nth(item, 1U), pb.Nth(item, 2U)}; }),
  95. [&](TRuntimeNode::TList items) -> TRuntimeNode::TList {
  96. return {items[1U]};
  97. },
  98. [&](TRuntimeNode::TList items, TRuntimeNode::TList) {
  99. return items.back();
  100. },
  101. [&](TRuntimeNode::TList items, TRuntimeNode::TList state) -> TRuntimeNode::TList {
  102. return {pb.AggrConcat(pb.AggrConcat(state.front(), pb.NewDataLiteral<NUdf::EDataSlot::String>("; ")), items[1U])};
  103. }),
  104. [&](TRuntimeNode::TList items) { return items.front(); }
  105. ));
  106. const auto graph = setup.BuildGraph(pgmReturn);
  107. const auto iterator = graph->GetValue().GetListIterator();
  108. NUdf::TUnboxedValue item;
  109. UNIT_ASSERT(iterator.Next(item));
  110. UNBOXED_VALUE_STR_EQUAL(item, "value 1; value 2; value 3");
  111. UNIT_ASSERT(iterator.Next(item));
  112. UNBOXED_VALUE_STR_EQUAL(item, "value 4; value 5; value 6; value 7; value 8");
  113. UNIT_ASSERT(iterator.Next(item));
  114. UNBOXED_VALUE_STR_EQUAL(item, "value 9");
  115. UNIT_ASSERT(!iterator.Next(item));
  116. UNIT_ASSERT(!iterator.Next(item));
  117. }
  118. Y_UNIT_TEST_LLVM(TestThinAllLambdas) {
  119. TSetup<LLVM> setup;
  120. TProgramBuilder& pb = *setup.PgmBuilder;
  121. const auto tupleType = pb.NewTupleType({});
  122. const auto data = pb.NewTuple({});
  123. const auto list = pb.NewList(tupleType, {data, data, data, data});
  124. const auto pgmReturn = pb.Collect(pb.NarrowMap(pb.WideCondense1(pb.ExpandMap(pb.ToFlow(list),
  125. [](TRuntimeNode) -> TRuntimeNode::TList { return {}; }),
  126. [](TRuntimeNode::TList items) { return items; },
  127. [&](TRuntimeNode::TList, TRuntimeNode::TList) { return pb.NewDataLiteral<bool>(true); },
  128. [](TRuntimeNode::TList, TRuntimeNode::TList state) { return state;}),
  129. [&](TRuntimeNode::TList) { return pb.NewTuple({}); }
  130. ));
  131. const auto graph = setup.BuildGraph(pgmReturn);
  132. const auto iterator = graph->GetValue().GetListIterator();
  133. NUdf::TUnboxedValue item;
  134. UNIT_ASSERT(iterator.Next(item));
  135. UNIT_ASSERT(iterator.Next(item));
  136. UNIT_ASSERT(iterator.Next(item));
  137. UNIT_ASSERT(iterator.Next(item));
  138. UNIT_ASSERT(!iterator.Next(item));
  139. UNIT_ASSERT(!iterator.Next(item));
  140. }
  141. }
  142. #endif
  143. }
  144. }