chain_builder/query_builder/
where_clauses.rs

1use crate::{operator::Operator, QueryBuilder, Statement};
2
3pub trait WhereClauses {
4    fn where_clause(
5        &mut self,
6        column: &str,
7        operator: Operator,
8        value: serde_json::Value,
9    ) -> &mut Self;
10    fn where_eq(&mut self, column: &str, value: serde_json::Value) -> &mut Self;
11    fn where_not_eq(&mut self, column: &str, value: serde_json::Value) -> &mut Self;
12    fn where_in(&mut self, column: &str, value: Vec<serde_json::Value>) -> &mut Self;
13    fn where_not_in(&mut self, column: &str, value: Vec<serde_json::Value>) -> &mut Self;
14    fn where_null(&mut self, column: &str) -> &mut Self;
15    fn where_not_null(&mut self, column: &str) -> &mut Self;
16    fn where_exists(&mut self, column: &str) -> &mut Self;
17    fn where_not_exists(&mut self, column: &str) -> &mut Self;
18    fn where_between(&mut self, column: &str, value: [serde_json::Value; 2]) -> &mut Self;
19    fn where_not_between(&mut self, column: &str, value: [serde_json::Value; 2]) -> &mut Self;
20    fn where_like(&mut self, column: &str, value: serde_json::Value) -> &mut Self;
21    fn where_not_like(&mut self, column: &str, value: serde_json::Value) -> &mut Self;
22    fn where_subquery(&mut self, value: impl FnOnce(&mut QueryBuilder));
23    fn or(&mut self) -> &mut QueryBuilder;
24    fn where_raw(&mut self, sql: &str, val: Option<Vec<serde_json::Value>>) -> &mut Self;
25    fn where_gt(&mut self, column: &str, value: serde_json::Value) -> &mut Self;
26    fn where_gte(&mut self, column: &str, value: serde_json::Value) -> &mut Self;
27    fn where_lt(&mut self, column: &str, value: serde_json::Value) -> &mut Self;
28    fn where_lte(&mut self, column: &str, value: serde_json::Value) -> &mut Self;
29    fn where_gtlt(&mut self, column: &str, value: serde_json::Value) -> &mut Self;
30}
31
32impl WhereClauses for QueryBuilder {
33    fn where_clause(
34        &mut self,
35        column: &str,
36        operator: Operator,
37        value: serde_json::Value,
38    ) -> &mut Self {
39        self.statement
40            .push(Statement::Value(column.to_string(), operator, value));
41        self
42    }
43
44    fn where_subquery(&mut self, value: impl FnOnce(&mut QueryBuilder)) {
45        let mut query = self.clone();
46        query.statement = vec![];
47        query.raw = vec![];
48        value(&mut query);
49        self.statement.push(Statement::SubChain(Box::new(query)));
50    }
51
52    fn or(&mut self) -> &mut QueryBuilder {
53        let mut chain = self.clone();
54        chain.statement = vec![];
55        chain.raw = vec![];
56        self.statement.push(Statement::OrChain(Box::new(chain)));
57        // SAFETY: unwrap() is safe because we just pushed an OrChain
58        self.statement.last_mut().unwrap().to_query_builder()
59    }
60
61    fn where_raw(&mut self, sql: &str, val: Option<Vec<serde_json::Value>>) -> &mut Self {
62        self.statement.push(Statement::Raw((sql.to_string(), val)));
63        self
64    }
65
66    fn where_eq(&mut self, column: &str, value: serde_json::Value) -> &mut Self {
67        self.where_clause(column, Operator::Equal, value)
68    }
69
70    fn where_not_eq(&mut self, column: &str, value: serde_json::Value) -> &mut Self {
71        self.where_clause(column, Operator::NotEqual, value)
72    }
73
74    fn where_in(&mut self, column: &str, value: Vec<serde_json::Value>) -> &mut Self {
75        self.where_clause(column, Operator::In, serde_json::Value::Array(value))
76    }
77
78    fn where_not_in(&mut self, column: &str, value: Vec<serde_json::Value>) -> &mut Self {
79        self.where_clause(column, Operator::NotIn, serde_json::Value::Array(value))
80    }
81
82    fn where_null(&mut self, column: &str) -> &mut Self {
83        self.where_clause(column, Operator::IsNull, serde_json::Value::Null)
84    }
85
86    fn where_not_null(&mut self, column: &str) -> &mut Self {
87        self.where_clause(column, Operator::IsNotNull, serde_json::Value::Null)
88    }
89
90    fn where_exists(&mut self, column: &str) -> &mut Self {
91        self.where_clause(column, Operator::Exists, serde_json::Value::Null)
92    }
93
94    fn where_not_exists(&mut self, column: &str) -> &mut Self {
95        self.where_clause(column, Operator::NotExists, serde_json::Value::Null)
96    }
97
98    fn where_between(&mut self, column: &str, value: [serde_json::Value; 2]) -> &mut Self {
99        self.where_clause(
100            column,
101            Operator::Between,
102            serde_json::Value::Array(vec![value[0].clone(), value[1].clone()]),
103        )
104    }
105
106    fn where_not_between(&mut self, column: &str, value: [serde_json::Value; 2]) -> &mut Self {
107        self.where_clause(
108            column,
109            Operator::NotBetween,
110            serde_json::Value::Array(vec![value[0].clone(), value[1].clone()]),
111        )
112    }
113
114    fn where_like(&mut self, column: &str, value: serde_json::Value) -> &mut Self {
115        self.where_clause(column, Operator::Like, value)
116    }
117
118    fn where_not_like(&mut self, column: &str, value: serde_json::Value) -> &mut Self {
119        self.where_clause(column, Operator::NotLike, value)
120    }
121
122    fn where_gt(&mut self, column: &str, value: serde_json::Value) -> &mut Self {
123        self.where_clause(column, Operator::GreaterThan, value)
124    }
125
126    fn where_gte(&mut self, column: &str, value: serde_json::Value) -> &mut Self {
127        self.where_clause(column, Operator::GreaterThanOrEqual, value)
128    }
129
130    fn where_lt(&mut self, column: &str, value: serde_json::Value) -> &mut Self {
131        self.where_clause(column, Operator::LessThan, value)
132    }
133
134    fn where_lte(&mut self, column: &str, value: serde_json::Value) -> &mut Self {
135        self.where_clause(column, Operator::LessThanOrEqual, value)
136    }
137
138    fn where_gtlt(&mut self, column: &str, value: serde_json::Value) -> &mut Self {
139        self.where_clause(column, Operator::GreaterORLessThan, value)
140    }
141}