11
11
// ===----------------------------------------------------------------------===//
12
12
13
13
#include " execution/executors/mock_scan_executor.h"
14
+ #include < algorithm>
15
+ #include < random>
14
16
15
17
#include " common/exception.h"
16
18
#include " common/util/string_util.h"
@@ -31,16 +33,15 @@ static const char *course_on_date[] = {"Monday", "Tuesday", "Wednesday", "Thursd
31
33
32
34
static int course_on_bool[] = {0 , 1 , 0 , 1 , 0 , 1 , 1 };
33
35
34
- const char *mock_table_list[] = {" __mock_table_1" ,
35
- " __mock_table_2" ,
36
- " __mock_table_3" ,
37
- " __mock_table_tas_2022" ,
38
- " __mock_agg_input_small" ,
39
- " __mock_agg_input_big" ,
40
- " __mock_table_schedule_2022" ,
41
- " __mock_table_123" ,
42
- " __mock_graph" ,
43
- nullptr };
36
+ const char *mock_table_list[] = {" __mock_table_1" , " __mock_table_2" , " __mock_table_3" , " __mock_table_tas_2022" ,
37
+ " __mock_agg_input_small" , " __mock_agg_input_big" , " __mock_table_schedule_2022" ,
38
+ " __mock_table_123" , " __mock_graph" ,
39
+ // For leaderboard Q1
40
+ " __mock_t1_50k" , " __mock_t2_100k" , " __mock_t3_1k" ,
41
+ // For leaderboard Q2
42
+ " __mock_t4_1m" , " __mock_t5_1m" , " __mock_t6_1m" ,
43
+ // For leaderboard Q3
44
+ " __mock_t7" , " __mock_t8" , nullptr };
44
45
45
46
static const int GRAPH_NODE_CNT = 10 ;
46
47
@@ -81,51 +82,111 @@ auto GetMockTableSchemaOf(const std::string &table) -> Schema {
81
82
return Schema{std::vector{Column{" number" , TypeId::INTEGER}}};
82
83
}
83
84
85
+ if (table == " __mock_t1_50k" || table == " __mock_t2_100k" || table == " __mock_t3_1k" || table == " __mock_t4_1m" ||
86
+ table == " __mock_t5_1m" || table == " __mock_t6_1m" ) {
87
+ return Schema{std::vector{Column{" x" , TypeId::INTEGER}, Column{" y" , TypeId::INTEGER}}};
88
+ }
89
+
90
+ if (table == " __mock_t7" ) {
91
+ return Schema{
92
+ std::vector{Column{" v" , TypeId::INTEGER}, Column{" v1" , TypeId::INTEGER}, Column{" v2" , TypeId::INTEGER}}};
93
+ }
94
+
95
+ if (table == " __mock_t8" ) {
96
+ return Schema{std::vector{Column{" v4" , TypeId::INTEGER}}};
97
+ }
98
+
84
99
throw bustub::Exception (fmt::format (" mock table {} not found" , table));
85
100
}
86
101
87
102
auto GetSizeOf (const MockScanPlanNode *plan) -> size_t {
88
- if (plan->GetTable () == " __mock_table_1" ) {
103
+ const auto &table = plan->GetTable ();
104
+
105
+ if (table == " __mock_table_1" ) {
89
106
return 100 ;
90
107
}
91
108
92
- if (plan-> GetTable () == " __mock_table_2" ) {
109
+ if (table == " __mock_table_2" ) {
93
110
return 100 ;
94
111
}
95
112
96
- if (plan-> GetTable () == " __mock_table_3" ) {
113
+ if (table == " __mock_table_3" ) {
97
114
return 100 ;
98
115
}
99
116
100
- if (plan-> GetTable () == " __mock_table_tas_2022" ) {
117
+ if (table == " __mock_table_tas_2022" ) {
101
118
return sizeof (ta_list_2022) / sizeof (ta_list_2022[0 ]);
102
119
}
103
120
104
- if (plan-> GetTable () == " __mock_table_schedule_2022" ) {
121
+ if (table == " __mock_table_schedule_2022" ) {
105
122
return sizeof (course_on_date) / sizeof (course_on_date[0 ]);
106
123
}
107
124
108
- if (plan-> GetTable () == " __mock_agg_input_small" ) {
125
+ if (table == " __mock_agg_input_small" ) {
109
126
return 1000 ;
110
127
}
111
128
112
- if (plan-> GetTable () == " __mock_agg_input_big" ) {
129
+ if (table == " __mock_agg_input_big" ) {
113
130
return 10000 ;
114
131
}
115
132
116
- if (plan-> GetTable () == " __mock_graph" ) {
133
+ if (table == " __mock_graph" ) {
117
134
return GRAPH_NODE_CNT * GRAPH_NODE_CNT;
118
135
}
119
136
120
- if (plan-> GetTable () == " __mock_table_123" ) {
137
+ if (table == " __mock_table_123" ) {
121
138
return 3 ;
122
139
}
123
140
124
- return 100 ;
141
+ if (table == " __mock_t1_50k" ) {
142
+ return 50000 ;
143
+ }
144
+
145
+ if (table == " __mock_t2_100k" ) {
146
+ return 100000 ;
147
+ }
148
+
149
+ if (table == " __mock_t3_1k" ) {
150
+ return 1000 ;
151
+ }
152
+
153
+ if (table == " __mock_t4_1m" || table == " __mock_t5_1m" || table == " __mock_t6_1m" ) {
154
+ return 1000000 ;
155
+ }
156
+
157
+ if (table == " __mock_t7" ) {
158
+ return 1000000 ;
159
+ }
160
+
161
+ if (table == " __mock_t8" ) {
162
+ return 10 ;
163
+ }
164
+
165
+ return 0 ;
166
+ }
167
+
168
+ auto GetShuffled (const MockScanPlanNode *plan) -> bool {
169
+ const auto &table = plan->GetTable ();
170
+
171
+ if (table == " __mock_t1_50k" ) {
172
+ return true ;
173
+ }
174
+
175
+ if (table == " __mock_t2_100k" ) {
176
+ return true ;
177
+ }
178
+
179
+ if (table == " __mock_t3_1k" ) {
180
+ return true ;
181
+ }
182
+
183
+ return false ;
125
184
}
126
185
127
186
auto GetFunctionOf (const MockScanPlanNode *plan) -> std::function<Tuple(size_t )> {
128
- if (plan->GetTable () == " __mock_table_1" ) {
187
+ const auto &table = plan->GetTable ();
188
+
189
+ if (table == " __mock_table_1" ) {
129
190
return [plan](size_t cursor) {
130
191
std::vector<Value> values{};
131
192
values.reserve (2 );
@@ -135,7 +196,7 @@ auto GetFunctionOf(const MockScanPlanNode *plan) -> std::function<Tuple(size_t)>
135
196
};
136
197
}
137
198
138
- if (plan-> GetTable () == " __mock_table_2" ) {
199
+ if (table == " __mock_table_2" ) {
139
200
return [plan](size_t cursor) {
140
201
std::vector<Value> values{};
141
202
values.reserve (2 );
@@ -146,7 +207,7 @@ auto GetFunctionOf(const MockScanPlanNode *plan) -> std::function<Tuple(size_t)>
146
207
};
147
208
}
148
209
149
- if (plan-> GetTable () == " __mock_table_3" ) {
210
+ if (table == " __mock_table_3" ) {
150
211
return [plan](size_t cursor) {
151
212
std::vector<Value> values{};
152
213
values.reserve (2 );
@@ -160,7 +221,7 @@ auto GetFunctionOf(const MockScanPlanNode *plan) -> std::function<Tuple(size_t)>
160
221
};
161
222
}
162
223
163
- if (plan-> GetTable () == " __mock_table_tas_2022" ) {
224
+ if (table == " __mock_table_tas_2022" ) {
164
225
return [plan](size_t cursor) {
165
226
std::vector<Value> values{};
166
227
values.push_back (ValueFactory::GetVarcharValue (ta_list_2022[cursor]));
@@ -169,7 +230,7 @@ auto GetFunctionOf(const MockScanPlanNode *plan) -> std::function<Tuple(size_t)>
169
230
};
170
231
}
171
232
172
- if (plan-> GetTable () == " __mock_table_schedule_2022" ) {
233
+ if (table == " __mock_table_schedule_2022" ) {
173
234
return [plan](size_t cursor) {
174
235
std::vector<Value> values{};
175
236
values.push_back (ValueFactory::GetVarcharValue (course_on_date[cursor]));
@@ -178,7 +239,7 @@ auto GetFunctionOf(const MockScanPlanNode *plan) -> std::function<Tuple(size_t)>
178
239
};
179
240
}
180
241
181
- if (plan-> GetTable () == " __mock_agg_input_small" ) {
242
+ if (table == " __mock_agg_input_small" ) {
182
243
return [plan](size_t cursor) {
183
244
std::vector<Value> values{};
184
245
values.push_back (ValueFactory::GetIntegerValue ((cursor + 2 ) % 10 ));
@@ -192,7 +253,7 @@ auto GetFunctionOf(const MockScanPlanNode *plan) -> std::function<Tuple(size_t)>
192
253
};
193
254
}
194
255
195
- if (plan-> GetTable () == " __mock_agg_input_big" ) {
256
+ if (table == " __mock_agg_input_big" ) {
196
257
return [plan](size_t cursor) {
197
258
std::vector<Value> values{};
198
259
values.push_back (ValueFactory::GetIntegerValue ((cursor + 2 ) % 10 ));
@@ -206,15 +267,15 @@ auto GetFunctionOf(const MockScanPlanNode *plan) -> std::function<Tuple(size_t)>
206
267
};
207
268
}
208
269
209
- if (plan-> GetTable () == " __mock_table_123" ) {
270
+ if (table == " __mock_table_123" ) {
210
271
return [plan](size_t cursor) {
211
272
std::vector<Value> values{};
212
273
values.push_back (ValueFactory::GetIntegerValue (cursor + 1 ));
213
274
return Tuple{values, &plan->OutputSchema ()};
214
275
};
215
276
}
216
277
217
- if (plan-> GetTable () == " __mock_graph" ) {
278
+ if (table == " __mock_graph" ) {
218
279
return [plan](size_t cursor) {
219
280
std::vector<Value> values{};
220
281
int src = cursor % GRAPH_NODE_CNT;
@@ -232,6 +293,81 @@ auto GetFunctionOf(const MockScanPlanNode *plan) -> std::function<Tuple(size_t)>
232
293
};
233
294
}
234
295
296
+ if (table == " __mock_t1_50k" ) {
297
+ return [plan](size_t cursor) {
298
+ std::vector<Value> values{};
299
+ values.push_back (ValueFactory::GetIntegerValue (cursor * 10 ));
300
+ values.push_back (ValueFactory::GetIntegerValue (cursor * 1000 ));
301
+ return Tuple{values, &plan->OutputSchema ()};
302
+ };
303
+ }
304
+
305
+ if (table == " __mock_t2_100k" ) {
306
+ return [plan](size_t cursor) {
307
+ std::vector<Value> values{};
308
+ values.push_back (ValueFactory::GetIntegerValue (cursor));
309
+ values.push_back (ValueFactory::GetIntegerValue (cursor * 100 ));
310
+ return Tuple{values, &plan->OutputSchema ()};
311
+ };
312
+ }
313
+
314
+ if (table == " __mock_t3_1k" ) {
315
+ return [plan](size_t cursor) {
316
+ std::vector<Value> values{};
317
+ values.push_back (ValueFactory::GetIntegerValue (cursor * 100 ));
318
+ values.push_back (ValueFactory::GetIntegerValue (cursor * 10000 ));
319
+ return Tuple{values, &plan->OutputSchema ()};
320
+ };
321
+ }
322
+
323
+ if (table == " __mock_t4_1m" ) {
324
+ return [plan](size_t cursor) {
325
+ std::vector<Value> values{};
326
+ cursor = cursor % 500000 ;
327
+ values.push_back (ValueFactory::GetIntegerValue (cursor));
328
+ values.push_back (ValueFactory::GetIntegerValue (cursor * 10 ));
329
+ return Tuple{values, &plan->OutputSchema ()};
330
+ };
331
+ }
332
+
333
+ if (table == " __mock_t5_1m" ) {
334
+ return [plan](size_t cursor) {
335
+ std::vector<Value> values{};
336
+ cursor = (cursor + 30000 ) % 500000 ;
337
+ values.push_back (ValueFactory::GetIntegerValue (cursor));
338
+ values.push_back (ValueFactory::GetIntegerValue (cursor * 10 ));
339
+ return Tuple{values, &plan->OutputSchema ()};
340
+ };
341
+ }
342
+
343
+ if (table == " __mock_t6_1m" ) {
344
+ return [plan](size_t cursor) {
345
+ std::vector<Value> values{};
346
+ cursor = (cursor + 60000 ) % 500000 ;
347
+ values.push_back (ValueFactory::GetIntegerValue (cursor));
348
+ values.push_back (ValueFactory::GetIntegerValue (cursor * 10 ));
349
+ return Tuple{values, &plan->OutputSchema ()};
350
+ };
351
+ }
352
+
353
+ if (table == " __mock_t7" ) {
354
+ return [plan](size_t cursor) {
355
+ std::vector<Value> values{};
356
+ values.push_back (ValueFactory::GetIntegerValue (cursor % 20 ));
357
+ values.push_back (ValueFactory::GetIntegerValue (cursor));
358
+ values.push_back (ValueFactory::GetIntegerValue (cursor));
359
+ return Tuple{values, &plan->OutputSchema ()};
360
+ };
361
+ }
362
+
363
+ if (table == " __mock_t8" ) {
364
+ return [plan](size_t cursor) {
365
+ std::vector<Value> values{};
366
+ values.push_back (ValueFactory::GetIntegerValue (cursor));
367
+ return Tuple{values, &plan->OutputSchema ()};
368
+ };
369
+ }
370
+
235
371
// By default, return table of all 0.
236
372
return [plan](size_t cursor) {
237
373
std::vector<Value> values{};
@@ -244,7 +380,16 @@ auto GetFunctionOf(const MockScanPlanNode *plan) -> std::function<Tuple(size_t)>
244
380
}
245
381
246
382
MockScanExecutor::MockScanExecutor (ExecutorContext *exec_ctx, const MockScanPlanNode *plan)
247
- : AbstractExecutor{exec_ctx}, plan_{plan}, func_(GetFunctionOf(plan)), size_(GetSizeOf(plan)) {}
383
+ : AbstractExecutor{exec_ctx}, plan_{plan}, func_(GetFunctionOf(plan)), size_(GetSizeOf(plan)) {
384
+ if (GetShuffled (plan)) {
385
+ for (size_t i = 0 ; i < size_; i++) {
386
+ shuffled_idx_.push_back (i);
387
+ }
388
+ std::random_device rd;
389
+ std::mt19937 g (rd ());
390
+ std::shuffle (shuffled_idx_.begin (), shuffled_idx_.end (), g);
391
+ }
392
+ }
248
393
249
394
void MockScanExecutor::Init () {
250
395
// Reset the cursor
@@ -256,7 +401,11 @@ auto MockScanExecutor::Next(Tuple *tuple, RID *rid) -> bool {
256
401
// Scan complete
257
402
return EXECUTOR_EXHAUSTED;
258
403
}
259
- *tuple = func_ (cursor_);
404
+ if (shuffled_idx_.empty ()) {
405
+ *tuple = func_ (cursor_);
406
+ } else {
407
+ *tuple = func_ (shuffled_idx_[cursor_]);
408
+ }
260
409
++cursor_;
261
410
*rid = MakeDummyRID ();
262
411
return EXECUTOR_ACTIVE;
0 commit comments