Skip to content
This repository was archived by the owner on Sep 27, 2019. It is now read-only.

Commit 43454f5

Browse files
committed
add integration test for [INNER | LEFT | RIGHT | OUTER] JoinCommutativeRules
1 parent 4e168fd commit 43454f5

File tree

1 file changed

+75
-0
lines changed

1 file changed

+75
-0
lines changed

test/optimizer/optimizer_rule_test.cpp

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,81 @@ TEST_F(OptimizerRuleTests, SimpleCommutativeRuleTest) {
7272
EXPECT_EQ(output_join->Children()[1], left_get);
7373
}
7474

75+
TEST_F(OptimizerRuleTests, LeftJoinCommutativeRuleTest) {
76+
// Build op plan node to match rule
77+
auto left_get = std::make_shared<OperatorExpression>(LogicalGet::make());
78+
auto right_get = std::make_shared<OperatorExpression>(LogicalGet::make());
79+
auto join =
80+
std::make_shared<OperatorExpression>(LogicalJoin::make(JoinType::LEFT));
81+
join->PushChild(left_get);
82+
join->PushChild(right_get);
83+
84+
// Setup rule
85+
JoinCommutativity rule;
86+
87+
EXPECT_TRUE(rule.Check(join, nullptr));
88+
89+
std::vector<std::shared_ptr<OperatorExpression>> outputs;
90+
rule.Transform(join, outputs, nullptr);
91+
EXPECT_EQ(outputs.size(), 1);
92+
93+
auto output_join = outputs[0];
94+
95+
EXPECT_EQ(output_join->Children()[0], right_get);
96+
EXPECT_EQ(output_join->Children()[1], left_get);
97+
EXPECT_EQ(output_join->Op().As<LogicalJoin>()->type, JoinType::RIGHT);
98+
}
99+
100+
TEST_F(OptimizerRuleTests, RightJoinCommutativeRuleTest) {
101+
// Build op plan node to match rule
102+
auto left_get = std::make_shared<OperatorExpression>(LogicalGet::make());
103+
auto right_get = std::make_shared<OperatorExpression>(LogicalGet::make());
104+
auto join =
105+
std::make_shared<OperatorExpression>(LogicalJoin::make(JoinType::RIGHT));
106+
join->PushChild(left_get);
107+
join->PushChild(right_get);
108+
109+
// Setup rule
110+
JoinCommutativity rule;
111+
112+
EXPECT_TRUE(rule.Check(join, nullptr));
113+
114+
std::vector<std::shared_ptr<OperatorExpression>> outputs;
115+
rule.Transform(join, outputs, nullptr);
116+
EXPECT_EQ(outputs.size(), 1);
117+
118+
auto output_join = outputs[0];
119+
120+
EXPECT_EQ(output_join->Children()[0], right_get);
121+
EXPECT_EQ(output_join->Children()[1], left_get);
122+
EXPECT_EQ(output_join->Op().As<LogicalJoin>()->type, JoinType::LEFT);
123+
}
124+
125+
TEST_F(OptimizerRuleTests, OuterJoinCommutativeRuleTest) {
126+
// Build op plan node to match rule
127+
auto left_get = std::make_shared<OperatorExpression>(LogicalGet::make());
128+
auto right_get = std::make_shared<OperatorExpression>(LogicalGet::make());
129+
auto join =
130+
std::make_shared<OperatorExpression>(LogicalJoin::make(JoinType::OUTER));
131+
join->PushChild(left_get);
132+
join->PushChild(right_get);
133+
134+
// Setup rule
135+
JoinCommutativity rule;
136+
137+
EXPECT_TRUE(rule.Check(join, nullptr));
138+
139+
std::vector<std::shared_ptr<OperatorExpression>> outputs;
140+
rule.Transform(join, outputs, nullptr);
141+
EXPECT_EQ(outputs.size(), 1);
142+
143+
auto output_join = outputs[0];
144+
145+
EXPECT_EQ(output_join->Children()[0], right_get);
146+
EXPECT_EQ(output_join->Children()[1], left_get);
147+
EXPECT_EQ(output_join->Op().As<LogicalJoin>()->type, JoinType::OUTER);
148+
}
149+
75150
TEST_F(OptimizerRuleTests, SimpleAssociativeRuleTest) {
76151
// Start Join Structure: (left JOIN middle) JOIN right
77152
// End Join Structure: left JOIN (middle JOIN right)

0 commit comments

Comments
 (0)