gluesql_core/query_builder/
delete.rs1use {
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}