perf(tasks): refactor update and delete task handlers to eliminate string clones when mapping task relationships by relying on reference closures and index queues

This commit is contained in:
Riz Ashraf committed 2026-09-21 16:55:06 +01:00
1 parent 42d3638cf8
commit 4c4150a042
1 file changed
+15 -4
+15 -4
View File
@@ -206,16 +206,26 @@ impl McpTool for UpdateTaskStatusHandler {
// Cascade cancellation to children // Cascade cancellation to children
if target_status == "cancelled" || target_status == "abandoned" { if target_status == "cancelled" || target_status == "abandoned" {
let mut children_map: std::collections::HashMap<String, Vec<usize>> = let mut children_map: std::collections::HashMap<usize, Vec<usize>> =
std::collections::HashMap::new(); std::collections::HashMap::new();
// First pass: map string ID to index to build the adjacency list by index
let mut id_to_idx = std::collections::HashMap::new();
for (idx, t) in tasks.iter().enumerate() {
id_to_idx.insert(t.id.as_str(), idx);
}
for (idx, t) in tasks.iter().enumerate() { for (idx, t) in tasks.iter().enumerate() {
if let Some(pid) = &t.parent_id { if let Some(pid) = &t.parent_id {
children_map.entry(pid.clone()).or_default().push(idx); if let Some(&p_idx) = id_to_idx.get(pid.as_str()) {
children_map.entry(p_idx).or_default().push(idx);
}
} }
} }
if let Some(&start_idx) = id_to_idx.get(target_id.as_str()) {
let mut queue = std::collections::VecDeque::new(); let mut queue = std::collections::VecDeque::new();
queue.push_back(target_id.clone()); queue.push_back(start_idx);
while let Some(curr) = queue.pop_front() { while let Some(curr) = queue.pop_front() {
if let Some(child_indices) = children_map.get(&curr) { if let Some(child_indices) = children_map.get(&curr) {
@@ -224,7 +234,8 @@ impl McpTool for UpdateTaskStatusHandler {
&& tasks[idx].status != target_status && tasks[idx].status != target_status
{ {
tasks[idx].status = target_status.clone(); tasks[idx].status = target_status.clone();
queue.push_back(tasks[idx].id.clone()); queue.push_back(idx);
}
} }
} }
} }