Skip to main content

ngb_sqlbuilder/
condition.rs

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