dsq_core/ops/
comparison_ops.rs

1use crate::error::Result;
2use crate::Value;
3
4use super::Operation;
5
6pub struct EqOperation {
7    pub left_ops: Vec<Box<dyn Operation + Send + Sync>>,
8    pub right_ops: Vec<Box<dyn Operation + Send + Sync>>,
9}
10
11impl EqOperation {
12    #[must_use]
13    pub fn new(
14        left_ops: Vec<Box<dyn Operation + Send + Sync>>,
15        right_ops: Vec<Box<dyn Operation + Send + Sync>>,
16    ) -> Self {
17        Self {
18            left_ops,
19            right_ops,
20        }
21    }
22}
23
24impl Operation for EqOperation {
25    fn apply(&self, value: &Value) -> Result<Value> {
26        let mut left_val = value.clone();
27        for op in &self.left_ops {
28            left_val = op.apply(&left_val)?;
29        }
30
31        let mut right_val = value.clone();
32        for op in &self.right_ops {
33            right_val = op.apply(&right_val)?;
34        }
35
36        Ok(Value::Bool(left_val == right_val))
37    }
38
39    fn description(&self) -> String {
40        "equals".to_string()
41    }
42}
43
44pub struct NeOperation {
45    pub left_ops: Vec<Box<dyn Operation + Send + Sync>>,
46    pub right_ops: Vec<Box<dyn Operation + Send + Sync>>,
47}
48
49impl NeOperation {
50    #[must_use]
51    pub fn new(
52        left_ops: Vec<Box<dyn Operation + Send + Sync>>,
53        right_ops: Vec<Box<dyn Operation + Send + Sync>>,
54    ) -> Self {
55        Self {
56            left_ops,
57            right_ops,
58        }
59    }
60}
61
62impl Operation for NeOperation {
63    fn apply(&self, value: &Value) -> Result<Value> {
64        let mut left_val = value.clone();
65        for op in &self.left_ops {
66            left_val = op.apply(&left_val)?;
67        }
68
69        let mut right_val = value.clone();
70        for op in &self.right_ops {
71            right_val = op.apply(&right_val)?;
72        }
73
74        Ok(Value::Bool(left_val != right_val))
75    }
76
77    fn description(&self) -> String {
78        "not equals".to_string()
79    }
80}
81
82pub struct LtOperation {
83    pub left_ops: Vec<Box<dyn Operation + Send + Sync>>,
84    pub right_ops: Vec<Box<dyn Operation + Send + Sync>>,
85}
86
87impl LtOperation {
88    #[must_use]
89    pub fn new(
90        left_ops: Vec<Box<dyn Operation + Send + Sync>>,
91        right_ops: Vec<Box<dyn Operation + Send + Sync>>,
92    ) -> Self {
93        Self {
94            left_ops,
95            right_ops,
96        }
97    }
98}
99
100impl Operation for LtOperation {
101    fn apply(&self, value: &Value) -> Result<Value> {
102        let mut left_val = value.clone();
103        for op in &self.left_ops {
104            left_val = op.apply(&left_val)?;
105        }
106
107        let mut right_val = value.clone();
108        for op in &self.right_ops {
109            right_val = op.apply(&right_val)?;
110        }
111
112        let ordering = dsq_shared::ops::compare_values(&left_val, &right_val)?;
113        Ok(Value::Bool(ordering == std::cmp::Ordering::Less))
114    }
115
116    fn description(&self) -> String {
117        "less than".to_string()
118    }
119}
120
121pub struct LeOperation {
122    pub left_ops: Vec<Box<dyn Operation + Send + Sync>>,
123    pub right_ops: Vec<Box<dyn Operation + Send + Sync>>,
124}
125
126impl LeOperation {
127    #[must_use]
128    pub fn new(
129        left_ops: Vec<Box<dyn Operation + Send + Sync>>,
130        right_ops: Vec<Box<dyn Operation + Send + Sync>>,
131    ) -> Self {
132        Self {
133            left_ops,
134            right_ops,
135        }
136    }
137}
138
139impl Operation for LeOperation {
140    fn apply(&self, value: &Value) -> Result<Value> {
141        let mut left_val = value.clone();
142        for op in &self.left_ops {
143            left_val = op.apply(&left_val)?;
144        }
145
146        let mut right_val = value.clone();
147        for op in &self.right_ops {
148            right_val = op.apply(&right_val)?;
149        }
150
151        let ordering = dsq_shared::ops::compare_values(&left_val, &right_val)?;
152        Ok(Value::Bool(ordering != std::cmp::Ordering::Greater))
153    }
154
155    fn description(&self) -> String {
156        "less than or equal".to_string()
157    }
158}
159
160pub struct GtOperation {
161    pub left_ops: Vec<Box<dyn Operation + Send + Sync>>,
162    pub right_ops: Vec<Box<dyn Operation + Send + Sync>>,
163}
164
165impl GtOperation {
166    #[must_use]
167    pub fn new(
168        left_ops: Vec<Box<dyn Operation + Send + Sync>>,
169        right_ops: Vec<Box<dyn Operation + Send + Sync>>,
170    ) -> Self {
171        Self {
172            left_ops,
173            right_ops,
174        }
175    }
176}
177
178impl Operation for GtOperation {
179    fn apply(&self, value: &Value) -> Result<Value> {
180        let mut left_val = value.clone();
181        for op in &self.left_ops {
182            left_val = op.apply(&left_val)?;
183        }
184
185        let mut right_val = value.clone();
186        for op in &self.right_ops {
187            right_val = op.apply(&right_val)?;
188        }
189
190        let ordering = dsq_shared::ops::compare_values(&left_val, &right_val)?;
191        Ok(Value::Bool(ordering == std::cmp::Ordering::Greater))
192    }
193
194    fn description(&self) -> String {
195        "greater than".to_string()
196    }
197}
198
199pub struct GeOperation {
200    pub left_ops: Vec<Box<dyn Operation + Send + Sync>>,
201    pub right_ops: Vec<Box<dyn Operation + Send + Sync>>,
202}
203
204impl GeOperation {
205    #[must_use]
206    pub fn new(
207        left_ops: Vec<Box<dyn Operation + Send + Sync>>,
208        right_ops: Vec<Box<dyn Operation + Send + Sync>>,
209    ) -> Self {
210        Self {
211            left_ops,
212            right_ops,
213        }
214    }
215}
216
217impl Operation for GeOperation {
218    fn apply(&self, value: &Value) -> Result<Value> {
219        let mut left_val = value.clone();
220        for op in &self.left_ops {
221            left_val = op.apply(&left_val)?;
222        }
223
224        let mut right_val = value.clone();
225        for op in &self.right_ops {
226            right_val = op.apply(&right_val)?;
227        }
228
229        let ordering = dsq_shared::ops::compare_values(&left_val, &right_val)?;
230        Ok(Value::Bool(ordering != std::cmp::Ordering::Less))
231    }
232
233    fn description(&self) -> String {
234        "greater than or equal".to_string()
235    }
236}