ruvector-dag 2.0.6

Directed Acyclic Graph (DAG) structures for query plan optimization with neural learning
Documentation
//! Basic usage example for Neural DAG Learning

use ruvector_dag::dag::{OperatorNode, OperatorType, QueryDag};

fn main() {
    println!("=== Neural DAG Learning - Basic Usage ===\n");

    // Create a new DAG
    let mut dag = QueryDag::new();

    // Add nodes representing query operators
    println!("Building query DAG...");

    let scan = dag.add_node(OperatorNode::seq_scan(0, "users"));
    println!("  Added SeqScan on 'users' (id: {})", scan);

    let filter = dag.add_node(OperatorNode::filter(1, "age > 18"));
    println!("  Added Filter 'age > 18' (id: {})", filter);

    let sort = dag.add_node(OperatorNode::sort(2, vec!["name".to_string()]));
    println!("  Added Sort by 'name' (id: {})", sort);

    let limit = dag.add_node(OperatorNode::limit(3, 10));
    println!("  Added Limit 10 (id: {})", limit);

    let result = dag.add_node(OperatorNode::new(4, OperatorType::Result));
    println!("  Added Result (id: {})", result);

    // Connect nodes
    dag.add_edge(scan, filter).unwrap();
    dag.add_edge(filter, sort).unwrap();
    dag.add_edge(sort, limit).unwrap();
    dag.add_edge(limit, result).unwrap();

    println!("\nDAG Statistics:");
    println!("  Nodes: {}", dag.node_count());
    println!("  Edges: {}", dag.edge_count());

    // Compute topological order
    let order = dag.topological_sort().unwrap();
    println!("\nTopological Order: {:?}", order);

    // Compute depths
    let depths = dag.compute_depths();
    println!("\nNode Depths:");
    for (id, depth) in &depths {
        println!("  Node {}: depth {}", id, depth);
    }

    // Get children
    println!("\nNode Children:");
    for node_id in 0..5 {
        let children = dag.children(node_id);
        println!("  Node {}: {:?}", node_id, children);
    }

    // Demonstrate iterators
    println!("\nDFS Traversal:");
    for (i, node_id) in dag.dfs_iter(scan).enumerate() {
        if i < 10 {
            println!("  Visit: {}", node_id);
        }
    }

    println!("\nBFS Traversal:");
    for (i, node_id) in dag.bfs_iter(scan).enumerate() {
        if i < 10 {
            println!("  Visit: {}", node_id);
        }
    }

    println!("\n=== Example Complete ===");
}