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