java-topology/defects/seaorm/patch/seaorm-0003-sorted-tables-hashset.patch

43 lines
1.7 KiB
Diff

# UNDF: UNDF-2026-000000276
--- a/src/schema/builder.rs
+++ b/src/schema/builder.rs
@@ -212,17 +212,22 @@ impl SchemaBuilder {
fn sorted_tables(&self) -> Vec<TableName> {
let mut sorter = TopologicalSort::<TableName>::new();
for entity in self.entities.iter() {
let table_name = get_table_name(entity.table.get_table_name());
sorter.insert(table_name);
}
for entity in self.entities.iter() {
let self_table = get_table_name(entity.table.get_table_name());
for fk in entity.table.get_foreign_key_create_stmts().iter() {
let fk = fk.get_foreign_key();
let ref_table = get_table_name(fk.get_ref_table());
if self_table != ref_table {
// self cycle is okay
sorter.add_dependency(ref_table, self_table.clone());
}
}
}
- let mut sorted = Vec::new();
+ let mut sorted: Vec<TableName> = Vec::new();
+ let mut sorted_set: std::collections::HashSet<TableName> = Default::default();
while let Some(i) = sorter.pop() {
+ sorted_set.insert(i.clone());
sorted.push(i);
}
if sorted.len() != self.entities.len() {
// push leftover tables
for entity in self.entities.iter() {
let table_name = get_table_name(entity.table.get_table_name());
- if !sorted.contains(&table_name) {
- sorted.push(table_name);
+ if sorted_set.insert(table_name.clone()) {
+ sorted.push(table_name);
}
}
}
sorted
}