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