Skip to main content

ngb_sqlbuilder/
condition.rs

1use 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}