ngb_sqlbuilder/
condition.rs1use crate::{format_col, Clause, Column, Condition, SqlClause};
2use tokio_postgres::types::ToSql;
3
4impl<'q> Clause<'q, Condition> {
5 pub fn cast_raw(self, sql_type: &str) -> Clause<'q, Condition> {
6 let (mut sql, params) = self.unwrap();
7 sql.push_str(&format!("::{}", sql_type));
8 Clause::new(sql, params)
9 }
10
11 pub fn and_col(self, column: &str) -> Clause<'q, Column> {
12 let (mut sql, params) = self.unwrap();
13 sql.push_str(" AND ");
14 sql.push_str(&format_col(column));
15 Clause::new(sql, params)
16 }
17
18 pub fn or_col(self, column: &str) -> Clause<'q, Column> {
19 let (mut sql, params) = self.unwrap();
20 sql.push_str(" OR ");
21 sql.push_str(&format_col(column));
22 Clause::new(sql, params)
23 }
24
25 pub fn and_cond(self, cond: Clause<'q, Condition>) -> Clause<'q, Condition> {
26 let (mut sql, mut params) = self.unwrap();
27 let (cond_sql, cond_params) = cond.unwrap();
28 sql.push_str(" AND (");
29 sql.push_str(&cond_sql);
30 params.extend_from_slice(&cond_params);
31 sql.push(')');
32 Clause::new(sql, params)
33 }
34
35 pub fn or_cond(self, cond: Clause<'q, Condition>) -> Clause<'q, Condition> {
36 let (mut sql, mut params) = self.unwrap();
37 let (cond_sql, cond_params) = cond.unwrap();
38 sql.push_str(" OR (");
39 sql.push_str(&cond_sql);
40 params.extend_from_slice(&cond_params);
41 sql.push(')');
42 Clause::new(sql, params)
43 }
44}
45pub fn col_op<'q, T: ToSql + Sync + 'q>(
46 column: &str,
47 op: &str,
48 value: &'q T,
49) -> Clause<'q, Condition> {
50 let mut sql = String::from(&format_col(column));
51 sql.push_str(&format!(" {op} $"));
52 Clause::new(sql, vec![value])
53}
54pub fn op<'q, T: ToSql + Sync + 'q>(op: &str, value: &'q T) -> Clause<'q, Condition> {
55 Clause::<Condition>::new(format!(" {op} $"), vec![value])
56}
57pub fn eq<'q, T: ToSql + Sync + 'q>(value: &'q T) -> Clause<'q, Condition> {
58 op("=", value)
59}
60
61pub fn lt<'q, T: ToSql + Sync + 'q>(value: &'q T) -> Clause<'q, Condition> {
62 op("<", value)
63}
64
65pub fn gt<'q, T: ToSql + Sync + 'q>(value: &'q T) -> Clause<'q, Condition> {
66 op(">", value)
67}
68
69pub fn lte<'q, T: ToSql + Sync + 'q>(value: &'q T) -> Clause<'q, Condition> {
70 op("<=", value)
71}
72
73pub fn gte<'q, T: ToSql + Sync + 'q>(value: &'q T) -> Clause<'q, Condition> {
74 op(">=", value)
75}
76pub fn like<'q, T: ToSql + Sync + 'q>(value: &'q T) -> Clause<'q, Condition> {
77 op("like", value)
78}
79pub fn ilike<'q, T: ToSql + Sync + 'q>(value: &'q T) -> Clause<'q, Condition> {
80 op("ilike", value)
81}
82
83pub fn between<'q, T: ToSql + Sync + 'q>(low: &'q T, high: &'q T) -> Clause<'q, Condition> {
84 Clause::new(" between $ and $".to_string(), vec![low, high])
85}
86
87pub fn ands<'q>(clauses: &[Clause<'q, Condition>]) -> Clause<'q, Condition> {
88 let mut sql = String::from("(");
89 let mut params = vec![];
90 let mut not_first = false;
91 for clause in clauses {
92 if not_first {
93 sql.push_str(" AND ");
94 } else {
95 not_first = true;
96 }
97 sql.push_str(&clause.sql);
98 params.extend_from_slice(&clause.params);
99 }
100 sql.push(')');
101 Clause::new(sql, params)
102}
103pub fn ors<'q>(clauses: &[Clause<'q, Condition>]) -> Clause<'q, Condition> {
104 let mut sql = String::from("(");
105 let mut params = vec![];
106 let mut not_first = false;
107 for clause in clauses {
108 if not_first {
109 sql.push_str(" OR ");
110 } else {
111 not_first = true;
112 }
113 sql.push_str(&clause.sql);
114 params.extend_from_slice(&clause.params);
115 }
116 sql.push(')');
117 Clause::new(sql, params)
118}