@@ -72,6 +72,81 @@ TEST_F(OptimizerRuleTests, SimpleCommutativeRuleTest) {
72
72
EXPECT_EQ (output_join->Children ()[1 ], left_get);
73
73
}
74
74
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
+
75
150
TEST_F (OptimizerRuleTests, SimpleAssociativeRuleTest) {
76
151
// Start Join Structure: (left JOIN middle) JOIN right
77
152
// End Join Structure: left JOIN (middle JOIN right)
0 commit comments