test_multi_cte/
test_multi_cte.rs1use qail_core::parse;
4use qail_core::transpiler::ToSql;
5
6fn main() {
7 println!("=== Testing Multiple CTEs ===\n");
8
9 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 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 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!(
52 " CTEs: {:?}",
53 cmd.ctes.iter().map(|c| &c.name).collect::<Vec<_>>()
54 );
55 println!(" Final table: {}", cmd.table);
56 println!(" Joins: {}", cmd.joins.len());
57 println!(" SQL: {}\n", cmd.to_sql());
58 }
59 Err(e) => println!(" Error: {}\n", e),
60 }
61}