@@ -69,6 +69,9 @@ pub struct QueryBuilder {
69
69
/// Max columns num in randomly generated `groupings`
70
70
max_group_by_columns : usize ,
71
71
72
+ /// Min columns num in randomly generated `groupings`
73
+ min_group_by_columns : usize ,
74
+
72
75
/// The sort keys of dataset
73
76
///
74
77
/// Due to optimizations will be triggered when all or some
@@ -181,8 +184,14 @@ impl QueryBuilder {
181
184
/// Add max columns num in group by(default: 3), for example if it is set to 1,
182
185
/// the generated sql will group by at most 1 column
183
186
#[ allow( dead_code) ]
184
- pub fn with_max_group_by_columns ( mut self , group_by_columns : usize ) -> Self {
185
- self . max_group_by_columns = group_by_columns;
187
+ pub fn with_max_group_by_columns ( mut self , max_group_by_columns : usize ) -> Self {
188
+ self . max_group_by_columns = max_group_by_columns;
189
+ self
190
+ }
191
+
192
+ #[ allow( dead_code) ]
193
+ pub fn with_min_group_by_columns ( mut self , min_group_by_columns : usize ) -> Self {
194
+ self . min_group_by_columns = min_group_by_columns;
186
195
self
187
196
}
188
197
@@ -237,6 +246,7 @@ impl QueryBuilder {
237
246
238
247
fn generate_query ( & self ) -> String {
239
248
let group_by = self . random_group_by ( ) ;
249
+ dbg ! ( & group_by) ;
240
250
let mut query = String :: from ( "SELECT " ) ;
241
251
query. push_str ( & group_by. join ( ", " ) ) ;
242
252
if !group_by. is_empty ( ) {
@@ -267,7 +277,7 @@ impl QueryBuilder {
267
277
fn random_aggregate_functions ( & self , group_by_cols : & [ String ] ) -> Vec < String > {
268
278
const MAX_NUM_FUNCTIONS : usize = 5 ;
269
279
let mut rng = thread_rng ( ) ;
270
- let num_aggregate_functions = rng. gen_range ( 1 ..MAX_NUM_FUNCTIONS ) ;
280
+ let num_aggregate_functions = rng. gen_range ( 1 ..= MAX_NUM_FUNCTIONS ) ;
271
281
272
282
let mut alias_gen = 1 ;
273
283
@@ -349,12 +359,13 @@ impl QueryBuilder {
349
359
350
360
/// Pick a random number of fields to group by (non-repeating)
351
361
///
352
- /// Limited to 3 group by columns to ensure coverage for large groups. With
353
- /// larger numbers of columns, each group has many fewer values.
362
+ /// Limited to `max_group_by_columns` group by columns to ensure coverage for large groups.
363
+ /// With larger numbers of columns, each group has many fewer values.
354
364
fn random_group_by ( & self ) -> Vec < String > {
355
365
let mut rng = thread_rng ( ) ;
356
- let max_groups = self . group_by_columns . len ( ) . max ( self . max_group_by_columns ) ;
357
- let num_group_by = rng. gen_range ( 1 ..max_groups) ;
366
+ let min_groups = self . max_group_by_columns ;
367
+ let max_groups = self . min_group_by_columns ;
368
+ let num_group_by = rng. gen_range ( min_groups..=max_groups) ;
358
369
359
370
let mut already_used = HashSet :: new ( ) ;
360
371
let mut group_by = vec ! [ ] ;
0 commit comments