1
1
use std:: time:: Duration ;
2
2
3
3
use criterion:: { black_box, criterion_group, criterion_main, Criterion } ;
4
- use itertools:: Itertools ;
5
- use rand:: { Rng , SeedableRng } ;
6
4
7
5
use partiql_eval:: env:: basic:: MapBindings ;
8
6
use partiql_eval:: eval:: EvalPlan ;
9
7
use partiql_eval:: plan:: EvaluatorPlanner ;
10
8
use partiql_logical:: { BindingsOp , LogicalPlan } ;
11
9
10
+ use crate :: multi_like_data:: { employee_data, QUERY_1 , QUERY_15 , QUERY_30 } ;
12
11
use partiql_parser:: { Parser , ParserResult } ;
13
- use partiql_value:: { partiql_tuple , Bag , Tuple , Value } ;
12
+ use partiql_value:: Value ;
14
13
15
14
// Benchmarks:
16
15
// - parsing,
@@ -21,315 +20,7 @@ use partiql_value::{partiql_tuple, Bag, Tuple, Value};
21
20
// of queries that filter against 1, 15, or 30 `OR`ed `LIKE` expressions
22
21
// over 10201 rows of tuples containing an id and a string
23
22
24
- fn employee_data ( ) -> Vec < Value > {
25
- let name1 = vec ! [
26
- "Bob" ,
27
- "Madden" ,
28
- "Brycen" ,
29
- "Bryanna" ,
30
- "Zayne" ,
31
- "Jocelynn" ,
32
- "Breanna" ,
33
- "Margaret" ,
34
- "Jasmine" ,
35
- "Kenyon" ,
36
- "Aryanna" ,
37
- "Zackery" ,
38
- "Jorden" ,
39
- "Malia" ,
40
- "Raven" ,
41
- "Neveah" ,
42
- "Finley" ,
43
- "Austin" ,
44
- "Jaxson" ,
45
- "Tobias" ,
46
- "Dominique" ,
47
- "Devan" ,
48
- "Colby" ,
49
- "Tanner" ,
50
- "Mckenna" ,
51
- "Kristina" ,
52
- "Cristal" ,
53
- "River" ,
54
- "Taliyah" ,
55
- "Abagail" ,
56
- "Spencer" ,
57
- "Gage" ,
58
- "Ronnie" ,
59
- "Amari" ,
60
- "Jabari" ,
61
- "Alanna" ,
62
- "Anderson" ,
63
- "Saniya" ,
64
- "Baylee" ,
65
- "Elisa" ,
66
- "Savannah" ,
67
- "Jakobe" ,
68
- "Sandra" ,
69
- "Simone" ,
70
- "Frank" ,
71
- "Braedon" ,
72
- "Clark" ,
73
- "Francisco" ,
74
- "Roman" ,
75
- "Matias" ,
76
- "Messi" ,
77
- "Elisha" ,
78
- "Alexander" ,
79
- "Kadence" ,
80
- "Karsyn" ,
81
- "Adonis" ,
82
- "Ishaan" ,
83
- "Trevon" ,
84
- "Ryan" ,
85
- "Jaelynn" ,
86
- "Marilyn" ,
87
- "Emma" ,
88
- "Avah" ,
89
- "Jordan" ,
90
- "Riley" ,
91
- "Amelie" ,
92
- "Denisse" ,
93
- "Darion" ,
94
- "Lydia" ,
95
- "Marley" ,
96
- "Brogan" ,
97
- "Trace" ,
98
- "Maeve" ,
99
- "Elijah" ,
100
- "Kareem" ,
101
- "Erick" ,
102
- "Hope" ,
103
- "Elisabeth" ,
104
- "Antwan" ,
105
- "Francesca" ,
106
- "Layla" ,
107
- "Jase" ,
108
- "Angel" ,
109
- "Addyson" ,
110
- "Mckinley" ,
111
- "Julianna" ,
112
- "Winston" ,
113
- "Royce" ,
114
- "Paola" ,
115
- "Issac" ,
116
- "Zachary" ,
117
- "Niko" ,
118
- "Shania" ,
119
- "Colin" ,
120
- "Jesse" ,
121
- "Pedro" ,
122
- "Cheyenne" ,
123
- "Ashley" ,
124
- "Karli" ,
125
- "Bianca" ,
126
- "Mario" ,
127
- ] ;
128
- let name2 = vec ! [
129
- "Smith" ,
130
- "Oconnell" ,
131
- "Whitehead" ,
132
- "Carrillo" ,
133
- "Parrish" ,
134
- "Monroe" ,
135
- "Summers" ,
136
- "Hurst" ,
137
- "Durham" ,
138
- "Hardin" ,
139
- "Hunt" ,
140
- "Mitchell" ,
141
- "Pennington" ,
142
- "Woodward" ,
143
- "Franklin" ,
144
- "Martinez" ,
145
- "Shepard" ,
146
- "Khan" ,
147
- "Mcfarland" ,
148
- "Frey" ,
149
- "Mckenzie" ,
150
- "Blair" ,
151
- "Mercer" ,
152
- "Callahan" ,
153
- "Cameron" ,
154
- "Gilmore" ,
155
- "Bowers" ,
156
- "Donovan" ,
157
- "Meyers" ,
158
- "Horne" ,
159
- "Rice" ,
160
- "Castillo" ,
161
- "Cain" ,
162
- "Dickson" ,
163
- "Valenzuela" ,
164
- "Silva" ,
165
- "Prince" ,
166
- "Vance" ,
167
- "Berry" ,
168
- "Coffey" ,
169
- "Young" ,
170
- "Walker" ,
171
- "Burch" ,
172
- "Ross" ,
173
- "Mejia" ,
174
- "Zuniga" ,
175
- "Haney" ,
176
- "Jordan" ,
177
- "Love" ,
178
- "Larsen" ,
179
- "Bowman" ,
180
- "Werner" ,
181
- "Greer" ,
182
- "Krause" ,
183
- "Bishop" ,
184
- "Day" ,
185
- "Luna" ,
186
- "Patrick" ,
187
- "Adkins" ,
188
- "Benson" ,
189
- "Mcconnell" ,
190
- "Sanchez" ,
191
- "Villa" ,
192
- "Wu" ,
193
- "Duke" ,
194
- "Fisher" ,
195
- "Hess" ,
196
- "Lawrence" ,
197
- "Perry" ,
198
- "Hardy" ,
199
- "Wyatt" ,
200
- "Mcknight" ,
201
- "Thomas" ,
202
- "Trevino" ,
203
- "Flowers" ,
204
- "Cisneros" ,
205
- "Coleman" ,
206
- "Sanders" ,
207
- "Good" ,
208
- "Newton" ,
209
- "Carpenter" ,
210
- "Garza" ,
211
- "Barber" ,
212
- "Swanson" ,
213
- "Owen" ,
214
- "Anderson" ,
215
- "Bright" ,
216
- "Beck" ,
217
- "Lawson" ,
218
- "Jones" ,
219
- "Davila" ,
220
- "Porter" ,
221
- "Dougherty" ,
222
- "Stevenson" ,
223
- "Malone" ,
224
- "Garrison" ,
225
- "Bates" ,
226
- "Wheeler" ,
227
- "Petty" ,
228
- "Rojas" ,
229
- "Townsend" ,
230
- ] ;
231
-
232
- // cartesian product of name1 x name2 (e.g., "Bob Smith", ... "Mario Townsend")
233
- let combined = name1
234
- . iter ( )
235
- . cartesian_product ( name2. iter ( ) )
236
- . map ( |( n1, n2) | format ! ( "{n1} {n2}" ) ) ;
237
-
238
- // seed the rng with a known value to assure same data across runs
239
- let mut rng = rand:: rngs:: StdRng :: from_seed ( [ 42 ; 32 ] ) ;
240
- use rand:: distributions:: Distribution ;
241
- let chars = rand:: distributions:: Alphanumeric ;
242
- let random_size = rand:: distributions:: uniform:: Uniform :: from ( 5 ..=100 ) ;
243
-
244
- // add random string prefix and suffix to each combined name
245
- let employee_data: Vec < Value > = combined
246
- . enumerate ( )
247
- . map ( |( id, person) | {
248
- let prefix_size = random_size. sample ( & mut rng) ;
249
- let suffix_size = random_size. sample ( & mut rng) ;
250
- let prefix: String = ( 0 ..prefix_size)
251
- . map ( |_| rng. sample ( chars) as char )
252
- . collect ( ) ;
253
- let suffix: String = ( 0 ..suffix_size)
254
- . map ( |_| rng. sample ( chars) as char )
255
- . collect ( ) ;
256
- let full_name = format ! ( "{prefix} {person} {suffix}" ) ;
257
- partiql_tuple ! [ ( "id" , id) , ( "name" , full_name) ] . into ( )
258
- } )
259
- . collect_vec ( ) ;
260
-
261
- employee_data
262
- }
263
-
264
- fn data ( ) -> MapBindings < Value > {
265
- let data = partiql_tuple ! [ (
266
- "hr" ,
267
- partiql_tuple![ ( "employees" , Bag :: from( employee_data( ) ) ) ]
268
- ) ] ;
269
-
270
- data. into ( )
271
- }
272
-
273
- const QUERY_1 : & str = "
274
- SELECT *
275
- FROM hr.employees as emp
276
- WHERE lower(emp.name) LIKE '%bob smith%'
277
- " ;
278
-
279
- const QUERY_15 : & str = "
280
- SELECT *
281
- FROM hr.employees as emp
282
- WHERE lower(emp.name) LIKE '%bob smith%'
283
- OR lower(emp.name) LIKE '%gage swanson%'
284
- OR lower(emp.name) LIKE '%riley perry%'
285
- OR lower(emp.name) LIKE '%sandra woodward%'
286
- OR lower(emp.name) LIKE '%abagail oconnell%'
287
- OR lower(emp.name) LIKE '%amari duke%'
288
- OR lower(emp.name) LIKE '%elisha wyatt%'
289
- OR lower(emp.name) LIKE '%aryanna hess%'
290
- OR lower(emp.name) LIKE '%bryanna jones%'
291
- OR lower(emp.name) LIKE '%trace gilmore%'
292
- OR lower(emp.name) LIKE '%antwan stevenson%'
293
- OR lower(emp.name) LIKE '%julianna callahan%'
294
- OR lower(emp.name) LIKE '%jaelynn trevino%'
295
- OR lower(emp.name) LIKE '%kadence bates%'
296
- OR lower(emp.name) LIKE '%jakobe townsend%'
297
- " ;
298
-
299
- const QUERY_30 : & str = "
300
- SELECT *
301
- FROM hr.employees as emp
302
- WHERE lower(emp.name) LIKE '%bob smith%'
303
- OR lower(emp.name) LIKE '%gage swanson%'
304
- OR lower(emp.name) LIKE '%riley perry%'
305
- OR lower(emp.name) LIKE '%sandra woodward%'
306
- OR lower(emp.name) LIKE '%abagail oconnell%'
307
- OR lower(emp.name) LIKE '%amari duke%'
308
- OR lower(emp.name) LIKE '%elisha wyatt%'
309
- OR lower(emp.name) LIKE '%aryanna hess%'
310
- OR lower(emp.name) LIKE '%bryanna jones%'
311
- OR lower(emp.name) LIKE '%trace gilmore%'
312
- OR lower(emp.name) LIKE '%antwan stevenson%'
313
- OR lower(emp.name) LIKE '%julianna callahan%'
314
- OR lower(emp.name) LIKE '%jaelynn trevino%'
315
- OR lower(emp.name) LIKE '%kadence bates%'
316
- OR lower(emp.name) LIKE '%jakobe townsend%'
317
- OR lower(emp.name) LIKE '%austin pennington%'
318
- OR lower(emp.name) LIKE '%colby woodward%'
319
- OR lower(emp.name) LIKE '%brycen blair%'
320
- OR lower(emp.name) LIKE '%cristal mercer%'
321
- OR lower(emp.name) LIKE '%river gilmore%'
322
- OR lower(emp.name) LIKE '%saniya bowers%'
323
- OR lower(emp.name) LIKE '%braedon ross%'
324
- OR lower(emp.name) LIKE '%clark mejia%'
325
- OR lower(emp.name) LIKE '%ryan day%'
326
- OR lower(emp.name) LIKE '%marilyn luna%'
327
- OR lower(emp.name) LIKE '%avah sanchez%'
328
- OR lower(emp.name) LIKE '%amelie wu%'
329
- OR lower(emp.name) LIKE '%paola duke%'
330
- OR lower(emp.name) LIKE '%jesse trevino%'
331
- OR lower(emp.name) LIKE '%bianca cisneros%'
332
- " ;
23
+ mod multi_like_data;
333
24
334
25
#[ inline]
335
26
fn parse ( text : & str ) -> ParserResult {
@@ -413,7 +104,7 @@ fn bench_eval(c: &mut Criterion) {
413
104
let compiled_15 = compile ( & parse ( QUERY_15 ) . unwrap ( ) ) ;
414
105
let compiled_30 = compile ( & parse ( QUERY_30 ) . unwrap ( ) ) ;
415
106
416
- let bindings = data ( ) ;
107
+ let bindings = employee_data ( ) ;
417
108
418
109
c. bench_function ( "eval-1" , |b| {
419
110
b. iter ( || {
0 commit comments