mkql_compare_ut.cpp 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119
  1. #include "mkql_computation_node_ut.h"
  2. #include <yql/essentials/minikql/mkql_node_printer.h>
  3. #include <yql/essentials/minikql/mkql_node_cast.h>
  4. #include <yql/essentials/minikql/mkql_string_util.h>
  5. #include <yql/essentials/minikql/computation/mkql_computation_node_impl.h>
  6. #include <yql/essentials/minikql/computation/mkql_computation_list_adapter.h>
  7. #include <yql/essentials/minikql/computation/mkql_computation_node_holders.h>
  8. #include <cfloat>
  9. #include <utility>
  10. namespace NKikimr {
  11. namespace NMiniKQL {
  12. Y_UNIT_TEST_SUITE(TMiniKQLCompareTest) {
  13. Y_UNIT_TEST_LLVM(SqlString) {
  14. TSetup<LLVM> setup;
  15. TProgramBuilder& pb = *setup.PgmBuilder;
  16. auto data0 = pb.NewEmptyOptionalDataLiteral(NUdf::TDataType<char*>::Id);
  17. auto data1 = pb.NewOptional(pb.NewDataLiteral<NUdf::EDataSlot::String>("010"));
  18. auto data2 = pb.NewOptional(pb.NewDataLiteral<NUdf::EDataSlot::String>("020"));
  19. auto dataType = pb.NewDataType(NUdf::TDataType<char*>::Id);
  20. auto optionalType = pb.NewOptionalType(dataType);
  21. auto pairType = pb.NewTupleType({optionalType, optionalType});
  22. auto list = pb.NewList(pairType, {
  23. pb.NewTuple({data0, data0}),
  24. pb.NewTuple({data0, data1}),
  25. pb.NewTuple({data0, data2}),
  26. pb.NewTuple({data1, data0}),
  27. pb.NewTuple({data1, data1}),
  28. pb.NewTuple({data1, data2}),
  29. pb.NewTuple({data2, data0}),
  30. pb.NewTuple({data2, data1}),
  31. pb.NewTuple({data2, data2})
  32. });
  33. auto pgmReturn = pb.Map(list,
  34. [&](TRuntimeNode item) {
  35. return pb.NewTuple({
  36. pb.Equals(pb.Nth(item, 0), pb.Nth(item, 1)),
  37. pb.NotEquals(pb.Nth(item, 0), pb.Nth(item, 1)),
  38. pb.Less(pb.Nth(item, 0), pb.Nth(item, 1)),
  39. pb.LessOrEqual(pb.Nth(item, 0), pb.Nth(item, 1)),
  40. pb.Greater(pb.Nth(item, 0), pb.Nth(item, 1)),
  41. pb.GreaterOrEqual(pb.Nth(item, 0), pb.Nth(item, 1))
  42. });
  43. });
  44. auto graph = setup.BuildGraph(pgmReturn);
  45. auto iterator = graph->GetValue().GetListIterator();
  46. NUdf::TUnboxedValue item;
  47. UNIT_ASSERT(iterator.Next(item));
  48. UNIT_ASSERT(!item.GetElement(0)); // ==
  49. UNIT_ASSERT(!item.GetElement(1)); // !=
  50. UNIT_ASSERT(!item.GetElement(2)); // <
  51. UNIT_ASSERT(!item.GetElement(3)); // <=
  52. UNIT_ASSERT(!item.GetElement(4)); // >
  53. UNIT_ASSERT(!item.GetElement(5)); // >=
  54. UNIT_ASSERT(iterator.Next(item));
  55. UNIT_ASSERT(!item.GetElement(0)); // ==
  56. UNIT_ASSERT(!item.GetElement(1)); // !=
  57. UNIT_ASSERT(!item.GetElement(2)); // <
  58. UNIT_ASSERT(!item.GetElement(3)); // <=
  59. UNIT_ASSERT(!item.GetElement(4)); // >
  60. UNIT_ASSERT(!item.GetElement(5)); // >=
  61. UNIT_ASSERT(iterator.Next(item));
  62. UNIT_ASSERT(!item.GetElement(0)); // ==
  63. UNIT_ASSERT(!item.GetElement(1)); // !=
  64. UNIT_ASSERT(!item.GetElement(2)); // <
  65. UNIT_ASSERT(!item.GetElement(3)); // <=
  66. UNIT_ASSERT(!item.GetElement(4)); // >
  67. UNIT_ASSERT(!item.GetElement(5)); // >=
  68. UNIT_ASSERT(iterator.Next(item));
  69. UNIT_ASSERT(!item.GetElement(0)); // ==
  70. UNIT_ASSERT(!item.GetElement(1)); // !=
  71. UNIT_ASSERT(!item.GetElement(2)); // <
  72. UNIT_ASSERT(!item.GetElement(3)); // <=
  73. UNIT_ASSERT(!item.GetElement(4)); // >
  74. UNIT_ASSERT(!item.GetElement(5)); // >=
  75. UNIT_ASSERT(iterator.Next(item));
  76. UNIT_ASSERT(item.GetElement(0).template Get<bool>()); // ==
  77. UNIT_ASSERT(!item.GetElement(1).template Get<bool>()); // !=
  78. UNIT_ASSERT(!item.GetElement(2).template Get<bool>()); // <
  79. UNIT_ASSERT(item.GetElement(3).template Get<bool>()); // <=
  80. UNIT_ASSERT(!item.GetElement(4).template Get<bool>()); // >
  81. UNIT_ASSERT(item.GetElement(5).template Get<bool>()); // >=
  82. UNIT_ASSERT(iterator.Next(item));
  83. UNIT_ASSERT(!item.GetElement(0).template Get<bool>()); // ==
  84. UNIT_ASSERT(item.GetElement(1).template Get<bool>()); // !=
  85. UNIT_ASSERT(item.GetElement(2).template Get<bool>()); // <
  86. UNIT_ASSERT(item.GetElement(3).template Get<bool>()); // <=
  87. UNIT_ASSERT(!item.GetElement(4).template Get<bool>()); // >
  88. UNIT_ASSERT(!item.GetElement(5).template Get<bool>()); // >=
  89. UNIT_ASSERT(iterator.Next(item));
  90. UNIT_ASSERT(!item.GetElement(0)); // ==
  91. UNIT_ASSERT(!item.GetElement(1)); // !=
  92. UNIT_ASSERT(!item.GetElement(2)); // <
  93. UNIT_ASSERT(!item.GetElement(3)); // <=
  94. UNIT_ASSERT(!item.GetElement(4)); // >
  95. UNIT_ASSERT(!item.GetElement(5)); // >=
  96. UNIT_ASSERT(iterator.Next(item));
  97. UNIT_ASSERT(!item.GetElement(0).template Get<bool>()); // ==
  98. UNIT_ASSERT(item.GetElement(1).template Get<bool>()); // !=
  99. UNIT_ASSERT(!item.GetElement(2).template Get<bool>()); // <
  100. UNIT_ASSERT(!item.GetElement(3).template Get<bool>()); // <=
  101. UNIT_ASSERT(item.GetElement(4).template Get<bool>()); // >
  102. UNIT_ASSERT(item.GetElement(5).template Get<bool>()); // >=
  103. UNIT_ASSERT(iterator.Next(item));
  104. UNIT_ASSERT(item.GetElement(0).template Get<bool>()); // ==
  105. UNIT_ASSERT(!item.GetElement(1).template Get<bool>()); // !=
  106. UNIT_ASSERT(!item.GetElement(2).template Get<bool>()); // <
  107. UNIT_ASSERT(item.GetElement(3).template Get<bool>()); // <=
  108. UNIT_ASSERT(!item.GetElement(4).template Get<bool>()); // >
  109. UNIT_ASSERT(item.GetElement(5).template Get<bool>()); // >=
  110. UNIT_ASSERT(!iterator.Next(item));
  111. UNIT_ASSERT(!iterator.Next(item));
  112. }
  113. Y_UNIT_TEST_LLVM(AggrString) {
  114. TSetup<LLVM> setup;
  115. TProgramBuilder& pb = *setup.PgmBuilder;
  116. auto data0 = pb.NewEmptyOptionalDataLiteral(NUdf::TDataType<char*>::Id);
  117. auto data1 = pb.NewOptional(pb.NewDataLiteral<NUdf::EDataSlot::String>("010"));
  118. auto data2 = pb.NewOptional(pb.NewDataLiteral<NUdf::EDataSlot::String>("020"));
  119. auto dataType = pb.NewDataType(NUdf::TDataType<char*>::Id);
  120. auto optionalType = pb.NewOptionalType(dataType);
  121. auto pairType = pb.NewTupleType({optionalType, optionalType});
  122. auto list = pb.NewList(pairType, {
  123. pb.NewTuple({data0, data0}),
  124. pb.NewTuple({data0, data1}),
  125. pb.NewTuple({data0, data2}),
  126. pb.NewTuple({data1, data0}),
  127. pb.NewTuple({data1, data1}),
  128. pb.NewTuple({data1, data2}),
  129. pb.NewTuple({data2, data0}),
  130. pb.NewTuple({data2, data1}),
  131. pb.NewTuple({data2, data2})
  132. });
  133. auto pgmReturn = pb.Map(list,
  134. [&](TRuntimeNode item) {
  135. return pb.NewTuple({
  136. pb.AggrEquals(pb.Nth(item, 0), pb.Nth(item, 1)),
  137. pb.AggrNotEquals(pb.Nth(item, 0), pb.Nth(item, 1)),
  138. pb.AggrLess(pb.Nth(item, 0), pb.Nth(item, 1)),
  139. pb.AggrLessOrEqual(pb.Nth(item, 0), pb.Nth(item, 1)),
  140. pb.AggrGreater(pb.Nth(item, 0), pb.Nth(item, 1)),
  141. pb.AggrGreaterOrEqual(pb.Nth(item, 0), pb.Nth(item, 1))
  142. });
  143. });
  144. auto graph = setup.BuildGraph(pgmReturn);
  145. auto iterator = graph->GetValue().GetListIterator();
  146. NUdf::TUnboxedValue item;
  147. UNIT_ASSERT(iterator.Next(item));
  148. UNIT_ASSERT(item.GetElement(0).template Get<bool>()); // ==
  149. UNIT_ASSERT(!item.GetElement(1).template Get<bool>()); // !=
  150. UNIT_ASSERT(!item.GetElement(2).template Get<bool>()); // <
  151. UNIT_ASSERT(item.GetElement(3).template Get<bool>()); // <=
  152. UNIT_ASSERT(!item.GetElement(4).template Get<bool>()); // >
  153. UNIT_ASSERT(item.GetElement(5).template Get<bool>()); // >=
  154. UNIT_ASSERT(iterator.Next(item));
  155. UNIT_ASSERT(!item.GetElement(0).template Get<bool>()); // ==
  156. UNIT_ASSERT(item.GetElement(1).template Get<bool>()); // !=
  157. UNIT_ASSERT(item.GetElement(2).template Get<bool>()); // <
  158. UNIT_ASSERT(item.GetElement(3).template Get<bool>()); // <=
  159. UNIT_ASSERT(!item.GetElement(4).template Get<bool>()); // >
  160. UNIT_ASSERT(!item.GetElement(5).template Get<bool>()); // >=
  161. UNIT_ASSERT(iterator.Next(item));
  162. UNIT_ASSERT(!item.GetElement(0).template Get<bool>()); // ==
  163. UNIT_ASSERT(item.GetElement(1).template Get<bool>()); // !=
  164. UNIT_ASSERT(item.GetElement(2).template Get<bool>()); // <
  165. UNIT_ASSERT(item.GetElement(3).template Get<bool>()); // <=
  166. UNIT_ASSERT(!item.GetElement(4).template Get<bool>()); // >
  167. UNIT_ASSERT(!item.GetElement(5).template Get<bool>()); // >=
  168. UNIT_ASSERT(iterator.Next(item));
  169. UNIT_ASSERT(!item.GetElement(0).template Get<bool>()); // ==
  170. UNIT_ASSERT(item.GetElement(1).template Get<bool>()); // !=
  171. UNIT_ASSERT(!item.GetElement(2).template Get<bool>()); // <
  172. UNIT_ASSERT(!item.GetElement(3).template Get<bool>()); // <=
  173. UNIT_ASSERT(item.GetElement(4).template Get<bool>()); // >
  174. UNIT_ASSERT(item.GetElement(5).template Get<bool>()); // >=
  175. UNIT_ASSERT(iterator.Next(item));
  176. UNIT_ASSERT(item.GetElement(0).template Get<bool>()); // ==
  177. UNIT_ASSERT(!item.GetElement(1).template Get<bool>()); // !=
  178. UNIT_ASSERT(!item.GetElement(2).template Get<bool>()); // <
  179. UNIT_ASSERT(item.GetElement(3).template Get<bool>()); // <=
  180. UNIT_ASSERT(!item.GetElement(4).template Get<bool>()); // >
  181. UNIT_ASSERT(item.GetElement(5).template Get<bool>()); // >=
  182. UNIT_ASSERT(iterator.Next(item));
  183. UNIT_ASSERT(!item.GetElement(0).template Get<bool>()); // ==
  184. UNIT_ASSERT(item.GetElement(1).template Get<bool>()); // !=
  185. UNIT_ASSERT(item.GetElement(2).template Get<bool>()); // <
  186. UNIT_ASSERT(item.GetElement(3).template Get<bool>()); // <=
  187. UNIT_ASSERT(!item.GetElement(4).template Get<bool>()); // >
  188. UNIT_ASSERT(!item.GetElement(5).template Get<bool>()); // >=
  189. UNIT_ASSERT(iterator.Next(item));
  190. UNIT_ASSERT(!item.GetElement(0).template Get<bool>()); // ==
  191. UNIT_ASSERT(item.GetElement(1).template Get<bool>()); // !=
  192. UNIT_ASSERT(!item.GetElement(2).template Get<bool>()); // <
  193. UNIT_ASSERT(!item.GetElement(3).template Get<bool>()); // <=
  194. UNIT_ASSERT(item.GetElement(4).template Get<bool>()); // >
  195. UNIT_ASSERT(item.GetElement(5).template Get<bool>()); // >=
  196. UNIT_ASSERT(iterator.Next(item));
  197. UNIT_ASSERT(!item.GetElement(0).template Get<bool>()); // ==
  198. UNIT_ASSERT(item.GetElement(1).template Get<bool>()); // !=
  199. UNIT_ASSERT(!item.GetElement(2).template Get<bool>()); // <
  200. UNIT_ASSERT(!item.GetElement(3).template Get<bool>()); // <=
  201. UNIT_ASSERT(item.GetElement(4).template Get<bool>()); // >
  202. UNIT_ASSERT(item.GetElement(5).template Get<bool>()); // >=
  203. UNIT_ASSERT(iterator.Next(item));
  204. UNIT_ASSERT(item.GetElement(0).template Get<bool>()); // ==
  205. UNIT_ASSERT(!item.GetElement(1).template Get<bool>()); // !=
  206. UNIT_ASSERT(!item.GetElement(2).template Get<bool>()); // <
  207. UNIT_ASSERT(item.GetElement(3).template Get<bool>()); // <=
  208. UNIT_ASSERT(!item.GetElement(4).template Get<bool>()); // >
  209. UNIT_ASSERT(item.GetElement(5).template Get<bool>()); // >=
  210. UNIT_ASSERT(!iterator.Next(item));
  211. UNIT_ASSERT(!iterator.Next(item));
  212. }
  213. Y_UNIT_TEST_LLVM(SqlFloats) {
  214. TSetup<LLVM> setup;
  215. TProgramBuilder& pb = *setup.PgmBuilder;
  216. auto data1 = pb.NewDataLiteral<float>(-7.0f);
  217. auto data2 = pb.NewDataLiteral<float>(3.0f);
  218. auto data3 = pb.NewDataLiteral<float>(0.0f*HUGE_VALF);
  219. auto data4 = pb.NewDataLiteral<double>(-7.0);
  220. auto data5 = pb.NewDataLiteral<double>(3.0);
  221. auto data6 = pb.NewDataLiteral<double>(0.0*HUGE_VAL);
  222. auto pairType = pb.NewTupleType({pb.NewDataType(NUdf::TDataType<float>::Id), pb.NewDataType(NUdf::TDataType<double>::Id)});
  223. auto list = pb.NewList(pairType, {
  224. pb.NewTuple({data1, data4}),
  225. pb.NewTuple({data1, data5}),
  226. pb.NewTuple({data1, data6}),
  227. pb.NewTuple({data2, data4}),
  228. pb.NewTuple({data2, data5}),
  229. pb.NewTuple({data2, data6}),
  230. pb.NewTuple({data3, data4}),
  231. pb.NewTuple({data3, data5}),
  232. pb.NewTuple({data3, data6}),
  233. });
  234. auto pgmReturn = pb.Map(list,
  235. [&](TRuntimeNode item) {
  236. return pb.NewTuple({
  237. pb.Equals(pb.Nth(item, 0), pb.Nth(item, 1)),
  238. pb.NotEquals(pb.Nth(item, 0), pb.Nth(item, 1)),
  239. pb.Less(pb.Nth(item, 0), pb.Nth(item, 1)),
  240. pb.LessOrEqual(pb.Nth(item, 0), pb.Nth(item, 1)),
  241. pb.Greater(pb.Nth(item, 0), pb.Nth(item, 1)),
  242. pb.GreaterOrEqual(pb.Nth(item, 0), pb.Nth(item, 1))
  243. });
  244. });
  245. auto graph = setup.BuildGraph(pgmReturn);
  246. auto iterator = graph->GetValue().GetListIterator();
  247. NUdf::TUnboxedValue item;
  248. UNIT_ASSERT(iterator.Next(item));
  249. UNIT_ASSERT(item.GetElement(0).template Get<bool>()); // ==
  250. UNIT_ASSERT(!item.GetElement(1).template Get<bool>()); // !=
  251. UNIT_ASSERT(!item.GetElement(2).template Get<bool>()); // <
  252. UNIT_ASSERT(item.GetElement(3).template Get<bool>()); // <=
  253. UNIT_ASSERT(!item.GetElement(4).template Get<bool>()); // >
  254. UNIT_ASSERT(item.GetElement(5).template Get<bool>()); // >=
  255. UNIT_ASSERT(iterator.Next(item));
  256. UNIT_ASSERT(!item.GetElement(0).template Get<bool>()); // ==
  257. UNIT_ASSERT(item.GetElement(1).template Get<bool>()); // !=
  258. UNIT_ASSERT(item.GetElement(2).template Get<bool>()); // <
  259. UNIT_ASSERT(item.GetElement(3).template Get<bool>()); // <=
  260. UNIT_ASSERT(!item.GetElement(4).template Get<bool>()); // >
  261. UNIT_ASSERT(!item.GetElement(5).template Get<bool>()); // >=
  262. UNIT_ASSERT(iterator.Next(item));
  263. UNIT_ASSERT(!item.GetElement(0).template Get<bool>()); // ==
  264. UNIT_ASSERT(item.GetElement(1).template Get<bool>()); // !=
  265. UNIT_ASSERT(!item.GetElement(2).template Get<bool>()); // <
  266. UNIT_ASSERT(!item.GetElement(3).template Get<bool>()); // <=
  267. UNIT_ASSERT(!item.GetElement(4).template Get<bool>()); // >
  268. UNIT_ASSERT(!item.GetElement(5).template Get<bool>()); // >=
  269. UNIT_ASSERT(iterator.Next(item));
  270. UNIT_ASSERT(!item.GetElement(0).template Get<bool>()); // ==
  271. UNIT_ASSERT(item.GetElement(1).template Get<bool>()); // !=
  272. UNIT_ASSERT(!item.GetElement(2).template Get<bool>()); // <
  273. UNIT_ASSERT(!item.GetElement(3).template Get<bool>()); // <=
  274. UNIT_ASSERT(item.GetElement(4).template Get<bool>()); // >
  275. UNIT_ASSERT(item.GetElement(5).template Get<bool>()); // >=
  276. UNIT_ASSERT(iterator.Next(item));
  277. UNIT_ASSERT(item.GetElement(0).template Get<bool>()); // ==
  278. UNIT_ASSERT(!item.GetElement(1).template Get<bool>()); // !=
  279. UNIT_ASSERT(!item.GetElement(2).template Get<bool>()); // <
  280. UNIT_ASSERT(item.GetElement(3).template Get<bool>()); // <=
  281. UNIT_ASSERT(!item.GetElement(4).template Get<bool>()); // >
  282. UNIT_ASSERT(item.GetElement(5).template Get<bool>()); // >=
  283. UNIT_ASSERT(iterator.Next(item));
  284. UNIT_ASSERT(!item.GetElement(0).template Get<bool>()); // ==
  285. UNIT_ASSERT(item.GetElement(1).template Get<bool>()); // !=
  286. UNIT_ASSERT(!item.GetElement(2).template Get<bool>()); // <
  287. UNIT_ASSERT(!item.GetElement(3).template Get<bool>()); // <=
  288. UNIT_ASSERT(!item.GetElement(4).template Get<bool>()); // >
  289. UNIT_ASSERT(!item.GetElement(5).template Get<bool>()); // >=
  290. UNIT_ASSERT(iterator.Next(item));
  291. UNIT_ASSERT(!item.GetElement(0).template Get<bool>()); // ==
  292. UNIT_ASSERT(item.GetElement(1).template Get<bool>()); // !=
  293. UNIT_ASSERT(!item.GetElement(2).template Get<bool>()); // <
  294. UNIT_ASSERT(!item.GetElement(3).template Get<bool>()); // <=
  295. UNIT_ASSERT(!item.GetElement(4).template Get<bool>()); // >
  296. UNIT_ASSERT(!item.GetElement(5).template Get<bool>()); // >=
  297. UNIT_ASSERT(iterator.Next(item));
  298. UNIT_ASSERT(!item.GetElement(0).template Get<bool>()); // ==
  299. UNIT_ASSERT(item.GetElement(1).template Get<bool>()); // !=
  300. UNIT_ASSERT(!item.GetElement(2).template Get<bool>()); // <
  301. UNIT_ASSERT(!item.GetElement(3).template Get<bool>()); // <=
  302. UNIT_ASSERT(!item.GetElement(4).template Get<bool>()); // >
  303. UNIT_ASSERT(!item.GetElement(5).template Get<bool>()); // >=
  304. UNIT_ASSERT(iterator.Next(item));
  305. UNIT_ASSERT(!item.GetElement(0).template Get<bool>()); // ==
  306. UNIT_ASSERT(item.GetElement(1).template Get<bool>()); // !=
  307. UNIT_ASSERT(!item.GetElement(2).template Get<bool>()); // <
  308. UNIT_ASSERT(!item.GetElement(3).template Get<bool>()); // <=
  309. UNIT_ASSERT(!item.GetElement(4).template Get<bool>()); // >
  310. UNIT_ASSERT(!item.GetElement(5).template Get<bool>()); // >=
  311. UNIT_ASSERT(!iterator.Next(item));
  312. UNIT_ASSERT(!iterator.Next(item));
  313. }
  314. Y_UNIT_TEST_LLVM(AggrFloats) {
  315. TSetup<LLVM> setup;
  316. TProgramBuilder& pb = *setup.PgmBuilder;
  317. auto data1 = pb.NewDataLiteral<float>(-7.0f);
  318. auto data2 = pb.NewDataLiteral<float>(3.0f);
  319. auto data3 = pb.NewDataLiteral<float>(0.0f*HUGE_VALF);
  320. auto pairType = pb.NewTupleType({pb.NewDataType(NUdf::TDataType<float>::Id), pb.NewDataType(NUdf::TDataType<float>::Id)});
  321. auto list = pb.NewList(pairType, {
  322. pb.NewTuple({data1, data1}),
  323. pb.NewTuple({data1, data2}),
  324. pb.NewTuple({data1, data3}),
  325. pb.NewTuple({data2, data1}),
  326. pb.NewTuple({data2, data2}),
  327. pb.NewTuple({data2, data3}),
  328. pb.NewTuple({data3, data1}),
  329. pb.NewTuple({data3, data2}),
  330. pb.NewTuple({data3, data3}),
  331. });
  332. auto pgmReturn = pb.Map(list,
  333. [&](TRuntimeNode item) {
  334. return pb.NewTuple({
  335. pb.AggrEquals(pb.Nth(item, 0), pb.Nth(item, 1)),
  336. pb.AggrNotEquals(pb.Nth(item, 0), pb.Nth(item, 1)),
  337. pb.AggrLess(pb.Nth(item, 0), pb.Nth(item, 1)),
  338. pb.AggrLessOrEqual(pb.Nth(item, 0), pb.Nth(item, 1)),
  339. pb.AggrGreater(pb.Nth(item, 0), pb.Nth(item, 1)),
  340. pb.AggrGreaterOrEqual(pb.Nth(item, 0), pb.Nth(item, 1))
  341. });
  342. });
  343. auto graph = setup.BuildGraph(pgmReturn);
  344. auto iterator = graph->GetValue().GetListIterator();
  345. NUdf::TUnboxedValue item;
  346. UNIT_ASSERT(iterator.Next(item));
  347. UNIT_ASSERT(item.GetElement(0).template Get<bool>()); // ==
  348. UNIT_ASSERT(!item.GetElement(1).template Get<bool>()); // !=
  349. UNIT_ASSERT(!item.GetElement(2).template Get<bool>()); // <
  350. UNIT_ASSERT(item.GetElement(3).template Get<bool>()); // <=
  351. UNIT_ASSERT(!item.GetElement(4).template Get<bool>()); // >
  352. UNIT_ASSERT(item.GetElement(5).template Get<bool>()); // >=
  353. UNIT_ASSERT(iterator.Next(item));
  354. UNIT_ASSERT(!item.GetElement(0).template Get<bool>()); // ==
  355. UNIT_ASSERT(item.GetElement(1).template Get<bool>()); // !=
  356. UNIT_ASSERT(item.GetElement(2).template Get<bool>()); // <
  357. UNIT_ASSERT(item.GetElement(3).template Get<bool>()); // <=
  358. UNIT_ASSERT(!item.GetElement(4).template Get<bool>()); // >
  359. UNIT_ASSERT(!item.GetElement(5).template Get<bool>()); // >=
  360. UNIT_ASSERT(iterator.Next(item));
  361. UNIT_ASSERT(!item.GetElement(0).template Get<bool>()); // ==
  362. UNIT_ASSERT(item.GetElement(1).template Get<bool>()); // !=
  363. UNIT_ASSERT(item.GetElement(2).template Get<bool>()); // <
  364. UNIT_ASSERT(item.GetElement(3).template Get<bool>()); // <=
  365. UNIT_ASSERT(!item.GetElement(4).template Get<bool>()); // >
  366. UNIT_ASSERT(!item.GetElement(5).template Get<bool>()); // >=
  367. UNIT_ASSERT(iterator.Next(item));
  368. UNIT_ASSERT(!item.GetElement(0).template Get<bool>()); // ==
  369. UNIT_ASSERT(item.GetElement(1).template Get<bool>()); // !=
  370. UNIT_ASSERT(!item.GetElement(2).template Get<bool>()); // <
  371. UNIT_ASSERT(!item.GetElement(3).template Get<bool>()); // <=
  372. UNIT_ASSERT(item.GetElement(4).template Get<bool>()); // >
  373. UNIT_ASSERT(item.GetElement(5).template Get<bool>()); // >=
  374. UNIT_ASSERT(iterator.Next(item));
  375. UNIT_ASSERT(item.GetElement(0).template Get<bool>()); // ==
  376. UNIT_ASSERT(!item.GetElement(1).template Get<bool>()); // !=
  377. UNIT_ASSERT(!item.GetElement(2).template Get<bool>()); // <
  378. UNIT_ASSERT(item.GetElement(3).template Get<bool>()); // <=
  379. UNIT_ASSERT(!item.GetElement(4).template Get<bool>()); // >
  380. UNIT_ASSERT(item.GetElement(5).template Get<bool>()); // >=
  381. UNIT_ASSERT(iterator.Next(item));
  382. UNIT_ASSERT(!item.GetElement(0).template Get<bool>()); // ==
  383. UNIT_ASSERT(item.GetElement(1).template Get<bool>()); // !=
  384. UNIT_ASSERT(item.GetElement(2).template Get<bool>()); // <
  385. UNIT_ASSERT(item.GetElement(3).template Get<bool>()); // <=
  386. UNIT_ASSERT(!item.GetElement(4).template Get<bool>()); // >
  387. UNIT_ASSERT(!item.GetElement(5).template Get<bool>()); // >=
  388. UNIT_ASSERT(iterator.Next(item));
  389. UNIT_ASSERT(!item.GetElement(0).template Get<bool>()); // ==
  390. UNIT_ASSERT(item.GetElement(1).template Get<bool>()); // !=
  391. UNIT_ASSERT(!item.GetElement(2).template Get<bool>()); // <
  392. UNIT_ASSERT(!item.GetElement(3).template Get<bool>()); // <=
  393. UNIT_ASSERT(item.GetElement(4).template Get<bool>()); // >
  394. UNIT_ASSERT(item.GetElement(5).template Get<bool>()); // >=
  395. UNIT_ASSERT(iterator.Next(item));
  396. UNIT_ASSERT(!item.GetElement(0).template Get<bool>()); // ==
  397. UNIT_ASSERT(item.GetElement(1).template Get<bool>()); // !=
  398. UNIT_ASSERT(!item.GetElement(2).template Get<bool>()); // <
  399. UNIT_ASSERT(!item.GetElement(3).template Get<bool>()); // <=
  400. UNIT_ASSERT(item.GetElement(4).template Get<bool>()); // >
  401. UNIT_ASSERT(item.GetElement(5).template Get<bool>()); // >=
  402. UNIT_ASSERT(iterator.Next(item));
  403. UNIT_ASSERT(item.GetElement(0).template Get<bool>()); // ==
  404. UNIT_ASSERT(!item.GetElement(1).template Get<bool>()); // !=
  405. UNIT_ASSERT(!item.GetElement(2).template Get<bool>()); // <
  406. UNIT_ASSERT(item.GetElement(3).template Get<bool>()); // <=
  407. UNIT_ASSERT(!item.GetElement(4).template Get<bool>()); // >
  408. UNIT_ASSERT(item.GetElement(5).template Get<bool>()); // >=
  409. UNIT_ASSERT(!iterator.Next(item));
  410. UNIT_ASSERT(!iterator.Next(item));
  411. }
  412. Y_UNIT_TEST_LLVM(SqlSigned) {
  413. TSetup<LLVM> setup;
  414. TProgramBuilder& pb = *setup.PgmBuilder;
  415. auto data1 = pb.NewDataLiteral<i16>(-1);
  416. auto data2 = pb.NewDataLiteral<i16>(+1);
  417. auto data3 = pb.NewDataLiteral<i32>(-1);
  418. auto data4 = pb.NewDataLiteral<i32>(+1);
  419. auto pairType = pb.NewTupleType({pb.NewDataType(NUdf::TDataType<i16>::Id), pb.NewDataType(NUdf::TDataType<i32>::Id)});
  420. auto list = pb.NewList(pairType, {
  421. pb.NewTuple({data1, data3}),
  422. pb.NewTuple({data1, data4}),
  423. pb.NewTuple({data2, data3}),
  424. pb.NewTuple({data2, data4})
  425. });
  426. auto pgmReturn = pb.Map(list,
  427. [&](TRuntimeNode item) {
  428. return pb.NewTuple({
  429. pb.Equals(pb.Nth(item, 0), pb.Nth(item, 1)),
  430. pb.NotEquals(pb.Nth(item, 0), pb.Nth(item, 1)),
  431. pb.Less(pb.Nth(item, 0), pb.Nth(item, 1)),
  432. pb.LessOrEqual(pb.Nth(item, 0), pb.Nth(item, 1)),
  433. pb.Greater(pb.Nth(item, 0), pb.Nth(item, 1)),
  434. pb.GreaterOrEqual(pb.Nth(item, 0), pb.Nth(item, 1))
  435. });
  436. });
  437. auto graph = setup.BuildGraph(pgmReturn);
  438. auto iterator = graph->GetValue().GetListIterator();
  439. NUdf::TUnboxedValue item;
  440. UNIT_ASSERT(iterator.Next(item));
  441. UNIT_ASSERT(item.GetElement(0).template Get<bool>()); // ==
  442. UNIT_ASSERT(!item.GetElement(1).template Get<bool>()); // !=
  443. UNIT_ASSERT(!item.GetElement(2).template Get<bool>()); // <
  444. UNIT_ASSERT(item.GetElement(3).template Get<bool>()); // <=
  445. UNIT_ASSERT(!item.GetElement(4).template Get<bool>()); // >
  446. UNIT_ASSERT(item.GetElement(5).template Get<bool>()); // >=
  447. UNIT_ASSERT(iterator.Next(item));
  448. UNIT_ASSERT(!item.GetElement(0).template Get<bool>()); // ==
  449. UNIT_ASSERT(item.GetElement(1).template Get<bool>()); // !=
  450. UNIT_ASSERT(item.GetElement(2).template Get<bool>()); // <
  451. UNIT_ASSERT(item.GetElement(3).template Get<bool>()); // <=
  452. UNIT_ASSERT(!item.GetElement(4).template Get<bool>()); // >
  453. UNIT_ASSERT(!item.GetElement(5).template Get<bool>()); // >=
  454. UNIT_ASSERT(iterator.Next(item));
  455. UNIT_ASSERT(!item.GetElement(0).template Get<bool>()); // ==
  456. UNIT_ASSERT(item.GetElement(1).template Get<bool>()); // !=
  457. UNIT_ASSERT(!item.GetElement(2).template Get<bool>()); // <
  458. UNIT_ASSERT(!item.GetElement(3).template Get<bool>()); // <=
  459. UNIT_ASSERT(item.GetElement(4).template Get<bool>()); // >
  460. UNIT_ASSERT(item.GetElement(5).template Get<bool>()); // >=
  461. UNIT_ASSERT(iterator.Next(item));
  462. UNIT_ASSERT(item.GetElement(0).template Get<bool>()); // ==
  463. UNIT_ASSERT(!item.GetElement(1).template Get<bool>()); // !=
  464. UNIT_ASSERT(!item.GetElement(2).template Get<bool>()); // <
  465. UNIT_ASSERT(item.GetElement(3).template Get<bool>()); // <=
  466. UNIT_ASSERT(!item.GetElement(4).template Get<bool>()); // >
  467. UNIT_ASSERT(item.GetElement(5).template Get<bool>()); // >=
  468. UNIT_ASSERT(!iterator.Next(item));
  469. UNIT_ASSERT(!iterator.Next(item));
  470. }
  471. Y_UNIT_TEST_LLVM(SqlSignedAndUnsigned) {
  472. TSetup<LLVM> setup;
  473. TProgramBuilder& pb = *setup.PgmBuilder;
  474. auto data1 = pb.NewDataLiteral<i8>(-1);
  475. auto data2 = pb.NewDataLiteral<i8>(127);
  476. auto data3 = pb.NewDataLiteral<ui8>(0xFF);
  477. auto data4 = pb.NewDataLiteral<ui8>(127);
  478. auto pairType = pb.NewTupleType({pb.NewDataType(NUdf::TDataType<i8>::Id), pb.NewDataType(NUdf::TDataType<ui8>::Id)});
  479. auto list = pb.NewList(pairType, {
  480. pb.NewTuple({data1, data3}),
  481. pb.NewTuple({data1, data4}),
  482. pb.NewTuple({data2, data3}),
  483. pb.NewTuple({data2, data4})
  484. });
  485. auto pgmReturn = pb.Map(list,
  486. [&](TRuntimeNode item) {
  487. return pb.NewTuple({
  488. pb.Equals(pb.Nth(item, 0), pb.Nth(item, 1)),
  489. pb.NotEquals(pb.Nth(item, 0), pb.Nth(item, 1)),
  490. pb.Less(pb.Nth(item, 0), pb.Nth(item, 1)),
  491. pb.LessOrEqual(pb.Nth(item, 0), pb.Nth(item, 1)),
  492. pb.Greater(pb.Nth(item, 0), pb.Nth(item, 1)),
  493. pb.GreaterOrEqual(pb.Nth(item, 0), pb.Nth(item, 1))
  494. });
  495. });
  496. auto graph = setup.BuildGraph(pgmReturn);
  497. auto iterator = graph->GetValue().GetListIterator();
  498. NUdf::TUnboxedValue item;
  499. UNIT_ASSERT(iterator.Next(item));
  500. UNIT_ASSERT(!item.GetElement(0).template Get<bool>()); // ==
  501. UNIT_ASSERT(item.GetElement(1).template Get<bool>()); // !=
  502. UNIT_ASSERT(item.GetElement(2).template Get<bool>()); // <
  503. UNIT_ASSERT(item.GetElement(3).template Get<bool>()); // <=
  504. UNIT_ASSERT(!item.GetElement(4).template Get<bool>()); // >
  505. UNIT_ASSERT(!item.GetElement(5).template Get<bool>()); // >=
  506. UNIT_ASSERT(iterator.Next(item));
  507. UNIT_ASSERT(!item.GetElement(0).template Get<bool>()); // ==
  508. UNIT_ASSERT(item.GetElement(1).template Get<bool>()); // !=
  509. UNIT_ASSERT(item.GetElement(2).template Get<bool>()); // <
  510. UNIT_ASSERT(item.GetElement(3).template Get<bool>()); // <=
  511. UNIT_ASSERT(!item.GetElement(4).template Get<bool>()); // >
  512. UNIT_ASSERT(!item.GetElement(5).template Get<bool>()); // >=
  513. UNIT_ASSERT(iterator.Next(item));
  514. UNIT_ASSERT(!item.GetElement(0).template Get<bool>()); // ==
  515. UNIT_ASSERT(item.GetElement(1).template Get<bool>()); // !=
  516. UNIT_ASSERT(item.GetElement(2).template Get<bool>()); // <
  517. UNIT_ASSERT(item.GetElement(3).template Get<bool>()); // <=
  518. UNIT_ASSERT(!item.GetElement(4).template Get<bool>()); // >
  519. UNIT_ASSERT(!item.GetElement(5).template Get<bool>()); // >=
  520. UNIT_ASSERT(iterator.Next(item));
  521. UNIT_ASSERT(item.GetElement(0).template Get<bool>()); // ==
  522. UNIT_ASSERT(!item.GetElement(1).template Get<bool>()); // !=
  523. UNIT_ASSERT(!item.GetElement(2).template Get<bool>()); // <
  524. UNIT_ASSERT(item.GetElement(3).template Get<bool>()); // <=
  525. UNIT_ASSERT(!item.GetElement(4).template Get<bool>()); // >
  526. UNIT_ASSERT(item.GetElement(5).template Get<bool>()); // >=
  527. UNIT_ASSERT(!iterator.Next(item));
  528. UNIT_ASSERT(!iterator.Next(item));
  529. }
  530. Y_UNIT_TEST_LLVM(SqlUnsignedAndSigned) {
  531. TSetup<LLVM> setup;
  532. TProgramBuilder& pb = *setup.PgmBuilder;
  533. auto data1 = pb.NewDataLiteral<ui16>(0);
  534. auto data2 = pb.NewDataLiteral<ui16>(0xFFFF);
  535. auto data3 = pb.NewDataLiteral<i64>(-1);
  536. auto data4 = pb.NewDataLiteral<i64>(0xFFFF);
  537. auto pairType = pb.NewTupleType({pb.NewDataType(NUdf::TDataType<ui16>::Id), pb.NewDataType(NUdf::TDataType<i64>::Id)});
  538. auto list = pb.NewList(pairType, {
  539. pb.NewTuple({data1, data3}),
  540. pb.NewTuple({data1, data4}),
  541. pb.NewTuple({data2, data3}),
  542. pb.NewTuple({data2, data4})
  543. });
  544. auto pgmReturn = pb.Map(list,
  545. [&](TRuntimeNode item) {
  546. return pb.NewTuple({
  547. pb.Equals(pb.Nth(item, 0), pb.Nth(item, 1)),
  548. pb.NotEquals(pb.Nth(item, 0), pb.Nth(item, 1)),
  549. pb.Less(pb.Nth(item, 0), pb.Nth(item, 1)),
  550. pb.LessOrEqual(pb.Nth(item, 0), pb.Nth(item, 1)),
  551. pb.Greater(pb.Nth(item, 0), pb.Nth(item, 1)),
  552. pb.GreaterOrEqual(pb.Nth(item, 0), pb.Nth(item, 1))
  553. });
  554. });
  555. auto graph = setup.BuildGraph(pgmReturn);
  556. auto iterator = graph->GetValue().GetListIterator();
  557. NUdf::TUnboxedValue item;
  558. UNIT_ASSERT(iterator.Next(item));
  559. UNIT_ASSERT(!item.GetElement(0).template Get<bool>()); // ==
  560. UNIT_ASSERT(item.GetElement(1).template Get<bool>()); // !=
  561. UNIT_ASSERT(!item.GetElement(2).template Get<bool>()); // <
  562. UNIT_ASSERT(!item.GetElement(3).template Get<bool>()); // <=
  563. UNIT_ASSERT(item.GetElement(4).template Get<bool>()); // >
  564. UNIT_ASSERT(item.GetElement(5).template Get<bool>()); // >=
  565. UNIT_ASSERT(iterator.Next(item));
  566. UNIT_ASSERT(!item.GetElement(0).template Get<bool>()); // ==
  567. UNIT_ASSERT(item.GetElement(1).template Get<bool>()); // !=
  568. UNIT_ASSERT(item.GetElement(2).template Get<bool>()); // <
  569. UNIT_ASSERT(item.GetElement(3).template Get<bool>()); // <=
  570. UNIT_ASSERT(!item.GetElement(4).template Get<bool>()); // >
  571. UNIT_ASSERT(!item.GetElement(5).template Get<bool>()); // >=
  572. UNIT_ASSERT(iterator.Next(item));
  573. UNIT_ASSERT(!item.GetElement(0).template Get<bool>()); // ==
  574. UNIT_ASSERT(item.GetElement(1).template Get<bool>()); // !=
  575. UNIT_ASSERT(!item.GetElement(2).template Get<bool>()); // <
  576. UNIT_ASSERT(!item.GetElement(3).template Get<bool>()); // <=
  577. UNIT_ASSERT(item.GetElement(4).template Get<bool>()); // >
  578. UNIT_ASSERT(item.GetElement(5).template Get<bool>()); // >=
  579. UNIT_ASSERT(iterator.Next(item));
  580. UNIT_ASSERT(item.GetElement(0).template Get<bool>()); // ==
  581. UNIT_ASSERT(!item.GetElement(1).template Get<bool>()); // !=
  582. UNIT_ASSERT(!item.GetElement(2).template Get<bool>()); // <
  583. UNIT_ASSERT(item.GetElement(3).template Get<bool>()); // <=
  584. UNIT_ASSERT(!item.GetElement(4).template Get<bool>()); // >
  585. UNIT_ASSERT(item.GetElement(5).template Get<bool>()); // >=
  586. UNIT_ASSERT(!iterator.Next(item));
  587. UNIT_ASSERT(!iterator.Next(item));
  588. }
  589. Y_UNIT_TEST_LLVM(SimpleSqlString) {
  590. TSetup<LLVM> setup;
  591. TProgramBuilder& pb = *setup.PgmBuilder;
  592. auto opt1 = pb.NewOptional(pb.NewDataLiteral<ui32>(1));
  593. auto opt2 = pb.NewOptional(pb.NewDataLiteral<ui32>(2));
  594. auto optEmpty = pb.NewEmptyOptionalDataLiteral(NUdf::TDataType<ui32>::Id);
  595. auto pgmReturn = pb.NewEmptyList(pb.NewOptionalType(pb.NewDataType(NUdf::TDataType<bool>::Id)));
  596. pgmReturn = pb.Append(pgmReturn, pb.Equals(opt1, opt1));
  597. pgmReturn = pb.Append(pgmReturn, pb.Equals(opt1, opt2));
  598. pgmReturn = pb.Append(pgmReturn, pb.Equals(opt1, optEmpty));
  599. pgmReturn = pb.Append(pgmReturn, pb.Equals(optEmpty, opt2));
  600. pgmReturn = pb.Append(pgmReturn, pb.Equals(optEmpty, optEmpty));
  601. pgmReturn = pb.Append(pgmReturn, pb.NotEquals(opt1, opt1));
  602. pgmReturn = pb.Append(pgmReturn, pb.NotEquals(opt1, opt2));
  603. pgmReturn = pb.Append(pgmReturn, pb.NotEquals(opt1, optEmpty));
  604. pgmReturn = pb.Append(pgmReturn, pb.NotEquals(optEmpty, opt2));
  605. pgmReturn = pb.Append(pgmReturn, pb.NotEquals(optEmpty, optEmpty));
  606. pgmReturn = pb.Append(pgmReturn, pb.Less(opt1, opt1));
  607. pgmReturn = pb.Append(pgmReturn, pb.Less(opt1, opt2));
  608. pgmReturn = pb.Append(pgmReturn, pb.Less(opt2, opt1));
  609. pgmReturn = pb.Append(pgmReturn, pb.Less(opt1, optEmpty));
  610. pgmReturn = pb.Append(pgmReturn, pb.Less(optEmpty, opt2));
  611. pgmReturn = pb.Append(pgmReturn, pb.Less(optEmpty, optEmpty));
  612. pgmReturn = pb.Append(pgmReturn, pb.LessOrEqual(opt1, opt1));
  613. pgmReturn = pb.Append(pgmReturn, pb.LessOrEqual(opt1, opt2));
  614. pgmReturn = pb.Append(pgmReturn, pb.LessOrEqual(opt2, opt1));
  615. pgmReturn = pb.Append(pgmReturn, pb.LessOrEqual(opt1, optEmpty));
  616. pgmReturn = pb.Append(pgmReturn, pb.LessOrEqual(optEmpty, opt2));
  617. pgmReturn = pb.Append(pgmReturn, pb.LessOrEqual(optEmpty, optEmpty));
  618. pgmReturn = pb.Append(pgmReturn, pb.Greater(opt1, opt1));
  619. pgmReturn = pb.Append(pgmReturn, pb.Greater(opt1, opt2));
  620. pgmReturn = pb.Append(pgmReturn, pb.Greater(opt2, opt1));
  621. pgmReturn = pb.Append(pgmReturn, pb.Greater(opt1, optEmpty));
  622. pgmReturn = pb.Append(pgmReturn, pb.Greater(optEmpty, opt2));
  623. pgmReturn = pb.Append(pgmReturn, pb.Greater(optEmpty, optEmpty));
  624. pgmReturn = pb.Append(pgmReturn, pb.GreaterOrEqual(opt1, opt1));
  625. pgmReturn = pb.Append(pgmReturn, pb.GreaterOrEqual(opt1, opt2));
  626. pgmReturn = pb.Append(pgmReturn, pb.GreaterOrEqual(opt2, opt1));
  627. pgmReturn = pb.Append(pgmReturn, pb.GreaterOrEqual(opt1, optEmpty));
  628. pgmReturn = pb.Append(pgmReturn, pb.GreaterOrEqual(optEmpty, opt2));
  629. pgmReturn = pb.Append(pgmReturn, pb.GreaterOrEqual(optEmpty, optEmpty));
  630. auto opt1s = pb.NewOptional(pb.NewDataLiteral<NUdf::EDataSlot::String>("A"));
  631. auto opt2s = pb.NewOptional(pb.NewDataLiteral<NUdf::EDataSlot::String>("B"));
  632. auto optEmptys = pb.NewEmptyOptionalDataLiteral(NUdf::TDataType<char*>::Id);
  633. pgmReturn = pb.Append(pgmReturn, pb.Equals(opt1s, opt1s));
  634. pgmReturn = pb.Append(pgmReturn, pb.Equals(opt1s, opt2s));
  635. pgmReturn = pb.Append(pgmReturn, pb.Equals(opt1s, optEmptys));
  636. pgmReturn = pb.Append(pgmReturn, pb.Equals(optEmptys, opt2s));
  637. pgmReturn = pb.Append(pgmReturn, pb.Equals(optEmptys, optEmptys));
  638. pgmReturn = pb.Append(pgmReturn, pb.NotEquals(opt1s, opt1s));
  639. pgmReturn = pb.Append(pgmReturn, pb.NotEquals(opt1s, opt2s));
  640. pgmReturn = pb.Append(pgmReturn, pb.NotEquals(opt1s, optEmptys));
  641. pgmReturn = pb.Append(pgmReturn, pb.NotEquals(optEmptys, opt2s));
  642. pgmReturn = pb.Append(pgmReturn, pb.NotEquals(optEmptys, optEmptys));
  643. auto graph = setup.BuildGraph(pgmReturn);
  644. auto iterator = graph->GetValue().GetListIterator();
  645. NUdf::TUnboxedValue item;
  646. // equals
  647. UNIT_ASSERT(iterator.Next(item));
  648. UNIT_ASSERT_VALUES_EQUAL(item.template Get<bool>(), true);
  649. UNIT_ASSERT(iterator.Next(item));
  650. UNIT_ASSERT_VALUES_EQUAL(item.template Get<bool>(), false);
  651. UNIT_ASSERT(iterator.Next(item));
  652. UNIT_ASSERT(!item);
  653. UNIT_ASSERT(iterator.Next(item));
  654. UNIT_ASSERT(!item);
  655. UNIT_ASSERT(iterator.Next(item));
  656. UNIT_ASSERT(!item);
  657. // not equals
  658. UNIT_ASSERT(iterator.Next(item));
  659. UNIT_ASSERT_VALUES_EQUAL(item.template Get<bool>(), false);
  660. UNIT_ASSERT(iterator.Next(item));
  661. UNIT_ASSERT_VALUES_EQUAL(item.template Get<bool>(), true);
  662. UNIT_ASSERT(iterator.Next(item));
  663. UNIT_ASSERT(!item);
  664. UNIT_ASSERT(iterator.Next(item));
  665. UNIT_ASSERT(!item);
  666. UNIT_ASSERT(iterator.Next(item));
  667. UNIT_ASSERT(!item);
  668. // less
  669. UNIT_ASSERT(iterator.Next(item));
  670. UNIT_ASSERT_VALUES_EQUAL(item.template Get<bool>(), false);
  671. UNIT_ASSERT(iterator.Next(item));
  672. UNIT_ASSERT_VALUES_EQUAL(item.template Get<bool>(), true);
  673. UNIT_ASSERT(iterator.Next(item));
  674. UNIT_ASSERT_VALUES_EQUAL(item.template Get<bool>(), false);
  675. UNIT_ASSERT(iterator.Next(item));
  676. UNIT_ASSERT(!item);
  677. UNIT_ASSERT(iterator.Next(item));
  678. UNIT_ASSERT(!item);
  679. UNIT_ASSERT(iterator.Next(item));
  680. UNIT_ASSERT(!item);
  681. // less or equal
  682. UNIT_ASSERT(iterator.Next(item));
  683. UNIT_ASSERT_VALUES_EQUAL(item.template Get<bool>(), true);
  684. UNIT_ASSERT(iterator.Next(item));
  685. UNIT_ASSERT_VALUES_EQUAL(item.template Get<bool>(), true);
  686. UNIT_ASSERT(iterator.Next(item));
  687. UNIT_ASSERT_VALUES_EQUAL(item.template Get<bool>(), false);
  688. UNIT_ASSERT(iterator.Next(item));
  689. UNIT_ASSERT(!item);
  690. UNIT_ASSERT(iterator.Next(item));
  691. UNIT_ASSERT(!item);
  692. UNIT_ASSERT(iterator.Next(item));
  693. UNIT_ASSERT(!item);
  694. // greater
  695. UNIT_ASSERT(iterator.Next(item));
  696. UNIT_ASSERT_VALUES_EQUAL(item.template Get<bool>(), false);
  697. UNIT_ASSERT(iterator.Next(item));
  698. UNIT_ASSERT_VALUES_EQUAL(item.template Get<bool>(), false);
  699. UNIT_ASSERT(iterator.Next(item));
  700. UNIT_ASSERT_VALUES_EQUAL(item.template Get<bool>(), true);
  701. UNIT_ASSERT(iterator.Next(item));
  702. UNIT_ASSERT(!item);
  703. UNIT_ASSERT(iterator.Next(item));
  704. UNIT_ASSERT(!item);
  705. UNIT_ASSERT(iterator.Next(item));
  706. UNIT_ASSERT(!item);
  707. // greater or equal
  708. UNIT_ASSERT(iterator.Next(item));
  709. UNIT_ASSERT_VALUES_EQUAL(item.template Get<bool>(), true);
  710. UNIT_ASSERT(iterator.Next(item));
  711. UNIT_ASSERT_VALUES_EQUAL(item.template Get<bool>(), false);
  712. UNIT_ASSERT(iterator.Next(item));
  713. UNIT_ASSERT_VALUES_EQUAL(item.template Get<bool>(), true);
  714. UNIT_ASSERT(iterator.Next(item));
  715. UNIT_ASSERT(!item);
  716. UNIT_ASSERT(iterator.Next(item));
  717. UNIT_ASSERT(!item);
  718. UNIT_ASSERT(iterator.Next(item));
  719. UNIT_ASSERT(!item);
  720. // equals - string
  721. UNIT_ASSERT(iterator.Next(item));
  722. UNIT_ASSERT_VALUES_EQUAL(item.template Get<bool>(), true);
  723. UNIT_ASSERT(iterator.Next(item));
  724. UNIT_ASSERT_VALUES_EQUAL(item.template Get<bool>(), false);
  725. UNIT_ASSERT(iterator.Next(item));
  726. UNIT_ASSERT(!item);
  727. UNIT_ASSERT(iterator.Next(item));
  728. UNIT_ASSERT(!item);
  729. UNIT_ASSERT(iterator.Next(item));
  730. UNIT_ASSERT(!item);
  731. // not equals - string
  732. UNIT_ASSERT(iterator.Next(item));
  733. UNIT_ASSERT_VALUES_EQUAL(item.template Get<bool>(), false);
  734. UNIT_ASSERT(iterator.Next(item));
  735. UNIT_ASSERT_VALUES_EQUAL(item.template Get<bool>(), true);
  736. UNIT_ASSERT(iterator.Next(item));
  737. UNIT_ASSERT(!item);
  738. UNIT_ASSERT(iterator.Next(item));
  739. UNIT_ASSERT(!item);
  740. UNIT_ASSERT(iterator.Next(item));
  741. UNIT_ASSERT(!item);
  742. UNIT_ASSERT(!iterator.Next(item));
  743. UNIT_ASSERT(!iterator.Next(item));
  744. }
  745. Y_UNIT_TEST_LLVM(TzMin) {
  746. TSetup<LLVM> setup;
  747. TProgramBuilder& pb = *setup.PgmBuilder;
  748. const auto data1 = pb.NewDataLiteral<ui16>(1ULL);
  749. const auto data2 = pb.NewDataLiteral<ui16>(7ULL);
  750. const auto data3 = pb.NewDataLiteral<ui32>(1ULL);
  751. const auto data4 = pb.NewDataLiteral<ui32>(7ULL);
  752. const auto zones = pb.ListFromRange(data1, data2, data1);
  753. const auto dates = pb.ListFromRange(data3, data4, data3);
  754. const auto source = pb.Map(pb.Zip({pb.Reverse(dates), zones}),
  755. [&](TRuntimeNode item) {
  756. return pb.AddTimezone(pb.ToIntegral(pb.Nth(item, 0U), pb.NewDataType(NUdf::EDataSlot::Datetime, true)), pb.Nth(item, 1U));
  757. });
  758. const auto pgmReturn = pb.ToString(pb.Unwrap(pb.Fold1(source,
  759. [&](TRuntimeNode item) { return item; },
  760. [&](TRuntimeNode item, TRuntimeNode state) { return pb.Min(item, state); }
  761. ), pb.NewDataLiteral<NUdf::EDataSlot::String>(""), __FILE__, __LINE__, 0));
  762. const auto graph = setup.BuildGraph(pgmReturn);
  763. const auto result = graph->GetValue();
  764. UNBOXED_VALUE_STR_EQUAL(result, "1970-01-01T03:00:01,Africa/Asmara");
  765. }
  766. Y_UNIT_TEST_LLVM(TzMax) {
  767. TSetup<LLVM> setup;
  768. TProgramBuilder& pb = *setup.PgmBuilder;
  769. const auto data1 = pb.NewDataLiteral<ui16>(1ULL);
  770. const auto data2 = pb.NewDataLiteral<ui16>(7ULL);
  771. const auto data3 = pb.NewDataLiteral<ui32>(1ULL);
  772. const auto data4 = pb.NewDataLiteral<ui32>(7ULL);
  773. const auto zones = pb.ListFromRange(data1, data2, data1);
  774. const auto dates = pb.ListFromRange(data3, data4, data3);
  775. const auto source = pb.Map(pb.Zip({dates, pb.Reverse(zones)}),
  776. [&](TRuntimeNode item) {
  777. return pb.AddTimezone(pb.ToIntegral(pb.Nth(item, 0U), pb.NewDataType(NUdf::EDataSlot::Datetime, true)), pb.Nth(item, 1U));
  778. });
  779. const auto pgmReturn = pb.ToString(pb.Unwrap(pb.Fold1(source,
  780. [&](TRuntimeNode item) { return item; },
  781. [&](TRuntimeNode item, TRuntimeNode state) { return pb.Max(item, state); }
  782. ), pb.NewDataLiteral<NUdf::EDataSlot::String>(""), __FILE__, __LINE__, 0));
  783. const auto graph = setup.BuildGraph(pgmReturn);
  784. const auto result = graph->GetValue();
  785. UNBOXED_VALUE_STR_EQUAL(result, "1970-01-01T03:00:06,Europe/Moscow");
  786. }
  787. Y_UNIT_TEST_LLVM(TzAggrMin) {
  788. TSetup<LLVM> setup;
  789. TProgramBuilder& pb = *setup.PgmBuilder;
  790. const auto data1 = pb.NewDataLiteral<ui16>(1ULL);
  791. const auto data2 = pb.NewDataLiteral<ui16>(7ULL);
  792. const auto data3 = pb.NewDataLiteral<ui32>(1ULL);
  793. const auto data4 = pb.NewDataLiteral<ui32>(7ULL);
  794. const auto zones = pb.ListFromRange(data1, data2, data1);
  795. const auto dates = pb.ListFromRange(data3, data4, data3);
  796. const auto source = pb.FlatMap(zones,
  797. [&](TRuntimeNode zone) {
  798. return pb.Map(dates,
  799. [&](TRuntimeNode date) {
  800. return pb.AddTimezone(pb.ToIntegral(date, pb.NewDataType(NUdf::EDataSlot::Datetime, true)), zone);
  801. });
  802. });
  803. const auto pgmReturn = pb.ToString(pb.Unwrap(pb.Fold1(source,
  804. [&](TRuntimeNode item) { return item; },
  805. [&](TRuntimeNode item, TRuntimeNode state) { return pb.AggrMin(item, state); }
  806. ), pb.NewDataLiteral<NUdf::EDataSlot::String>(""), __FILE__, __LINE__, 0));
  807. const auto graph = setup.BuildGraph(pgmReturn);
  808. const auto result = graph->GetValue();
  809. UNBOXED_VALUE_STR_EQUAL(result, "1970-01-01T03:00:01,Europe/Moscow");
  810. }
  811. Y_UNIT_TEST_LLVM(TzAggrMax) {
  812. TSetup<LLVM> setup;
  813. TProgramBuilder& pb = *setup.PgmBuilder;
  814. const auto data1 = pb.NewDataLiteral<ui16>(1ULL);
  815. const auto data2 = pb.NewDataLiteral<ui16>(7ULL);
  816. const auto data3 = pb.NewDataLiteral<ui32>(1ULL);
  817. const auto data4 = pb.NewDataLiteral<ui32>(7ULL);
  818. const auto zones = pb.ListFromRange(data1, data2, data1);
  819. const auto dates = pb.ListFromRange(data3, data4, data3);
  820. const auto source = pb.FlatMap(dates,
  821. [&](TRuntimeNode date) {
  822. return pb.Map(zones,
  823. [&](TRuntimeNode zone) {
  824. return pb.AddTimezone(pb.ToIntegral(date, pb.NewDataType(NUdf::EDataSlot::Datetime, true)), zone);
  825. });
  826. });
  827. const auto pgmReturn = pb.ToString(pb.Unwrap(pb.Fold1(source,
  828. [&](TRuntimeNode item) { return item; },
  829. [&](TRuntimeNode item, TRuntimeNode state) { return pb.AggrMax(item, state); }
  830. ), pb.NewDataLiteral<NUdf::EDataSlot::String>(""), __FILE__, __LINE__, 0));
  831. const auto graph = setup.BuildGraph(pgmReturn);
  832. const auto result = graph->GetValue();
  833. UNBOXED_VALUE_STR_EQUAL(result, "1970-01-01T03:00:06,Africa/Asmara");
  834. }
  835. Y_UNIT_TEST_LLVM(TestAggrMinMaxFloats) {
  836. TSetup<LLVM> setup;
  837. TProgramBuilder& pb = *setup.PgmBuilder;
  838. const auto data1 = pb.NewDataLiteral<float>(0.0f*HUGE_VALF);
  839. const auto data2 = pb.NewDataLiteral<float>(HUGE_VALF);
  840. const auto data3 = pb.NewDataLiteral<float>(3.14f);
  841. const auto data4 = pb.NewDataLiteral<float>(-2.13f);
  842. const auto data5 = pb.NewDataLiteral<float>(-HUGE_VALF);
  843. const auto dataType = pb.NewDataType(NUdf::TDataType<float>::Id);
  844. const auto list = pb.NewList(dataType, {data1, data2, data3, data4, data5});
  845. const auto pgmReturn = pb.FlatMap(list,
  846. [&](TRuntimeNode left) {
  847. return pb.Map(list,
  848. [&](TRuntimeNode right) {
  849. return pb.NewTuple({pb.AggrMin(left, right), pb.AggrMax(left, right)});
  850. });
  851. });
  852. const auto graph = setup.BuildGraph(pgmReturn);
  853. const auto iterator = graph->GetValue().GetListIterator();
  854. NUdf::TUnboxedValue item;
  855. UNIT_ASSERT(iterator.Next(item));
  856. UNIT_ASSERT(std::isnan(item.GetElement(0).Get<float>()));
  857. UNIT_ASSERT(std::isnan(item.GetElement(1).Get<float>()));
  858. UNIT_ASSERT(iterator.Next(item));
  859. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).Get<float>(), HUGE_VALF);
  860. UNIT_ASSERT(std::isnan(item.GetElement(1).Get<float>()));
  861. UNIT_ASSERT(iterator.Next(item));
  862. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).Get<float>(), 3.14f);
  863. UNIT_ASSERT(std::isnan(item.GetElement(1).Get<float>()));
  864. UNIT_ASSERT(iterator.Next(item));
  865. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).Get<float>(), -2.13f);
  866. UNIT_ASSERT(std::isnan(item.GetElement(1).Get<float>()));
  867. UNIT_ASSERT(iterator.Next(item));
  868. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).Get<float>(), -HUGE_VALF);
  869. UNIT_ASSERT(std::isnan(item.GetElement(1).Get<float>()));
  870. UNIT_ASSERT(iterator.Next(item));
  871. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).Get<float>(), HUGE_VALF);
  872. UNIT_ASSERT(std::isnan(item.GetElement(1).Get<float>()));
  873. UNIT_ASSERT(iterator.Next(item));
  874. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).Get<float>(), HUGE_VALF);
  875. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(1).Get<float>(), HUGE_VALF);
  876. UNIT_ASSERT(iterator.Next(item));
  877. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).Get<float>(), 3.14f);
  878. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(1).Get<float>(), HUGE_VALF);
  879. UNIT_ASSERT(iterator.Next(item));
  880. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).Get<float>(), -2.13f);
  881. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(1).Get<float>(), HUGE_VALF);
  882. UNIT_ASSERT(iterator.Next(item));
  883. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).Get<float>(), -HUGE_VALF);
  884. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(1).Get<float>(), HUGE_VALF);
  885. UNIT_ASSERT(iterator.Next(item));
  886. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).Get<float>(), 3.14f);
  887. UNIT_ASSERT(std::isnan(item.GetElement(1).Get<float>()));
  888. UNIT_ASSERT(iterator.Next(item));
  889. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).Get<float>(), 3.14f);
  890. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(1).Get<float>(), HUGE_VALF);
  891. UNIT_ASSERT(iterator.Next(item));
  892. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).Get<float>(), 3.14f);
  893. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(1).Get<float>(), 3.14f);
  894. UNIT_ASSERT(iterator.Next(item));
  895. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).Get<float>(), -2.13f);
  896. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(1).Get<float>(), 3.14f);
  897. UNIT_ASSERT(iterator.Next(item));
  898. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).Get<float>(), -HUGE_VALF);
  899. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(1).Get<float>(), 3.14f);
  900. UNIT_ASSERT(iterator.Next(item));
  901. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).Get<float>(), -2.13f);
  902. UNIT_ASSERT(std::isnan(item.GetElement(1).Get<float>()));
  903. UNIT_ASSERT(iterator.Next(item));
  904. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).Get<float>(), -2.13f);
  905. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(1).Get<float>(), HUGE_VALF);
  906. UNIT_ASSERT(iterator.Next(item));
  907. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).Get<float>(), -2.13f);
  908. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(1).Get<float>(), 3.14f);
  909. UNIT_ASSERT(iterator.Next(item));
  910. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).Get<float>(), -2.13f);
  911. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(1).Get<float>(), -2.13f);
  912. UNIT_ASSERT(iterator.Next(item));
  913. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).Get<float>(), -HUGE_VALF);
  914. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(1).Get<float>(), -2.13f);
  915. UNIT_ASSERT(iterator.Next(item));
  916. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).Get<float>(), -HUGE_VALF);
  917. UNIT_ASSERT(std::isnan(item.GetElement(1).Get<float>()));
  918. UNIT_ASSERT(iterator.Next(item));
  919. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).Get<float>(), -HUGE_VALF);
  920. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(1).Get<float>(), HUGE_VALF);
  921. UNIT_ASSERT(iterator.Next(item));
  922. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).Get<float>(), -HUGE_VALF);
  923. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(1).Get<float>(), 3.14f);
  924. UNIT_ASSERT(iterator.Next(item));
  925. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).Get<float>(), -HUGE_VALF);
  926. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(1).Get<float>(), -2.13f);
  927. UNIT_ASSERT(iterator.Next(item));
  928. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(0).Get<float>(), -HUGE_VALF);
  929. UNIT_ASSERT_VALUES_EQUAL(item.GetElement(1).Get<float>(), -HUGE_VALF);
  930. UNIT_ASSERT(!iterator.Next(item));
  931. UNIT_ASSERT(!iterator.Next(item));
  932. }
  933. }
  934. }
  935. }