Skip to main content

gluesql_core/query_builder/
delete.rs

1use {
2    super::{Build, ExprNode},
3    crate::{plan::StatementPlan, result::Result},
4};
5
6#[derive(Clone, Debug)]
7pub struct DeleteNode<'a> {
8    table_name: String,
9    filter_expr: Option<ExprNode<'a>>,
10}
11
12impl<'a> DeleteNode<'a> {
13    pub fn new(table_name: String) -> Self {
14        Self {
15            table_name,
16            filter_expr: None,
17        }
18    }
19
20    #[must_use]
21    pub fn filter<T: Into<ExprNode<'a>>>(mut self, expr: T) -> Self {
22        self.filter_expr = Some(expr.into());
23
24        self
25    }
26}
27
28impl Build for DeleteNode<'_> {
29    fn build(self) -> Result<StatementPlan> {
30        let table_name = self.table_name;
31        let selection = self
32            .filter_expr
33            .map(ExprNode::build_expr_plan)
34            .transpose()?;
35
36        Ok(StatementPlan::Delete {
37            table_name,
38            selection,
39        })
40    }
41}
42
43#[cfg(test)]
44mod tests {
45    use crate::{
46        ast::Expr,
47        query_builder::{Build, col, table, test},
48    };
49
50    #[test]
51    fn delete() {
52        let actual = table("Foo").delete().build();
53        let expected = "DELETE FROM Foo";
54        test(&actual, expected);
55
56        let actual = table("Bar").delete().filter("id < (1 + 3 + rate)").build();
57        let expected = "DELETE FROM Bar WHERE id < (1 + 3 + rate)";
58        test(&actual, expected);
59
60        let actual = table("Person")
61            .delete()
62            .filter(Expr::IsNull(Box::new(Expr::Identifier("name".to_owned()))))
63            .build();
64        let expected = "DELETE FROM Person WHERE name IS NULL";
65        test(&actual, expected);
66
67        let actual = table("Person")
68            .delete()
69            .filter(col("name").is_null())
70            .build();
71        let expected = "DELETE FROM Person WHERE name IS NULL";
72        test(&actual, expected);
73    }
74}