diff --git a/sql_generation/generation/mod.rs b/sql_generation/generation/mod.rs index 18fa78021..25f353673 100644 --- a/sql_generation/generation/mod.rs +++ b/sql_generation/generation/mod.rs @@ -142,11 +142,15 @@ pub fn pick_index(choices: usize, rng: &mut R) -> usize { /// pick_n_unique is a helper function for uniformly picking N unique elements from a range. /// The elements themselves are usize, typically representing indices. -pub fn pick_n_unique(range: std::ops::Range, n: usize, rng: &mut R) -> Vec { +pub fn pick_n_unique( + range: std::ops::Range, + n: usize, + rng: &mut R, +) -> impl Iterator { use rand::seq::SliceRandom; let mut items: Vec = range.collect(); items.shuffle(rng); - items.into_iter().take(n).collect() + items.into_iter().take(n) } /// gen_random_text uses `anarchist_readable_name_generator_lib` to generate random @@ -168,22 +172,19 @@ pub fn gen_random_text(rng: &mut T) -> String { } } -pub fn pick_unique( - items: &[T], +pub fn pick_unique<'a, T: PartialEq>( + items: &'a [T], count: usize, rng: &mut impl rand::Rng, -) -> Vec -where - ::Owned: PartialEq, -{ - let mut picked: Vec = Vec::new(); +) -> impl Iterator { + let mut picked: Vec<&T> = Vec::new(); while picked.len() < count { let item = pick(items, rng); - if !picked.contains(&item.to_owned()) { - picked.push(item.to_owned()); + if !picked.contains(&item) { + picked.push(item); } } - picked + picked.into_iter() } #[cfg(test)] diff --git a/sql_generation/generation/query.rs b/sql_generation/generation/query.rs index 54ca17ccf..e2a36ddb9 100644 --- a/sql_generation/generation/query.rs +++ b/sql_generation/generation/query.rs @@ -169,8 +169,7 @@ impl ArbitrarySized for SelectInner { .collect::>(); let selected_columns = pick_unique(&flat_columns_names, num_result_columns, rng); let columns = selected_columns - .into_iter() - .map(|col_name| ResultColumn::Column(col_name)) + .map(|col_name| ResultColumn::Column(col_name.clone())) .collect(); select_inner.columns = columns; @@ -338,7 +337,6 @@ impl Arbitrary for CreateIndex { let picked_column_indices = pick_n_unique(0..table.columns.len(), num_columns_to_pick, rng); let columns = picked_column_indices - .into_iter() .map(|i| { let column = &table.columns[i]; ( @@ -372,7 +370,6 @@ impl Arbitrary for Update { let num_cols = rng.random_range(1..=table.columns.len()); let columns = pick_unique(&table.columns, num_cols, rng); let set_values: Vec<(String, SimValue)> = columns - .iter() .map(|column| { ( column.name.clone(),