Skip to main content

ngb_sqlbuilder/
condition.rs

1use 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(&format!("::{}", sql_type));
8        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        // sql.push_str(&format_col(column));
17        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        // sql.push_str(&format_col(column));
25        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    // let mut sql = String::from(&format_col(column));
56    // sql.push_str(&format!(" {op} $"));
57    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// impl<'q> From<Clause<'q, Column>> for Clause<'q, Condition> {
126//     fn from(value: Clause<'q, Column>) -> Self {
127//         value.into()
128//     }
129// }