rails-0009: FilterAttributeHandler filter_parameters Array O(A×F) → Set (450×) rails-0010: Encryption::AutoFilteredParameters two Array scans → Set (250×) rails-0011: TimeZoneConversion skip_list Array O(M×C×S) → Set (20×) exposed-0001: SchemaUtilityApi mapMissingColumnStatements O(N×M) → map (118×) exposed-0002: IdentifierManagerApi isAKeyword O(K) linear → HashSet (144×) exposed-0003: Table.clone consParams.map fresh List → hoisted HashSet (6×) seaorm-0001: active_model establish_links leftover.any O(N²) → HashSet (501×) seaorm-0002: rbac engine group_permissions .values().find() → HashMap by ID (502×) seaorm-0003: schema builder sorted_tables Vec::contains → HashSet (500×) seaorm-0004: TopologicalSort from_iter seen Vec O(N²) → BTreeSet (28×) Unit tests: RailsTest 11/11, ExposedTest 3/3, SeaORMTest 4/4 PASS Whitepaper: 157→167 sites, 62→64 ecosystems; §13.12 ORM Wave 2 added
42 lines
1.7 KiB
Diff
42 lines
1.7 KiB
Diff
--- 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
|
|
}
|