1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
use crate::clause;
use crate::expr::Expr;
use crate::ops::and;
/// `DELETE` statement builder.
#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct Delete<'a> {
pub(crate) with: Option<clause::With<'a>>,
pub(crate) table: clause::Delete<'a>,
pub(crate) filter: Option<clause::Where<'a>>,
pub(crate) returns: Option<clause::Returning<'a>>,
}
stmt_common!(Delete);
crate::macros::gen_display!(Delete<'_>);
impl<'a> Delete<'a> {
/// Set condition to `WHERE` clause.
///
/// Successive calls combine new condition with previous condition with
/// [`and`](crate::ops::and).
///
/// # Examples
///
/// ```
/// use qians_xql::delete;
/// use qians_xql::and;
/// use qians_xql::ge;
///
/// let query1 = delete("book")
/// .filter(and(ge("id", 1), ge("year", 1970)));
///
/// let query2 = delete("book")
/// .filter(ge("id", 1))
/// .filter(ge("year", 1970));
///
/// assert_eq!(query1, query2);
/// ```
pub fn filter<E>(mut self, expr: E) -> Delete<'a>
where
E: Into<Expr<'a>>,
{
self.filter = match self.filter.take() {
Some(inner) => Some(and(inner.0, expr.into()).into()),
None => Some(expr.into().into()),
};
self
}
/// Set/Add field(s) to `RETURNING` clause.
///
/// Successive calls combine adds more field into the clause.
///
/// # Examples
///
/// ```
/// use qians_xql::delete;
///
/// let query1 = delete("book")
/// .returning(["id", "name"]);
///
/// let query2 = delete("book")
/// .returning(["id"])
/// .returning(["name"]);
///
/// assert_eq!(query1, query2);
/// ```
pub fn returning<T>(mut self, returns: T) -> Delete<'a>
where
T: Into<clause::Returning<'a>>,
{
self.returns = match self.returns.take() {
Some(mut inner) => {
inner.0.extend(returns.into().0);
Some(inner)
}
None => Some(returns.into()),
};
self
}
}
#[test]
#[cfg(test)]
fn test() {
use crate::ops;
let query = crate::delete("user")
.filter(and(
ops::not(("user", "active")),
ops::isnull(("user", "name")),
))
.returning(["id", "name"]);
assert_eq!(
query.to_string(),
"DELETE FROM user WHERE NOT user.active AND user.name ISNULL RETURNING id, name"
);
}