38
38
#include " sql/testing_sql_util.h"
39
39
#include " type/value_factory.h"
40
40
41
-
42
41
namespace peloton {
43
42
namespace test {
44
43
@@ -82,52 +81,78 @@ TEST_F(OptimizerRuleTests, SimpleCommutativeRuleTest) {
82
81
}
83
82
84
83
TEST_F (OptimizerRuleTests, SimpleAssociativeRuleTest) {
85
-
86
- // (left JOIN middle) JOIN right
87
- // Build Operator Expression
84
+ // Start Join Structure: (left JOIN middle) JOIN right
85
+ // End Join Structure: left JOIN (middle JOIN right)
86
+ // Query: SELECT * from test1, test2, test3 WHERE test1.a = test2.a AND
87
+ // test1.a = test3.a; Test ensures that predicate "test1.a = test2.a" is
88
+ // redistributed to parent join
88
89
89
90
// Setup Memo
90
91
Optimizer optimizer;
91
92
92
- auto left_get = std::make_shared<OperatorExpression>(LogicalGet::make (0 , {}, nullptr , " test1" ));
93
- auto middle_get = std::make_shared<OperatorExpression>(LogicalGet::make (0 , {}, nullptr , " test2" ));
94
- auto right_get = std::make_shared<OperatorExpression>(LogicalGet::make (0 , {}, nullptr , " test3" ));
95
-
96
- auto left_get_group = optimizer.metadata_ .memo .InsertExpression (optimizer.metadata_ .MakeGroupExpression (left_get), true );
97
- auto middle_get_group = optimizer.metadata_ .memo .InsertExpression (optimizer.metadata_ .MakeGroupExpression (middle_get),true );
98
- auto right_get_group = optimizer.metadata_ .memo .InsertExpression (optimizer.metadata_ .MakeGroupExpression (right_get),true );
99
-
100
- auto left_leaf = std::make_shared<OperatorExpression>(LeafOperator::make (left_get_group->GetGroupID ()));
101
- auto middle_leaf = std::make_shared<OperatorExpression>(LeafOperator::make (middle_get_group->GetGroupID ()));
102
- auto right_leaf = std::make_shared<OperatorExpression>(LeafOperator::make (right_get_group->GetGroupID ()));
93
+ auto left_get = std::make_shared<OperatorExpression>(
94
+ LogicalGet::make (0 , {}, nullptr , " test1" ));
95
+ auto middle_get = std::make_shared<OperatorExpression>(
96
+ LogicalGet::make (1 , {}, nullptr , " test2" ));
97
+ auto right_get = std::make_shared<OperatorExpression>(
98
+ LogicalGet::make (2 , {}, nullptr , " test3" ));
99
+
100
+ auto left_get_group = optimizer.metadata_ .memo .InsertExpression (
101
+ optimizer.metadata_ .MakeGroupExpression (left_get), true );
102
+ auto middle_get_group = optimizer.metadata_ .memo .InsertExpression (
103
+ optimizer.metadata_ .MakeGroupExpression (middle_get), true );
104
+ auto right_get_group = optimizer.metadata_ .memo .InsertExpression (
105
+ optimizer.metadata_ .MakeGroupExpression (right_get), true );
106
+
107
+ auto left_leaf = std::make_shared<OperatorExpression>(
108
+ LeafOperator::make (left_get_group->GetGroupID ()));
109
+ auto middle_leaf = std::make_shared<OperatorExpression>(
110
+ LeafOperator::make (middle_get_group->GetGroupID ()));
111
+ auto right_leaf = std::make_shared<OperatorExpression>(
112
+ LeafOperator::make (right_get_group->GetGroupID ()));
103
113
104
114
// Make Child Join
105
115
std::vector<AnnotatedExpression> child_join_predicates;
106
- std::unordered_set<std::string> child_tables ({" test1" ," test2" });
116
+ std::unordered_set<std::string> child_tables ({" test1" , " test2" });
107
117
auto dummy_expr = std::shared_ptr<expression::AbstractExpression>{
108
- new expression::OperatorExpression (ExpressionType::COMPARE_EQUAL, type::TypeId::INTEGER)};
118
+ new expression::OperatorExpression (ExpressionType::COMPARE_EQUAL,
119
+ type::TypeId::INTEGER)};
109
120
110
121
AnnotatedExpression pred = {dummy_expr, child_tables};
111
122
child_join_predicates.push_back (pred);
112
123
113
- auto child_join = std::make_shared<OperatorExpression>(LogicalInnerJoin::make (child_join_predicates));
124
+ auto child_join = std::make_shared<OperatorExpression>(
125
+ LogicalInnerJoin::make (child_join_predicates));
114
126
child_join->PushChild (left_leaf);
115
127
child_join->PushChild (middle_leaf);
116
- optimizer.metadata_ .memo .InsertExpression (optimizer.metadata_ .MakeGroupExpression (child_join), true );
128
+ optimizer.metadata_ .memo .InsertExpression (
129
+ optimizer.metadata_ .MakeGroupExpression (child_join), true );
117
130
118
131
// Make Parent join
119
132
std::vector<AnnotatedExpression> parent_join_predicates;
120
- std::unordered_set<std::string> parent_tables ({" test1" ," test3" });
133
+ std::unordered_set<std::string> parent_tables ({" test1" , " test3" });
121
134
pred = {dummy_expr, parent_tables};
122
135
parent_join_predicates.push_back (pred);
123
136
124
- auto parent_join = std::make_shared<OperatorExpression>(LogicalInnerJoin::make (parent_join_predicates));
137
+ auto parent_join = std::make_shared<OperatorExpression>(
138
+ LogicalInnerJoin::make (parent_join_predicates));
125
139
parent_join->PushChild (child_join);
126
140
parent_join->PushChild (right_leaf);
127
141
128
- optimizer.metadata_ .memo .InsertExpression (optimizer.metadata_ .MakeGroupExpression (parent_join), true );
129
- OptimizeContext* root_context = new OptimizeContext (&(optimizer.metadata_ ), nullptr );
130
- LOG_DEBUG (" Set up Memo" );
142
+ optimizer.metadata_ .memo .InsertExpression (
143
+ optimizer.metadata_ .MakeGroupExpression (parent_join), true );
144
+ OptimizeContext *root_context =
145
+ new OptimizeContext (&(optimizer.metadata_ ), nullptr );
146
+
147
+ EXPECT_EQ (left_leaf, parent_join->Children ()[0 ]->Children ()[0 ]);
148
+ EXPECT_EQ (middle_leaf, parent_join->Children ()[0 ]->Children ()[1 ]);
149
+ EXPECT_EQ (right_leaf, parent_join->Children ()[1 ]);
150
+ EXPECT_EQ (1 ,
151
+ parent_join->Op ().As <LogicalInnerJoin>()->join_predicates .size ());
152
+ EXPECT_EQ (1 , parent_join->Children ()[0 ]
153
+ ->Op ()
154
+ .As <LogicalInnerJoin>()
155
+ ->join_predicates .size ());
131
156
132
157
// Setup rule
133
158
InnerJoinAssociativity rule;
@@ -147,7 +172,100 @@ TEST_F(OptimizerRuleTests, SimpleAssociativeRuleTest) {
147
172
auto child_join_op = output_join->Children ()[1 ]->Op ().As <LogicalInnerJoin>();
148
173
EXPECT_EQ (2 , parent_join_op->join_predicates .size ());
149
174
EXPECT_EQ (0 , child_join_op->join_predicates .size ());
175
+ }
176
+
177
+ TEST_F (OptimizerRuleTests, SimpleAssociativeRuleTest2) {
178
+ // Start Join Structure: (left JOIN middle) JOIN right
179
+ // End Join Structure: left JOIN (middle JOIN right)
180
+ // Query: SELECT * from test1, test2, test3 WHERE test1.a = test3.a AND
181
+ // test2.a = test3.a; Test ensures that predicate "test2.a = test3.a" is
182
+ // redistributed to child join
183
+
184
+ // Setup Memo
185
+ Optimizer optimizer;
186
+ auto &memo = optimizer.metadata_ .memo ;
187
+
188
+ auto left_get = std::make_shared<OperatorExpression>(
189
+ LogicalGet::make (0 , {}, nullptr , " test1" ));
190
+ auto middle_get = std::make_shared<OperatorExpression>(
191
+ LogicalGet::make (1 , {}, nullptr , " test2" ));
192
+ auto right_get = std::make_shared<OperatorExpression>(
193
+ LogicalGet::make (2 , {}, nullptr , " test3" ));
194
+
195
+ // Create Groups for Get Operators
196
+ auto left_get_group = memo.InsertExpression (
197
+ optimizer.metadata_ .MakeGroupExpression (left_get), true );
198
+ auto middle_get_group = memo.InsertExpression (
199
+ optimizer.metadata_ .MakeGroupExpression (middle_get), true );
200
+ auto right_get_group = memo.InsertExpression (
201
+ optimizer.metadata_ .MakeGroupExpression (right_get), true );
202
+
203
+ auto left_leaf = std::make_shared<OperatorExpression>(
204
+ LeafOperator::make (left_get_group->GetGroupID ()));
205
+ auto middle_leaf = std::make_shared<OperatorExpression>(
206
+ LeafOperator::make (middle_get_group->GetGroupID ()));
207
+ auto right_leaf = std::make_shared<OperatorExpression>(
208
+ LeafOperator::make (right_get_group->GetGroupID ()));
209
+
210
+ // Make Child Join
211
+ auto child_join =
212
+ std::make_shared<OperatorExpression>(LogicalInnerJoin::make ());
213
+ child_join->PushChild (left_leaf);
214
+ child_join->PushChild (middle_leaf);
215
+ optimizer.metadata_ .memo .InsertExpression (
216
+ optimizer.metadata_ .MakeGroupExpression (child_join), true );
217
+
218
+ // Make Parent join
219
+ std::vector<AnnotatedExpression> parent_join_predicates;
220
+ auto dummy_expr = std::shared_ptr<expression::AbstractExpression>{
221
+ new expression::OperatorExpression (ExpressionType::COMPARE_EQUAL,
222
+ type::TypeId::INTEGER)};
223
+ std::unordered_set<std::string> pred1_tables ({" test1" , " test3" });
224
+ AnnotatedExpression pred1 = {dummy_expr, pred1_tables};
225
+ parent_join_predicates.push_back (pred1);
226
+
227
+ std::unordered_set<std::string> pred2_tables ({" test2" , " test3" });
228
+ AnnotatedExpression pred2 = {dummy_expr, pred2_tables};
229
+ parent_join_predicates.push_back (pred2);
230
+
231
+ auto parent_join = std::make_shared<OperatorExpression>(
232
+ LogicalInnerJoin::make (parent_join_predicates));
233
+ parent_join->PushChild (child_join);
234
+ parent_join->PushChild (right_leaf);
235
+
236
+ optimizer.metadata_ .memo .InsertExpression (
237
+ optimizer.metadata_ .MakeGroupExpression (parent_join), true );
238
+ OptimizeContext *root_context =
239
+ new OptimizeContext (&(optimizer.metadata_ ), nullptr );
240
+
241
+ EXPECT_EQ (left_leaf, parent_join->Children ()[0 ]->Children ()[0 ]);
242
+ EXPECT_EQ (middle_leaf, parent_join->Children ()[0 ]->Children ()[1 ]);
243
+ EXPECT_EQ (right_leaf, parent_join->Children ()[1 ]);
244
+ EXPECT_EQ (2 ,
245
+ parent_join->Op ().As <LogicalInnerJoin>()->join_predicates .size ());
246
+ EXPECT_EQ (0 , parent_join->Children ()[0 ]
247
+ ->Op ()
248
+ .As <LogicalInnerJoin>()
249
+ ->join_predicates .size ());
250
+
251
+ // Setup rule
252
+ InnerJoinAssociativity rule;
253
+
254
+ EXPECT_TRUE (rule.Check (parent_join, root_context));
255
+ std::vector<std::shared_ptr<OperatorExpression>> outputs;
256
+ rule.Transform (parent_join, outputs, root_context);
257
+ EXPECT_EQ (1 , outputs.size ());
258
+
259
+ auto output_join = outputs[0 ];
150
260
261
+ EXPECT_EQ (left_leaf, output_join->Children ()[0 ]);
262
+ EXPECT_EQ (middle_leaf, output_join->Children ()[1 ]->Children ()[0 ]);
263
+ EXPECT_EQ (right_leaf, output_join->Children ()[1 ]->Children ()[1 ]);
264
+
265
+ auto parent_join_op = output_join->Op ().As <LogicalInnerJoin>();
266
+ auto child_join_op = output_join->Children ()[1 ]->Op ().As <LogicalInnerJoin>();
267
+ EXPECT_EQ (1 , parent_join_op->join_predicates .size ());
268
+ EXPECT_EQ (1 , child_join_op->join_predicates .size ());
151
269
}
152
270
153
271
} // namespace test
0 commit comments