test_multi_cte/
test_multi_cte.rs

1//! Test Multiple CTEs
2
3use qail_core::parse;
4use qail_core::transpiler::ToSql;
5
6fn main() {
7    println!("=== Testing Multiple CTEs ===\n");
8    
9    // Test 1: Multiple CTEs with raw SQL bodies
10    let query1 = r#"with 
11        latest_msgs as (select distinct on (phone) phone, content from messages order by phone, created_at desc),
12        unread as (select phone, count(*) as cnt from messages where status = 'received' group by phone)
13        get latest_msgs"#;
14    
15    println!("Query 1 (Multi-CTE with raw SQL):");
16    match parse(query1) {
17        Ok(cmd) => {
18            println!("  CTEs count: {}", cmd.ctes.len());
19            for cte in &cmd.ctes {
20                println!("    - {}", cte.name);
21            }
22            println!("  SQL: {}\n", cmd.to_sql());
23        }
24        Err(e) => println!("  Error: {}\n", e),
25    }
26    
27    // Test 2: Multiple CTEs with QAIL syntax inside
28    let query2 = r#"with 
29        latest as (get messages fields phone, content order by created_at desc limit 1),
30        counts as (get messages fields phone, count(*) as cnt group by phone)
31        get latest"#;
32    
33    println!("Query 2 (Multi-CTE with QAIL syntax):");
34    match parse(query2) {
35        Ok(cmd) => {
36            println!("  CTEs count: {}", cmd.ctes.len());
37            println!("  SQL: {}\n", cmd.to_sql());
38        }
39        Err(e) => println!("  Error: {}\n", e),
40    }
41    
42    // Test 3: CTE with JOINs in final query
43    let query3 = r#"with 
44        a as (get users fields id, name),
45        b as (get orders fields user_id, total)
46        get a left join b on a.id = b.user_id fields a.name, b.total"#;
47    
48    println!("Query 3 (CTE with JOIN in final):");
49    match parse(query3) {
50        Ok(cmd) => {
51            println!("  CTEs: {:?}", cmd.ctes.iter().map(|c| &c.name).collect::<Vec<_>>());
52            println!("  Final table: {}", cmd.table);
53            println!("  Joins: {}", cmd.joins.len());
54            println!("  SQL: {}\n", cmd.to_sql());
55        }
56        Err(e) => println!("  Error: {}\n", e),
57    }
58}