grafbase_sql_ast/ast/delete.rs
1use crate::ast::{ConditionTree, Query, Table};
2
3use super::Expression;
4
5#[derive(Debug, PartialEq, Clone)]
6/// A builder for a `DELETE` statement.
7pub struct Delete<'a> {
8 pub(crate) table: Table<'a>,
9 pub(crate) conditions: Option<ConditionTree<'a>>,
10 pub(crate) returning: Option<Vec<Expression<'a>>>,
11}
12
13impl<'a> From<Delete<'a>> for Query<'a> {
14 fn from(delete: Delete<'a>) -> Self {
15 Query::Delete(Box::new(delete))
16 }
17}
18
19impl<'a> Delete<'a> {
20 /// Creates a new `DELETE` statement for the given table.
21 ///
22 /// ```rust
23 /// # use grafbase_sql_ast::{ast::*, renderer::{Renderer, self}};
24 /// # fn main() {
25 /// let query = Delete::from_table("users");
26 /// let (sql, _) = renderer::Postgres::build(query);
27 ///
28 /// assert_eq!(r#"DELETE FROM "users""#, sql);
29 /// # }
30 /// ```
31 pub fn from_table<T>(table: T) -> Self
32 where
33 T: Into<Table<'a>>,
34 {
35 Self {
36 table: table.into(),
37 conditions: None,
38 returning: None,
39 }
40 }
41
42 /// Adds `WHERE` conditions to the query. See
43 /// [Comparable](trait.Comparable.html#required-methods) for more examples.
44 ///
45 /// ```rust
46 /// # use grafbase_sql_ast::{ast::*, renderer::{Renderer, self}};
47 /// # fn main() {
48 /// let mut query = Delete::from_table("users");
49 /// query.so_that("bar".equals(false));
50 ///
51 /// let (sql, params) = renderer::Postgres::build(query);
52 ///
53 /// assert_eq!(r#"DELETE FROM "users" WHERE "bar" = $1"#, sql);
54 /// assert_eq!(vec![Value::from(false)], params);
55 /// # }
56 /// ```
57 pub fn so_that<T>(&mut self, conditions: T)
58 where
59 T: Into<ConditionTree<'a>>,
60 {
61 self.conditions = Some(conditions.into());
62 }
63
64 /// Adds a `RETURNING` definition to the `DELETE` statement. Defines the return
65 /// value of the query.
66 ///
67 /// ```rust
68 /// # use grafbase_sql_ast::{ast::*, renderer::{Renderer, self}};
69 /// # fn main() {
70 /// let mut query = Delete::from_table("users");
71 /// query.returning([Column::from("id"), Column::from("name")]);
72 ///
73 /// let (sql, _) = renderer::Postgres::build(query);
74 ///
75 /// assert_eq!(r#"DELETE FROM "users" RETURNING "id", "name""#, sql);
76 /// # }
77 /// ```
78 pub fn returning<E, T>(&mut self, returning: T)
79 where
80 T: IntoIterator<Item = E>,
81 E: Into<Expression<'a>>,
82 {
83 self.returning = Some(returning.into_iter().map(Into::into).collect());
84 }
85}