sqlx_utils/filter/
operators.rs1use crate::{sql_delimiter, sql_operator};
2
3use crate::traits::SqlFilter;
4use sqlx::QueryBuilder;
5
6pub 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);