24 lines
1 KiB
Diff
24 lines
1 KiB
Diff
# UNDF: UNDF-2026-000000274
|
|
--- a/src/entity/active_model.rs
|
|
+++ b/src/entity/active_model.rs
|
|
@@ -1256,12 +1256,17 @@ async fn establish_links<EM, J, RM, C>(
|
|
let leftover = leftover; // un-mut
|
|
|
|
let mut via_models = Vec::new();
|
|
let mut all_keys = std::collections::HashSet::new();
|
|
|
|
+ // Pre-build a set of leftover keys so the existence check inside the loop
|
|
+ // is O(1) instead of O(|leftover|), avoiding an O(N²) scan.
|
|
+ let leftover_key_set: std::collections::HashSet<ValueTuple> =
|
|
+ leftover.iter().map(|(_, k)| k.clone()).collect();
|
|
+
|
|
for related_model in related_models {
|
|
let mut via: J::ActiveModel = ActiveModelBehavior::new();
|
|
via.set_parent_key_for_def(model, &left)?;
|
|
via.set_parent_key_for_def(related_model, &right)?;
|
|
let via_key = get_key_from_active_model(&right.from_col, &via)?;
|
|
- if !leftover.iter().any(|t| t.1 == via_key) {
|
|
+ if !leftover_key_set.contains(&via_key) {
|
|
// if not already exist, save for insert
|
|
via_models.push(via);
|
|
}
|