diff options
author | vvvv <[email protected]> | 2024-11-07 12:29:36 +0300 |
---|---|---|
committer | vvvv <[email protected]> | 2024-11-07 13:49:47 +0300 |
commit | d4c258e9431675bab6745c8638df6e3dfd4dca6b (patch) | |
tree | b5efcfa11351152a4c872fccaea35749141c0b11 /yql/essentials/sql/pg/optimizer_ut.cpp | |
parent | 13a4f274caef5cfdaf0263b24e4d6bdd5521472b (diff) |
Moved other yql/essentials libs YQL-19206
init
commit_hash:7d4c435602078407bbf20dd3c32f9c90d2bbcbc0
Diffstat (limited to 'yql/essentials/sql/pg/optimizer_ut.cpp')
-rw-r--r-- | yql/essentials/sql/pg/optimizer_ut.cpp | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/yql/essentials/sql/pg/optimizer_ut.cpp b/yql/essentials/sql/pg/optimizer_ut.cpp new file mode 100644 index 00000000000..6b27c031851 --- /dev/null +++ b/yql/essentials/sql/pg/optimizer_ut.cpp @@ -0,0 +1,196 @@ +#include <library/cpp/testing/unittest/registar.h> +#include <library/cpp/testing/hook/hook.h> + +#include <yql/essentials/parser/pg_wrapper/interface/optimizer.h> + +extern "C" { +#include <yql/essentials/parser/pg_wrapper/thread_inits.h> +} + +using namespace NYql; + +Y_UNIT_TEST_SUITE(PgOptimizer) { + +Y_TEST_HOOK_BEFORE_RUN(InitTest) { + pg_thread_init(); +} + +Y_UNIT_TEST(PgJoinSearch2Rels) { + IOptimizer::TRel rel1 = {100000, 1000000, {{'a'}}}; + IOptimizer::TRel rel2 = {1000000, 9000009, {{'b'}}}; + IOptimizer::TInput input = {.Rels={rel1, rel2}}; + + input.EqClasses.emplace_back(IOptimizer::TEq { + {{1, 1}, {2, 1}} + }); + + auto log = [](const TString& str) { + Cerr << str << "\n"; + }; + + auto optimizer = std::unique_ptr<IOptimizer>(MakePgOptimizerInternal(input, log)); + + auto res = optimizer->JoinSearch(); + auto resStr = res.ToString(false); + Cerr << resStr; + TString expected = R"__({ + Inner Join + Loop Strategy + Rels: [1,2] + Op: b = a + { + Node + Rels: [2] + } + { + Node + Rels: [1] + } +} +)__"; + UNIT_ASSERT_STRINGS_EQUAL(expected, resStr); + UNIT_ASSERT(res.TotalCost > 0); + UNIT_ASSERT(res.Rows > 0); +} + +Y_UNIT_TEST(PgJoinSearch2RelsLeft) { + IOptimizer::TRel rel1 = {100000, 1000000, {{'a'}}}; + IOptimizer::TRel rel2 = {1000000, 9000009, {{'b'}}}; + IOptimizer::TInput input = {.Rels={rel1, rel2}}; + + input.EqClasses.emplace_back(IOptimizer::TEq { + {{1, 1}} + }); + input.EqClasses.emplace_back(IOptimizer::TEq { + {{2, 1}} + }); + input.Left.emplace_back( + IOptimizer::TEq { + {{1, 1}, {2, 1}} + } + ); + + auto log = [](const TString& str) { + Cerr << str << "\n"; + }; + + auto optimizer = std::unique_ptr<IOptimizer>(MakePgOptimizerInternal(input, log)); + + auto res = optimizer->JoinSearch(); + auto resStr = res.ToString(false); + Cerr << resStr; + TString expected = R"__({ + Left Join + Loop Strategy + Rels: [1,2] + Op: a = b + { + Node + Rels: [1] + } + { + Node + Rels: [2] + } +} +)__"; + UNIT_ASSERT_STRINGS_EQUAL(expected, resStr); + UNIT_ASSERT(res.TotalCost > 0); + UNIT_ASSERT(res.Rows > 0); +} + +Y_UNIT_TEST(PgJoinSearch2RelsRight) { + IOptimizer::TRel rel1 = {100000, 1000000, {{'a'}}}; + IOptimizer::TRel rel2 = {1000000, 9000009, {{'b'}}}; + IOptimizer::TInput input = {.Rels={rel1, rel2}}; + + input.EqClasses.emplace_back(IOptimizer::TEq { + {{1, 1}} + }); + input.EqClasses.emplace_back(IOptimizer::TEq { + {{2, 1}} + }); + input.Right.emplace_back( + IOptimizer::TEq { + {{1, 1}, {2, 1}} + } + ); + + auto log = [](const TString& str) { + Cerr << str << "\n"; + }; + + auto optimizer = std::unique_ptr<IOptimizer>(MakePgOptimizerInternal(input, log)); + + auto res = optimizer->JoinSearch(); + auto resStr = res.ToString(false); + Cerr << resStr; + TString expected = R"__({ + Left Join + Loop Strategy + Rels: [1,2] + Op: b = a + { + Node + Rels: [2] + } + { + Node + Rels: [1] + } +} +)__"; + UNIT_ASSERT_STRINGS_EQUAL(expected, resStr); + UNIT_ASSERT(res.TotalCost > 0); + UNIT_ASSERT(res.Rows > 0); +} + +Y_UNIT_TEST(PgJoinSearch3Rels) { + IOptimizer::TRel rel1 = {100000, 1000000, {{'a'}}}; + IOptimizer::TRel rel2 = {1000000, 9000009, {{'b'}}}; + IOptimizer::TRel rel3 = {10000, 9009, {{'c'}}}; + IOptimizer::TInput input = {.Rels={rel1, rel2, rel3}}; + + input.EqClasses.emplace_back(IOptimizer::TEq { + {{1, 1}, {2, 1}, {3, 1}} + }); + + auto log = [](const TString& str) { + Cerr << str << "\n"; + }; + + auto optimizer = std::unique_ptr<IOptimizer>(MakePgOptimizerInternal(input, log)); + auto res = optimizer->JoinSearch(); + auto resStr = res.ToString(false); + Cerr << resStr; + TString expected = R"__({ + Inner Join + Hash Strategy + Rels: [1,2,3] + Op: a = b + { + Inner Join + Loop Strategy + Rels: [1,3] + Op: a = c + { + Node + Rels: [1] + } + { + Node + Rels: [3] + } + } + { + Node + Rels: [2] + } +} +)__"; + UNIT_ASSERT_STRINGS_EQUAL(expected, resStr); + UNIT_ASSERT(res.TotalCost > 0); + UNIT_ASSERT(res.Rows > 0); +} + +} // Y_UNIT_TEST_SUITE(PgOptimizer) |