sqlink/postgres/
delete_builder.rs

1use crate::error::Error;
2use crate::postgres::query_table::{QueryTables, QueryTable};
3use crate::postgres::query_field::{QueryWithParams, ParameterValueAsRef};
4use crate::postgres::query_token::{FormatQueryTup};
5use crate::postgres::query_where::{QueryWheres, WhereOperator};
6
7#[derive(Default, Debug)]
8pub struct SqlDelete<'a> {
9    _tables: QueryTables,
10    _wheres: QueryWheres,
11    _parameters: Vec<ParameterValueAsRef<'a>>,
12}
13
14impl<'a> SqlDelete<'a> {
15    pub fn new() -> SqlDelete<'static> {
16        SqlDelete::default()
17    }
18    pub fn build(&self) -> Result<QueryWithParams, Error> {
19        if self._tables.len() != 1 {
20            return Err(Error::Syntax("currently only support 1 table for DELETE".to_owned()))
21        }
22        let mut param_iter = 1;
23        let built_for_table = self._tables.build(&mut param_iter)?;
24        let mut vec: Vec<String> = Vec::new();
25        let mut p: Vec<ParameterValueAsRef> = Vec::new();
26        for ploc in built_for_table.parameters_loc {
27            p.push(self._parameters[ploc]);
28        }
29        vec.push(format!("DELETE FROM {}", built_for_table.query));
30        if self._wheres.len() > 0 {
31            let built_for_where = self._wheres.build(&mut param_iter)?;
32            vec.push(format!("WHERE {}", built_for_where.query));
33            for ploc in built_for_where.parameters_loc {
34                p.push(self._parameters[ploc]);
35            }
36        }
37
38        Ok(QueryWithParams {
39            query: vec.join(" "),
40            parameters: p,
41        })
42    }
43    pub fn table<S: Into<QueryTable>>(&mut self, table: S) -> &mut Self {
44        self._tables.push(table.into());
45        self
46    }
47    pub fn and_where(&mut self, ftup: FormatQueryTup<'a>) -> &mut Self {
48        if self._wheres.len() > 0 {
49            self._wheres.push(WhereOperator::And);
50        }
51        let len = self._parameters.len();
52        self._parameters.extend(ftup.1);
53        let qtokens = (ftup.0).to_query_tokens(len);
54        self._wheres.extend(qtokens.into());
55        self
56    }
57    pub fn or_where(&mut self, ftup: FormatQueryTup<'a>) -> &mut Self {
58        if self._wheres.len() > 0 {
59            self._wheres.push(WhereOperator::Or);
60        }
61        let len = self._parameters.len();
62        self._parameters.extend(ftup.1);
63        let qtokens = (ftup.0).to_query_tokens(len);
64        self._wheres.extend(qtokens.into());
65        self
66    }
67    pub fn and_where_open(&mut self) -> &mut Self {
68        if self._wheres.len() > 0 {
69            self._wheres.push(WhereOperator::And);
70        }
71        self._wheres.push(WhereOperator::Open);
72        self
73    }
74    pub fn or_where_open(&mut self) -> &mut Self {
75        if self._wheres.len() > 0 {
76            self._wheres.push(WhereOperator::Or);
77        }
78        self._wheres.push(WhereOperator::Open);
79        self
80    }
81    pub fn where_close(&mut self) -> &mut Self {
82        self._wheres.push(WhereOperator::Close);
83        // lets dont panic, if error database will panic
84        self
85    }
86    pub fn inner_join<S: Into<QueryTable>>(&mut self, query_table: S, ftup: FormatQueryTup<'a>) -> &mut Self {
87        let len = self._parameters.len();
88        self._parameters.extend(ftup.1);
89        let qtokens = (ftup.0).to_query_tokens(len);
90        self._tables.inner_join(query_table.into());
91        self._tables.on(qtokens.into());
92        self
93    }
94    pub fn left_join<S: Into<QueryTable>>(&mut self, query_table: S, ftup: FormatQueryTup<'a>) -> &mut Self {
95        let len = self._parameters.len();
96        self._parameters.extend(ftup.1);
97        let qtokens = (ftup.0).to_query_tokens(len);
98        self._tables.left_join(query_table.into());
99        self._tables.on(qtokens.into());
100        self
101    }
102    pub fn right_join<S: Into<QueryTable>>(&mut self, query_table: S, ftup: FormatQueryTup<'a>) -> &mut Self {
103        let len = self._parameters.len();
104        self._parameters.extend(ftup.1);
105        let qtokens = (ftup.0).to_query_tokens(len);
106        self._tables.right_join(query_table.into());
107        self._tables.on(qtokens.into());
108        self
109    }
110    pub fn full_join<S: Into<QueryTable>>(&mut self, query_table: S, ftup: FormatQueryTup<'a>) -> &mut Self {
111        let len = self._parameters.len();
112        self._parameters.extend(ftup.1);
113        let qtokens = (ftup.0).to_query_tokens(len);
114        self._tables.full_join(query_table.into());
115        self._tables.on(qtokens.into());
116        self
117    }
118}
119
120#[cfg(test)]
121mod tests {
122    use crate::postgres::query_token::{format_query};
123    use super::*;
124    #[test]
125    fn test_update_builder_1() {
126        let mut sql_delete = SqlDelete::new();
127        let qbuild = sql_delete
128            .table("user")
129            .and_where(format_query("id = {}".to_owned(), vec![&(1)]))
130            .build().unwrap();
131        assert_eq!(qbuild.query, "DELETE FROM \"user\" WHERE id = $1");
132    }
133}