dsq_core/ops/
comparison_ops.rs1use 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}