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}