sqlx_utils/filter/
operators.rs

1use crate::{sql_delimiter, sql_operator};
2
3use crate::traits::SqlFilter;
4use sqlx::QueryBuilder;
5
6/// UNSAFE AF!!!!
7pub struct Raw(pub &'static str);
8
9impl<'args> SqlFilter<'args> for Raw {
10    #[inline]
11    #[cfg(feature = "any")]
12    fn apply_filter(self, builder: &mut QueryBuilder<'args, sqlx::Any>) {
13        if self.should_apply_filter() {
14            builder.push(self.0);
15        }
16    }
17    #[inline]
18    #[cfg(all(feature = "postgres", not(any(feature = "sqlite", feature = "mysql", feature = "any"))))]
19    fn apply_filter(self, builder: &mut QueryBuilder<'args, sqlx::Postgres>) {
20        if self.should_apply_filter() {
21            builder.push(self.0);
22        }
23    }
24    #[inline]
25    #[cfg(all(feature = "mysql", not(any(feature = "sqlite", feature = "any", feature = "postgres"))))]
26    fn apply_filter(self, builder: &mut QueryBuilder<'args, sqlx::MySql>) {
27        if self.should_apply_filter() {
28            builder.push(self.0);
29        }
30    }
31    #[inline]
32    #[cfg(all(feature = "sqlite", not(any(feature = "any", feature = "mysql", feature = "postgres"))))]
33    fn apply_filter(self, builder: &mut QueryBuilder<'args, sqlx::Sqlite>) {
34        if self.should_apply_filter() {
35            builder.push(self.0);
36        }
37    }
38
39    #[inline]
40    fn should_apply_filter(&self) -> bool {
41        !self.0.is_empty()
42    }
43}
44
45
46sql_delimiter! {
47    pub struct And<L, R> {
48        pub left: L,
49        pub right: R
50    }
51
52    apply_filter(s, builder) {
53        match (
54            s.left.should_apply_filter(),
55            s.right.should_apply_filter(),
56        ) {
57            (true, true) => {
58                s.left.apply_filter(builder);
59                builder.push(" AND ");
60                s.right.apply_filter(builder);
61            }
62            (true, false) => {
63                s.left.apply_filter(builder);
64            }
65            (false, true) => {
66                s.right.apply_filter(builder);
67            }
68            (false, false) => {}
69        }
70    }
71
72    should_apply_filter(s) {
73        s.left.should_apply_filter() || s.right.should_apply_filter()
74    }
75}
76
77sql_delimiter! {
78    pub struct Or<L, R> {
79        pub left: L,
80        pub right: R
81    }
82
83    apply_filter(s, builder) {
84        match (
85            s.left.should_apply_filter(),
86            s.right.should_apply_filter(),
87        ) {
88            (true, true) => {
89                s.left.apply_filter(builder);
90                builder.push(" OR ");
91                s.right.apply_filter(builder);
92            }
93            (true, false) => {
94                s.left.apply_filter(builder);
95            }
96            (false, true) => {
97                s.right.apply_filter(builder);
98            }
99            (false, false) => {}
100        }
101    }
102
103    should_apply_filter(s) {
104        s.left.should_apply_filter() || s.right.should_apply_filter()
105    }
106}
107
108sql_delimiter! {
109    pub struct Not<T> {
110        pub inner: T,
111    }
112
113    apply_filter(s, builder) {
114        if s.should_apply_filter() {
115            builder.push("NOT ");
116            s.inner.apply_filter(builder);
117        }
118    }
119
120    should_apply_filter(s) {
121        s.inner.should_apply_filter()
122    }
123}
124
125sql_operator!(pub Equals, "=");
126sql_operator!(pub Like<String>, "LIKE");
127sql_operator!(pub InValues[], "IN");
128sql_operator!(pub NotEquals, "!=");
129sql_operator!(pub GreaterThan, ">");
130sql_operator!(pub LessThan, "<");
131sql_operator!(pub GreaterThanOrEqual, ">=");
132sql_operator!(pub LessThanOrEqual, "<=");
133sql_operator!(pub ILike<String>, "ILIKE");
134sql_operator!(pub NotInValues[], "NOT IN");
135sql_operator!(pub NoOpFilter);