sqlink/postgres/
delete_builder.rs1use 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 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}