summaryrefslogtreecommitdiffstats
path: root/yql/essentials/sql/pg/optimizer_ut.cpp
diff options
context:
space:
mode:
authorvvvv <[email protected]>2024-11-07 12:29:36 +0300
committervvvv <[email protected]>2024-11-07 13:49:47 +0300
commitd4c258e9431675bab6745c8638df6e3dfd4dca6b (patch)
treeb5efcfa11351152a4c872fccaea35749141c0b11 /yql/essentials/sql/pg/optimizer_ut.cpp
parent13a4f274caef5cfdaf0263b24e4d6bdd5521472b (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.cpp196
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)