perf: optimize backend — HTTP client, DB queries, error handling, and config cleanup
Some checks failed
CI / lint-and-build (push) Failing after 2m55s
Some checks failed
CI / lint-and-build (push) Failing after 2m55s
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
use std::collections::{HashMap, HashSet};
|
||||
use std::collections::{HashMap, HashSet, VecDeque};
|
||||
|
||||
pub fn escape_ident(name: &str) -> String {
|
||||
format!("\"{}\"", name.replace('"', "\"\""))
|
||||
@@ -44,27 +44,33 @@ pub fn topological_sort_tables(
|
||||
}
|
||||
|
||||
// Kahn's algorithm
|
||||
let mut queue: Vec<(String, String)> = in_degree
|
||||
let mut initial: Vec<(String, String)> = in_degree
|
||||
.iter()
|
||||
.filter(|(_, °)| deg == 0)
|
||||
.map(|(k, _)| k.clone())
|
||||
.collect();
|
||||
queue.sort(); // deterministic order
|
||||
initial.sort(); // deterministic order
|
||||
let mut queue: VecDeque<(String, String)> = VecDeque::from(initial);
|
||||
|
||||
let mut result = Vec::new();
|
||||
|
||||
while let Some(node) = queue.pop() {
|
||||
while let Some(node) = queue.pop_front() {
|
||||
result.push(node.clone());
|
||||
if let Some(neighbors) = graph.get(&node) {
|
||||
for neighbor in neighbors {
|
||||
if let Some(deg) = in_degree.get_mut(neighbor) {
|
||||
*deg -= 1;
|
||||
if *deg == 0 {
|
||||
queue.push(neighbor.clone());
|
||||
queue.sort();
|
||||
let mut new_ready: Vec<(String, String)> = neighbors
|
||||
.iter()
|
||||
.filter(|neighbor| {
|
||||
if let Some(deg) = in_degree.get_mut(*neighbor) {
|
||||
*deg -= 1;
|
||||
*deg == 0
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
.cloned()
|
||||
.collect();
|
||||
new_ready.sort();
|
||||
queue.extend(new_ready);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user