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:
1 parent
42d3638cf8
commit
4c4150a042
1 file changed
+15
-4
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user