use std::collections::VecDeque;
use vortex_error::{VortexResult, vortex_bail};
use crate::pipeline::operator::{NodeId, PipelineNode};
pub(super) fn topological_sort(dag: &[PipelineNode]) -> VortexResult<Vec<NodeId>> {
let mut in_degree = vec![0; dag.len()];
let mut queue = VecDeque::new();
let mut result = Vec::new();
for node in dag {
for &child in &node.children {
in_degree[child] += 1;
}
}
for (idx, °ree) in in_degree.iter().enumerate() {
if degree == 0 {
queue.push_back(idx);
}
}
while let Some(idx) = queue.pop_front() {
result.push(idx);
for &child in &dag[idx].children {
in_degree[child] -= 1;
if in_degree[child] == 0 {
queue.push_back(child);
}
}
}
if result.len() != dag.len() {
vortex_bail!(
"Cycle detected in DAG: expected {} nodes, found {}",
dag.len(),
result.len()
);
}
result.reverse();
Ok(result)
}