DAG: expose deterministic recompute levels
This commit is contained in:
@@ -11,6 +11,7 @@ export type DependencyEdge = {
|
||||
export type RecomputePlan = {
|
||||
affected: string[]
|
||||
order: string[]
|
||||
levels: string[][]
|
||||
cycles: string[][]
|
||||
}
|
||||
|
||||
@@ -85,7 +86,14 @@ export class DependencyGraph {
|
||||
if (!cyclic.has(nodeId)) order.push(nodeId)
|
||||
}
|
||||
for (const nodeId of affected) visitDependencies(nodeId)
|
||||
return { affected: [...affected], order, cycles }
|
||||
const levelByNode = new Map<string, number>()
|
||||
for (const nodeId of order) {
|
||||
const level = Math.max(0, ...this.dependenciesOf(nodeId).filter((dependency) => affected.has(dependency)).map((dependency) => (levelByNode.get(dependency) ?? 0) + 1))
|
||||
levelByNode.set(nodeId, level)
|
||||
}
|
||||
const levels: string[][] = []
|
||||
for (const nodeId of order) { const level = levelByNode.get(nodeId) ?? 0; (levels[level] ??= []).push(nodeId) }
|
||||
return { affected: [...affected], order, levels, cycles }
|
||||
}
|
||||
|
||||
findCycles(scope: Set<string> = this.nodes): string[][] {
|
||||
|
||||
@@ -49,6 +49,7 @@ export type RecomputeExecutionResult = {
|
||||
status: RecomputeExecutionStatus
|
||||
affected: string[]
|
||||
order: string[]
|
||||
levels: string[][]
|
||||
completed: string[]
|
||||
failed: string[]
|
||||
skipped: string[]
|
||||
@@ -116,6 +117,7 @@ export class RecomputeCoordinator {
|
||||
status,
|
||||
affected: plan.affected,
|
||||
order: plan.order,
|
||||
levels: plan.levels,
|
||||
completed,
|
||||
failed,
|
||||
skipped,
|
||||
|
||||
Reference in New Issue
Block a user