diff --git a/crates/manager-core/src/trigger_repo.rs b/crates/manager-core/src/trigger_repo.rs index 9d8c22a..8a725de 100644 --- a/crates/manager-core/src/trigger_repo.rs +++ b/crates/manager-core/src/trigger_repo.rs @@ -979,10 +979,21 @@ impl TriggerRepo for PostgresTriggerRepo { .fetch_all(&self.pool) .await?; - let mut out = Vec::with_capacity(parents.len()); - for p in parents { - out.push(hydrate_one(&self.pool, p).await?); - } + // F-P-008 (partial): concurrent hydration so a dashboard with N + // triggers waits for max(per-row-latency) instead of + // sum(per-row-latency). Still N+1 queries against the details + // tables — collapsing to a single per-kind LEFT JOIN is a + // larger SQL refactor tracked as v1.2. + use futures::stream::{self, TryStreamExt}; + let pool = self.pool.clone(); + let out = stream::iter(parents.into_iter().map(Ok)) + .map_ok(|p| { + let pool = pool.clone(); + async move { hydrate_one(&pool, p).await } + }) + .try_buffered(8) + .try_collect::>() + .await?; Ok(out) }