optimizer_ut.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. #include <library/cpp/testing/unittest/registar.h>
  2. #include <library/cpp/testing/hook/hook.h>
  3. #include <yql/essentials/parser/pg_wrapper/interface/optimizer.h>
  4. extern "C" {
  5. #include <yql/essentials/parser/pg_wrapper/thread_inits.h>
  6. }
  7. using namespace NYql;
  8. Y_UNIT_TEST_SUITE(PgOptimizer) {
  9. Y_TEST_HOOK_BEFORE_RUN(InitTest) {
  10. pg_thread_init();
  11. }
  12. Y_UNIT_TEST(PgJoinSearch2Rels) {
  13. IOptimizer::TRel rel1 = {100000, 1000000, {{'a'}}};
  14. IOptimizer::TRel rel2 = {1000000, 9000009, {{'b'}}};
  15. IOptimizer::TInput input = {.Rels={rel1, rel2}};
  16. input.EqClasses.emplace_back(IOptimizer::TEq {
  17. {{1, 1}, {2, 1}}
  18. });
  19. auto log = [](const TString& str) {
  20. Cerr << str << "\n";
  21. };
  22. auto optimizer = std::unique_ptr<IOptimizer>(MakePgOptimizerInternal(input, log));
  23. auto res = optimizer->JoinSearch();
  24. auto resStr = res.ToString(false);
  25. Cerr << resStr;
  26. TString expected = R"__({
  27. Inner Join
  28. Loop Strategy
  29. Rels: [1,2]
  30. Op: b = a
  31. {
  32. Node
  33. Rels: [2]
  34. }
  35. {
  36. Node
  37. Rels: [1]
  38. }
  39. }
  40. )__";
  41. UNIT_ASSERT_STRINGS_EQUAL(expected, resStr);
  42. UNIT_ASSERT(res.TotalCost > 0);
  43. UNIT_ASSERT(res.Rows > 0);
  44. }
  45. Y_UNIT_TEST(PgJoinSearch2RelsLeft) {
  46. IOptimizer::TRel rel1 = {100000, 1000000, {{'a'}}};
  47. IOptimizer::TRel rel2 = {1000000, 9000009, {{'b'}}};
  48. IOptimizer::TInput input = {.Rels={rel1, rel2}};
  49. input.EqClasses.emplace_back(IOptimizer::TEq {
  50. {{1, 1}}
  51. });
  52. input.EqClasses.emplace_back(IOptimizer::TEq {
  53. {{2, 1}}
  54. });
  55. input.Left.emplace_back(
  56. IOptimizer::TEq {
  57. {{1, 1}, {2, 1}}
  58. }
  59. );
  60. auto log = [](const TString& str) {
  61. Cerr << str << "\n";
  62. };
  63. auto optimizer = std::unique_ptr<IOptimizer>(MakePgOptimizerInternal(input, log));
  64. auto res = optimizer->JoinSearch();
  65. auto resStr = res.ToString(false);
  66. Cerr << resStr;
  67. TString expected = R"__({
  68. Left Join
  69. Loop Strategy
  70. Rels: [1,2]
  71. Op: a = b
  72. {
  73. Node
  74. Rels: [1]
  75. }
  76. {
  77. Node
  78. Rels: [2]
  79. }
  80. }
  81. )__";
  82. UNIT_ASSERT_STRINGS_EQUAL(expected, resStr);
  83. UNIT_ASSERT(res.TotalCost > 0);
  84. UNIT_ASSERT(res.Rows > 0);
  85. }
  86. Y_UNIT_TEST(PgJoinSearch2RelsRight) {
  87. IOptimizer::TRel rel1 = {100000, 1000000, {{'a'}}};
  88. IOptimizer::TRel rel2 = {1000000, 9000009, {{'b'}}};
  89. IOptimizer::TInput input = {.Rels={rel1, rel2}};
  90. input.EqClasses.emplace_back(IOptimizer::TEq {
  91. {{1, 1}}
  92. });
  93. input.EqClasses.emplace_back(IOptimizer::TEq {
  94. {{2, 1}}
  95. });
  96. input.Right.emplace_back(
  97. IOptimizer::TEq {
  98. {{1, 1}, {2, 1}}
  99. }
  100. );
  101. auto log = [](const TString& str) {
  102. Cerr << str << "\n";
  103. };
  104. auto optimizer = std::unique_ptr<IOptimizer>(MakePgOptimizerInternal(input, log));
  105. auto res = optimizer->JoinSearch();
  106. auto resStr = res.ToString(false);
  107. Cerr << resStr;
  108. TString expected = R"__({
  109. Left Join
  110. Loop Strategy
  111. Rels: [1,2]
  112. Op: b = a
  113. {
  114. Node
  115. Rels: [2]
  116. }
  117. {
  118. Node
  119. Rels: [1]
  120. }
  121. }
  122. )__";
  123. UNIT_ASSERT_STRINGS_EQUAL(expected, resStr);
  124. UNIT_ASSERT(res.TotalCost > 0);
  125. UNIT_ASSERT(res.Rows > 0);
  126. }
  127. Y_UNIT_TEST(PgJoinSearch3Rels) {
  128. IOptimizer::TRel rel1 = {100000, 1000000, {{'a'}}};
  129. IOptimizer::TRel rel2 = {1000000, 9000009, {{'b'}}};
  130. IOptimizer::TRel rel3 = {10000, 9009, {{'c'}}};
  131. IOptimizer::TInput input = {.Rels={rel1, rel2, rel3}};
  132. input.EqClasses.emplace_back(IOptimizer::TEq {
  133. {{1, 1}, {2, 1}, {3, 1}}
  134. });
  135. auto log = [](const TString& str) {
  136. Cerr << str << "\n";
  137. };
  138. auto optimizer = std::unique_ptr<IOptimizer>(MakePgOptimizerInternal(input, log));
  139. auto res = optimizer->JoinSearch();
  140. auto resStr = res.ToString(false);
  141. Cerr << resStr;
  142. TString expected = R"__({
  143. Inner Join
  144. Hash Strategy
  145. Rels: [1,2,3]
  146. Op: a = b
  147. {
  148. Inner Join
  149. Loop Strategy
  150. Rels: [1,3]
  151. Op: a = c
  152. {
  153. Node
  154. Rels: [1]
  155. }
  156. {
  157. Node
  158. Rels: [3]
  159. }
  160. }
  161. {
  162. Node
  163. Rels: [2]
  164. }
  165. }
  166. )__";
  167. UNIT_ASSERT_STRINGS_EQUAL(expected, resStr);
  168. UNIT_ASSERT(res.TotalCost > 0);
  169. UNIT_ASSERT(res.Rows > 0);
  170. }
  171. } // Y_UNIT_TEST_SUITE(PgOptimizer)