Skip to main content

toolu_orm_query/select/relational/
sqlite_sql.rs

1//! SQLite correlated subquery SQL generation for relational SELECT queries.
2
3use super::config::RelationalSelectBuilder;
4
5impl RelationalSelectBuilder {
6  /// SQLite: correlated subqueries + `json_group_array` / `json_array`.
7  pub fn to_sql_sqlite(&self) -> String {
8    let mut sql = String::new();
9    sql.push_str("SELECT ");
10    self.push_source_select(&mut sql);
11
12    for rel in &self.relations {
13      sql.push_str(", (SELECT ");
14      if rel.is_many {
15        sql.push_str("coalesce(json_group_array(json_array(");
16        Self::push_column_list(&mut sql, &rel.target_table, &rel.target_columns);
17        sql.push_str(")), json_array())");
18      } else {
19        sql.push_str("json_array(");
20        Self::push_column_list(&mut sql, &rel.target_table, &rel.target_columns);
21        sql.push(')');
22      }
23
24      sql.push_str(" FROM \"");
25      sql.push_str(&rel.target_table);
26      sql.push('"');
27      self.push_join_where(&mut sql, &rel.target_table, rel);
28
29      sql.push_str(") AS \"");
30      sql.push_str(&rel.field_name);
31      sql.push('"');
32    }
33
34    sql.push_str(" FROM \"");
35    sql.push_str(&self.source_table);
36    sql.push('"');
37
38    sql
39  }
40
41  /// SQL for the active driver feature (`postgres` vs default sqlite/libsql).
42  pub fn to_sql(&self) -> String {
43    #[cfg(feature = "postgres")]
44    {
45      self.to_sql_postgres()
46    }
47    #[cfg(not(feature = "postgres"))]
48    {
49      self.to_sql_sqlite()
50    }
51  }
52}