• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

getdozer / dozer / 5630015928

pending completion
5630015928

push

github

web-flow
Bump version (#1779)

42841 of 55898 relevant lines covered (76.64%)

32850.4 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

22.89
/dozer-sql/src/pipeline/expression/comparison.rs
1
use crate::pipeline::errors::PipelineError;
2
use dozer_types::chrono::{DateTime, NaiveDate};
3
use dozer_types::rust_decimal::Decimal;
4
use dozer_types::types::{DozerDuration, DozerPoint, Field, Record, Schema, TimeUnit};
5
use num_traits::cast::*;
6
use std::str::FromStr;
7
use std::time::Duration;
8

9
pub const DATE_FORMAT: &str = "%Y-%m-%d";
10

11
macro_rules! define_comparison {
12
    ($id:ident, $op:expr, $function:expr) => {
13
        pub fn $id(
70,534✔
14
            schema: &Schema,
70,534✔
15
            left: &Expression,
70,534✔
16
            right: &Expression,
70,534✔
17
            record: &Record,
70,534✔
18
        ) -> Result<Field, PipelineError> {
70,534✔
19
            let left_p = left.evaluate(&record, schema)?;
70,534✔
20
            let right_p = right.evaluate(&record, schema)?;
70,534✔
21

22
            match left_p {
70,534✔
23
                Field::Null => Ok(Field::Null),
13,060✔
24
                Field::Boolean(left_v) => match right_p {
×
25
                    // left: Bool, right: Bool
26
                    Field::Boolean(right_v) => Ok(Field::Boolean($function(left_v, right_v))),
×
27
                    // left: Bool, right: String or Text
28
                    Field::String(right_v) | Field::Text(right_v) => {
×
29
                        let right_v_b = bool::from_str(right_v.as_str()).map_err(|_| {
×
30
                            PipelineError::UnableToCast(format!("{}", right_v), "Bool".to_string())
31
                        })?;
×
32
                        Ok(Field::Boolean($function(left_v, right_v_b)))
×
33
                    }
34
                    // left: Bool, right: UInt
35
                    Field::UInt(right_v) => {
×
36
                        let right_v_b =
×
37
                            bool::from_str(right_v.to_string().as_str()).map_err(|_| {
×
38
                                PipelineError::UnableToCast(
39
                                    format!("{}", right_v),
40
                                    "Bool".to_string(),
41
                                )
42
                            })?;
×
43
                        Ok(Field::Boolean($function(left_v, right_v_b)))
×
44
                    }
45
                    // left: Bool, right: U128
46
                    Field::U128(right_v) => {
×
47
                        let right_v_b =
×
48
                            bool::from_str(right_v.to_string().as_str()).map_err(|_| {
×
49
                                PipelineError::UnableToCast(
50
                                    format!("{}", right_v),
51
                                    "Bool".to_string(),
52
                                )
53
                            })?;
×
54
                        Ok(Field::Boolean($function(left_v, right_v_b)))
×
55
                    }
56
                    // left: Bool, right: Int
57
                    Field::Int(right_v) => {
×
58
                        let right_v_b =
×
59
                            bool::from_str(right_v.to_string().as_str()).map_err(|_| {
×
60
                                PipelineError::UnableToCast(
61
                                    format!("{}", right_v),
62
                                    "Bool".to_string(),
63
                                )
64
                            })?;
×
65
                        Ok(Field::Boolean($function(left_v, right_v_b)))
×
66
                    }
67
                    // left: Bool, right: I128
68
                    Field::I128(right_v) => {
×
69
                        let right_v_b =
×
70
                            bool::from_str(right_v.to_string().as_str()).map_err(|_| {
×
71
                                PipelineError::UnableToCast(
72
                                    format!("{}", right_v),
73
                                    "Bool".to_string(),
74
                                )
75
                            })?;
×
76
                        Ok(Field::Boolean($function(left_v, right_v_b)))
×
77
                    }
78
                    // left: Bool, right: Float
79
                    Field::Float(right_v) => {
×
80
                        let right_v_b =
×
81
                            bool::from_str(right_v.to_string().as_str()).map_err(|_| {
×
82
                                PipelineError::UnableToCast(
83
                                    format!("{}", right_v),
84
                                    "Bool".to_string(),
85
                                )
86
                            })?;
×
87
                        Ok(Field::Boolean($function(left_v, right_v_b)))
×
88
                    }
89
                    // left: Bool, right: Decimal
90
                    Field::Decimal(right_v) => {
×
91
                        let right_v_b =
×
92
                            bool::from_str(right_v.to_string().as_str()).map_err(|_| {
×
93
                                PipelineError::UnableToCast(
94
                                    format!("{}", right_v),
95
                                    "Bool".to_string(),
96
                                )
97
                            })?;
×
98
                        Ok(Field::Boolean($function(left_v, right_v_b)))
×
99
                    }
100
                    Field::Binary(_)
101
                    | Field::Timestamp(_)
102
                    | Field::Date(_)
103
                    | Field::Json(_)
104
                    | Field::Point(_)
105
                    | Field::Duration(_)
106
                    | Field::Null => Ok(Field::Null),
×
107
                },
108
                Field::Int(left_v) => match right_p {
16,180✔
109
                    // left: Int, right: Int
110
                    Field::Int(right_v) => Ok(Field::Boolean($function(left_v, right_v))),
4,329✔
111
                    // left: Int, right: I128
112
                    Field::I128(right_v) => Ok(Field::Boolean($function(left_v as i128, right_v))),
×
113
                    // left: Int, right: UInt
114
                    Field::UInt(right_v) => Ok(Field::Boolean($function(left_v, right_v as i64))),
2,962✔
115
                    // left: Int, right: U128
116
                    Field::U128(right_v) => Ok(Field::Boolean($function(left_v, right_v as i64))),
×
117
                    // left: Int, right: Float
118
                    Field::Float(right_v) => Ok(Field::Boolean($function(left_v as f64, *right_v))),
2,962✔
119
                    // left: Int, right: Decimal
120
                    Field::Decimal(right_v) => {
2,962✔
121
                        let left_v_d =
2,962✔
122
                            Decimal::from_i64(left_v).ok_or(PipelineError::UnableToCast(
2,962✔
123
                                format!("{}", left_v),
2,962✔
124
                                "Decimal".to_string(),
2,962✔
125
                            ))?;
2,962✔
126
                        Ok(Field::Boolean($function(left_v_d, right_v)))
2,962✔
127
                    }
128
                    // left: Int, right: String or Text
129
                    Field::String(right_v) | Field::Text(right_v) => {
3✔
130
                        let right_v_b = i64::from_str(right_v.as_str()).map_err(|_| {
3✔
131
                            PipelineError::UnableToCast(format!("{}", right_v), "Int".to_string())
132
                        })?;
3✔
133
                        Ok(Field::Boolean($function(left_v, right_v_b)))
3✔
134
                    }
135
                    // left: Int, right: Duration
136
                    Field::Duration(right_v) => {
×
137
                        let left_v_b = DozerDuration(
×
138
                            Duration::from_nanos(left_v as u64),
×
139
                            TimeUnit::Nanoseconds,
×
140
                        );
×
141
                        Ok(Field::Boolean($function(left_v_b, right_v)))
×
142
                    }
143
                    // left: Int, right: Null
144
                    Field::Null => Ok(Field::Null),
2,962✔
145
                    Field::Boolean(_)
146
                    | Field::Binary(_)
147
                    | Field::Timestamp(_)
148
                    | Field::Date(_)
149
                    | Field::Json(_)
150
                    | Field::Point(_) => Err(PipelineError::InvalidTypeComparison(
×
151
                        left_p,
×
152
                        right_p,
×
153
                        $op.to_string(),
×
154
                    )),
×
155
                },
156
                Field::I128(left_v) => match right_p {
×
157
                    // left: I128, right: Int
158
                    Field::Int(right_v) => Ok(Field::Boolean($function(left_v, right_v as i128))),
×
159
                    // left: I128, right: I128
160
                    Field::I128(right_v) => Ok(Field::Boolean($function(left_v, right_v))),
×
161
                    // left: I128, right: UInt
162
                    Field::UInt(right_v) => Ok(Field::Boolean($function(left_v, right_v as i128))),
×
163
                    // left: I128, right: U128
164
                    Field::U128(right_v) => Ok(Field::Boolean($function(left_v, right_v as i128))),
×
165
                    // left: I128, right: Float
166
                    Field::Float(right_v) => Ok(Field::Boolean($function(left_v as f64, *right_v))),
×
167
                    // left: I128, right: Decimal
168
                    Field::Decimal(right_v) => {
×
169
                        let left_v_d =
×
170
                            Decimal::from_i128(left_v).ok_or(PipelineError::UnableToCast(
×
171
                                format!("{}", left_v),
×
172
                                "Decimal".to_string(),
×
173
                            ))?;
×
174
                        Ok(Field::Boolean($function(left_v_d, right_v)))
×
175
                    }
176
                    // left: I128, right: String or Text
177
                    Field::String(right_v) | Field::Text(right_v) => {
×
178
                        let right_v_b = i128::from_str(right_v.as_str()).map_err(|_| {
×
179
                            PipelineError::UnableToCast(format!("{}", right_v), "I128".to_string())
180
                        })?;
×
181
                        Ok(Field::Boolean($function(left_v, right_v_b)))
×
182
                    }
183
                    // left: I128, right: Duration
184
                    Field::Duration(right_v) => {
×
185
                        let left_v_b = DozerDuration(
×
186
                            Duration::from_nanos(left_v as u64),
×
187
                            TimeUnit::Nanoseconds,
×
188
                        );
×
189
                        Ok(Field::Boolean($function(left_v_b, right_v)))
×
190
                    }
191
                    // left: I128, right: Null
192
                    Field::Null => Ok(Field::Null),
×
193
                    Field::Boolean(_)
194
                    | Field::Binary(_)
195
                    | Field::Timestamp(_)
196
                    | Field::Date(_)
197
                    | Field::Json(_)
198
                    | Field::Point(_) => Err(PipelineError::InvalidTypeComparison(
×
199
                        left_p,
×
200
                        right_p,
×
201
                        $op.to_string(),
×
202
                    )),
×
203
                },
204
                Field::UInt(left_v) => match right_p {
13,040✔
205
                    // left: UInt, right: Int
206
                    Field::Int(right_v) => Ok(Field::Boolean($function(left_v as i64, right_v))),
2,408✔
207
                    // left: UInt, right: I128
208
                    Field::I128(right_v) => Ok(Field::Boolean($function(left_v as i128, right_v))),
×
209
                    // left: UInt, right: UInt
210
                    Field::UInt(right_v) => Ok(Field::Boolean($function(left_v, right_v))),
3,408✔
211
                    // left: UInt, right: U128
212
                    Field::U128(right_v) => Ok(Field::Boolean($function(left_v as u128, right_v))),
×
213
                    // left: UInt, right: Float
214
                    Field::Float(right_v) => Ok(Field::Boolean($function(left_v as f64, *right_v))),
2,408✔
215
                    // left: UInt, right: Decimal
216
                    Field::Decimal(right_v) => {
2,408✔
217
                        let left_v_d =
2,408✔
218
                            Decimal::from_f64(left_v as f64).ok_or(PipelineError::UnableToCast(
2,408✔
219
                                format!("{}", left_v),
2,408✔
220
                                "Decimal".to_string(),
2,408✔
221
                            ))?;
2,408✔
222
                        Ok(Field::Boolean($function(left_v_d, right_v)))
2,408✔
223
                    }
224
                    // left: UInt, right: String or Text
225
                    Field::String(right_v) | Field::Text(right_v) => {
×
226
                        let right_v_b = u64::from_str(right_v.as_str()).map_err(|_| {
×
227
                            PipelineError::UnableToCast(format!("{}", right_v), "UInt".to_string())
228
                        })?;
×
229
                        Ok(Field::Boolean($function(left_v, right_v_b)))
×
230
                    }
231
                    // left: UInt, right: Duration
232
                    Field::Duration(right_v) => {
×
233
                        let left_v_b =
×
234
                            DozerDuration(Duration::from_nanos(left_v), TimeUnit::Nanoseconds);
×
235
                        Ok(Field::Boolean($function(left_v_b, right_v)))
×
236
                    }
237
                    // left: UInt, right: Null
238
                    Field::Null => Ok(Field::Null),
2,408✔
239
                    Field::Boolean(_)
240
                    | Field::Binary(_)
241
                    | Field::Timestamp(_)
242
                    | Field::Date(_)
243
                    | Field::Json(_)
244
                    | Field::Point(_) => Err(PipelineError::InvalidTypeComparison(
×
245
                        left_p,
×
246
                        right_p,
×
247
                        $op.to_string(),
×
248
                    )),
×
249
                },
250
                Field::U128(left_v) => match right_p {
×
251
                    // left: U128, right: Int
252
                    Field::Int(right_v) => {
×
253
                        Ok(Field::Boolean($function(left_v as i128, right_v as i128)))
×
254
                    }
255
                    // left: U128, right: I128
256
                    Field::I128(right_v) => Ok(Field::Boolean($function(left_v as i128, right_v))),
×
257
                    // left: U128, right: UInt
258
                    Field::UInt(right_v) => Ok(Field::Boolean($function(left_v, right_v as u128))),
×
259
                    // left: U128, right: U128
260
                    Field::U128(right_v) => Ok(Field::Boolean($function(left_v, right_v))),
×
261
                    // left: U128, right: Float
262
                    Field::Float(right_v) => Ok(Field::Boolean($function(left_v as f64, *right_v))),
×
263
                    // left: U128, right: Decimal
264
                    Field::Decimal(right_v) => {
×
265
                        let left_v_d =
×
266
                            Decimal::from_f64(left_v as f64).ok_or(PipelineError::UnableToCast(
×
267
                                format!("{}", left_v),
×
268
                                "Decimal".to_string(),
×
269
                            ))?;
×
270
                        Ok(Field::Boolean($function(left_v_d, right_v)))
×
271
                    }
272
                    // left: U128, right: String or Text
273
                    Field::String(right_v) | Field::Text(right_v) => {
×
274
                        let right_v_b = u128::from_str(right_v.as_str()).map_err(|_| {
×
275
                            PipelineError::UnableToCast(format!("{}", right_v), "U128".to_string())
276
                        })?;
×
277
                        Ok(Field::Boolean($function(left_v, right_v_b)))
×
278
                    }
279
                    // left: U128, right: Duration
280
                    Field::Duration(right_v) => {
×
281
                        let left_v_b = DozerDuration(
×
282
                            Duration::from_nanos(left_v as u64),
×
283
                            TimeUnit::Nanoseconds,
×
284
                        );
×
285
                        Ok(Field::Boolean($function(left_v_b, right_v)))
×
286
                    }
287
                    // left: U128, right: Null
288
                    Field::Null => Ok(Field::Null),
×
289
                    Field::Boolean(_)
290
                    | Field::Binary(_)
291
                    | Field::Timestamp(_)
292
                    | Field::Date(_)
293
                    | Field::Json(_)
294
                    | Field::Point(_) => Err(PipelineError::InvalidTypeComparison(
×
295
                        left_p,
×
296
                        right_p,
×
297
                        $op.to_string(),
×
298
                    )),
×
299
                },
300
                Field::Float(left_v) => match right_p {
18,420✔
301
                    // left: Float, right: Float
302
                    Field::Float(right_v) => Ok(Field::Boolean($function(left_v, right_v))),
2,484✔
303
                    // left: Float, right: UInt
304
                    Field::UInt(right_v) => Ok(Field::Boolean($function(*left_v, right_v as f64))),
1,484✔
305
                    // left: Float, right: U128
306
                    Field::U128(right_v) => Ok(Field::Boolean($function(*left_v, right_v as f64))),
×
307
                    // left: Float, right: Int
308
                    Field::Int(right_v) => Ok(Field::Boolean($function(*left_v, right_v as f64))),
11,484✔
309
                    // left: Float, right: I128
310
                    Field::I128(right_v) => Ok(Field::Boolean($function(*left_v, right_v as f64))),
×
311
                    // left: Float, right: Decimal
312
                    Field::Decimal(right_v) => {
1,484✔
313
                        let left_v_d =
1,484✔
314
                            Decimal::from_f64(*left_v).ok_or(PipelineError::UnableToCast(
1,484✔
315
                                format!("{}", left_v),
1,484✔
316
                                "Decimal".to_string(),
1,484✔
317
                            ))?;
1,484✔
318
                        Ok(Field::Boolean($function(left_v_d, right_v)))
1,484✔
319
                    }
320
                    // left: Float, right: String or Text
321
                    Field::String(right_v) | Field::Text(right_v) => {
×
322
                        let right_v_b = f64::from_str(right_v.as_str()).map_err(|_| {
×
323
                            PipelineError::UnableToCast(format!("{}", right_v), "Float".to_string())
324
                        })?;
×
325
                        Ok(Field::Boolean($function(*left_v, right_v_b)))
×
326
                    }
327
                    // left: Float, right: Null
328
                    Field::Null => Ok(Field::Null),
1,484✔
329
                    Field::Boolean(_)
330
                    | Field::Binary(_)
331
                    | Field::Timestamp(_)
332
                    | Field::Date(_)
333
                    | Field::Json(_)
334
                    | Field::Point(_)
335
                    | Field::Duration(_) => Err(PipelineError::InvalidTypeComparison(
×
336
                        left_p,
×
337
                        right_p,
×
338
                        $op.to_string(),
×
339
                    )),
×
340
                },
341
                Field::Decimal(left_v) => match right_p {
9,431✔
342
                    // left: Decimal, right: Float
343
                    Field::Float(right_v) => {
1,583✔
344
                        let right_v_d =
1,583✔
345
                            Decimal::from_f64(*right_v).ok_or(PipelineError::UnableToCast(
1,583✔
346
                                format!("{}", right_v),
1,583✔
347
                                "Decimal".to_string(),
1,583✔
348
                            ))?;
1,583✔
349
                        Ok(Field::Boolean($function(left_v, right_v_d)))
1,583✔
350
                    }
351
                    // left: Decimal, right: Int
352
                    Field::Int(right_v) => {
2,090✔
353
                        let right_v_d =
2,090✔
354
                            Decimal::from_i64(right_v).ok_or(PipelineError::UnableToCast(
2,090✔
355
                                format!("{}", right_v),
2,090✔
356
                                "Decimal".to_string(),
2,090✔
357
                            ))?;
2,090✔
358
                        Ok(Field::Boolean($function(left_v, right_v_d)))
2,090✔
359
                    }
360
                    // left: Decimal, right: I128
361
                    Field::I128(right_v) => {
×
362
                        let right_v_d =
×
363
                            Decimal::from_i128(right_v).ok_or(PipelineError::UnableToCast(
×
364
                                format!("{}", right_v),
×
365
                                "Decimal".to_string(),
×
366
                            ))?;
×
367
                        Ok(Field::Boolean($function(left_v, right_v_d)))
×
368
                    }
369
                    // left: Decimal, right: UInt
370
                    Field::UInt(right_v) => {
1,586✔
371
                        let right_v_d =
1,586✔
372
                            Decimal::from_u64(right_v).ok_or(PipelineError::UnableToCast(
1,586✔
373
                                format!("{}", right_v),
1,586✔
374
                                "Decimal".to_string(),
1,586✔
375
                            ))?;
1,586✔
376
                        Ok(Field::Boolean($function(left_v, right_v_d)))
1,586✔
377
                    }
378
                    // left: Decimal, right: U128
379
                    Field::U128(right_v) => {
×
380
                        let right_v_d =
×
381
                            Decimal::from_u128(right_v).ok_or(PipelineError::UnableToCast(
×
382
                                format!("{}", right_v),
×
383
                                "Decimal".to_string(),
×
384
                            ))?;
×
385
                        Ok(Field::Boolean($function(left_v, right_v_d)))
×
386
                    }
387
                    // left: Decimal, right: Decimal
388
                    Field::Decimal(right_v) => Ok(Field::Boolean($function(left_v, right_v))),
2,586✔
389
                    // left: Decimal, right: String or Text
390
                    Field::String(right_v) | Field::Text(right_v) => {
×
391
                        let right_v_b = Decimal::from_str(right_v.as_str()).map_err(|_| {
×
392
                            PipelineError::UnableToCast(
393
                                format!("{}", right_v),
394
                                "Decimal".to_string(),
395
                            )
396
                        })?;
×
397
                        Ok(Field::Boolean($function(left_v, right_v_b)))
×
398
                    }
399
                    // left: Decimal, right: Null
400
                    Field::Null => Ok(Field::Null),
1,586✔
401
                    Field::Boolean(_)
402
                    | Field::Binary(_)
403
                    | Field::Timestamp(_)
404
                    | Field::Date(_)
405
                    | Field::Json(_)
406
                    | Field::Point(_)
407
                    | Field::Duration(_) => Err(PipelineError::InvalidTypeComparison(
×
408
                        left_p,
×
409
                        right_p,
×
410
                        $op.to_string(),
×
411
                    )),
×
412
                },
413
                Field::String(ref left_v) | Field::Text(ref left_v) => match right_p {
400✔
414
                    Field::String(ref right_v) => Ok(Field::Boolean($function(left_v, right_v))),
400✔
415
                    Field::Text(ref right_v) => Ok(Field::Boolean($function(left_v, right_v))),
×
416
                    Field::Null => Ok(Field::Null),
×
417
                    Field::UInt(right_v) => {
×
418
                        let left_val = u64::from_str(left_v).map_err(|_| {
×
419
                            PipelineError::UnableToCast(format!("{}", left_v), "UInt".to_string())
420
                        })?;
×
421
                        Ok(Field::Boolean($function(left_val, right_v)))
×
422
                    }
423
                    Field::U128(right_v) => {
×
424
                        let left_val = u128::from_str(left_v).map_err(|_| {
×
425
                            PipelineError::UnableToCast(format!("{}", left_v), "U128".to_string())
426
                        })?;
×
427
                        Ok(Field::Boolean($function(left_val, right_v)))
×
428
                    }
429
                    Field::Int(right_v) => {
×
430
                        let left_val = i64::from_str(left_v).map_err(|_| {
×
431
                            PipelineError::UnableToCast(format!("{}", left_v), "Int".to_string())
432
                        })?;
×
433
                        Ok(Field::Boolean($function(left_val, right_v)))
×
434
                    }
435
                    Field::I128(right_v) => {
×
436
                        let left_val = i128::from_str(left_v).map_err(|_| {
×
437
                            PipelineError::UnableToCast(format!("{}", left_v), "I128".to_string())
438
                        })?;
×
439
                        Ok(Field::Boolean($function(left_val, right_v)))
×
440
                    }
441
                    Field::Float(right_v) => {
×
442
                        let left_val = f64::from_str(left_v).map_err(|_| {
×
443
                            PipelineError::UnableToCast(format!("{}", left_v), "Float".to_string())
444
                        })?;
×
445
                        Ok(Field::Boolean($function(left_val, *right_v)))
×
446
                    }
447
                    Field::Boolean(right_v) => {
×
448
                        let left_val = bool::from_str(left_v).map_err(|_| {
×
449
                            PipelineError::UnableToCast(format!("{}", left_v), "Bool".to_string())
450
                        })?;
×
451
                        Ok(Field::Boolean($function(left_val, right_v)))
×
452
                    }
453
                    Field::Decimal(right_v) => {
×
454
                        let left_val = Decimal::from_str(left_v).map_err(|_| {
×
455
                            PipelineError::UnableToCast(
456
                                format!("{}", left_v),
457
                                "Decimal".to_string(),
458
                            )
459
                        })?;
×
460
                        Ok(Field::Boolean($function(left_val, right_v)))
×
461
                    }
462
                    Field::Timestamp(right_v) => {
×
463
                        let ts = DateTime::parse_from_rfc3339(left_v).map_err(|_| {
×
464
                            PipelineError::UnableToCast(
465
                                format!("{}", left_v),
466
                                "Timestamp".to_string(),
467
                            )
468
                        })?;
×
469
                        Ok(Field::Boolean($function(ts, right_v)))
×
470
                    }
471
                    Field::Date(right_v) => {
×
472
                        let date =
×
473
                            NaiveDate::parse_from_str(left_v, DATE_FORMAT).map_err(|_| {
×
474
                                PipelineError::UnableToCast(
475
                                    format!("{}", left_v),
476
                                    "Date".to_string(),
477
                                )
478
                            })?;
×
479
                        Ok(Field::Boolean($function(date, right_v)))
×
480
                    }
481
                    Field::Point(right_v) => {
×
482
                        let left_val = DozerPoint::from_str(left_v).map_err(|_| {
×
483
                            PipelineError::UnableToCast(format!("{}", left_v), "Point".to_string())
484
                        })?;
×
485
                        Ok(Field::Boolean($function(left_val, right_v)))
×
486
                    }
487
                    Field::Duration(right_v) => {
×
488
                        let left_val = DozerDuration::from_str(left_v).map_err(|_| {
×
489
                            PipelineError::UnableToCast(
490
                                format!("{}", left_v),
491
                                "Duration".to_string(),
492
                            )
493
                        })?;
×
494
                        Ok(Field::Boolean($function(left_val, right_v)))
×
495
                    }
496
                    Field::Binary(_) | Field::Json(_) => Err(PipelineError::InvalidTypeComparison(
×
497
                        left_p,
×
498
                        right_p,
×
499
                        $op.to_string(),
×
500
                    )),
×
501
                },
502
                Field::Timestamp(left_v) => match right_p {
1✔
503
                    Field::Timestamp(right_v) => Ok(Field::Boolean($function(left_v, right_v))),
×
504
                    Field::String(ref right_v) | Field::Text(ref right_v) => {
1✔
505
                        let ts = DateTime::parse_from_rfc3339(right_v).map_err(|_| {
1✔
506
                            PipelineError::UnableToCast(
507
                                format!("{}", right_v),
508
                                "Timestamp".to_string(),
509
                            )
510
                        })?;
1✔
511
                        Ok(Field::Boolean($function(left_v, ts)))
1✔
512
                    }
513
                    Field::Null => Ok(Field::Null),
×
514
                    Field::UInt(_)
515
                    | Field::U128(_)
516
                    | Field::Int(_)
517
                    | Field::I128(_)
518
                    | Field::Float(_)
519
                    | Field::Boolean(_)
520
                    | Field::Binary(_)
521
                    | Field::Decimal(_)
522
                    | Field::Date(_)
523
                    | Field::Json(_)
524
                    | Field::Point(_)
525
                    | Field::Duration(_) => Err(PipelineError::InvalidTypeComparison(
×
526
                        left_p,
×
527
                        right_p,
×
528
                        $op.to_string(),
×
529
                    )),
×
530
                },
531
                Field::Date(left_v) => match right_p {
2✔
532
                    Field::Date(right_v) => Ok(Field::Boolean($function(left_v, right_v))),
×
533
                    Field::String(ref right_v) | Field::Text(ref right_v) => {
2✔
534
                        let date =
2✔
535
                            NaiveDate::parse_from_str(right_v, DATE_FORMAT).map_err(|_| {
2✔
536
                                PipelineError::UnableToCast(
537
                                    format!("{}", right_v),
538
                                    "Date".to_string(),
539
                                )
540
                            })?;
2✔
541
                        Ok(Field::Boolean($function(left_v, date)))
2✔
542
                    }
543
                    Field::Null => Ok(Field::Null),
×
544
                    Field::UInt(_)
545
                    | Field::U128(_)
546
                    | Field::Int(_)
547
                    | Field::I128(_)
548
                    | Field::Float(_)
549
                    | Field::Boolean(_)
550
                    | Field::Binary(_)
551
                    | Field::Decimal(_)
552
                    | Field::Timestamp(_)
553
                    | Field::Json(_)
554
                    | Field::Point(_)
555
                    | Field::Duration(_) => Err(PipelineError::InvalidTypeComparison(
×
556
                        left_p,
×
557
                        right_p,
×
558
                        $op.to_string(),
×
559
                    )),
×
560
                },
561
                Field::Point(left_v) => match right_p {
×
562
                    Field::Point(right_v) => Ok(Field::Boolean($function(left_v, right_v))),
×
563
                    Field::String(right_v) | Field::Text(right_v) => {
×
564
                        let right_val = DozerPoint::from_str(right_v.as_str()).map_err(|_| {
×
565
                            PipelineError::UnableToCast(format!("{}", right_v), "Point".to_string())
566
                        })?;
×
567
                        Ok(Field::Boolean($function(left_v, right_val)))
×
568
                    }
569
                    Field::Null => Ok(Field::Null),
×
570
                    Field::UInt(_)
571
                    | Field::U128(_)
572
                    | Field::Int(_)
573
                    | Field::I128(_)
574
                    | Field::Float(_)
575
                    | Field::Boolean(_)
576
                    | Field::Binary(_)
577
                    | Field::Decimal(_)
578
                    | Field::Timestamp(_)
579
                    | Field::Json(_)
580
                    | Field::Date(_)
581
                    | Field::Duration(_) => Err(PipelineError::InvalidTypeComparison(
×
582
                        left_p,
×
583
                        right_p,
×
584
                        $op.to_string(),
×
585
                    )),
×
586
                },
587
                Field::Duration(left_v) => match right_p {
×
588
                    Field::Duration(right_v) => Ok(Field::Boolean($function(left_v, right_v))),
×
589
                    Field::String(right_v) | Field::Text(right_v) => {
×
590
                        let right_val =
×
591
                            DozerDuration::from_str(right_v.as_str()).map_err(|_| {
×
592
                                PipelineError::UnableToCast(
593
                                    format!("{}", right_v),
594
                                    "Duration".to_string(),
595
                                )
596
                            })?;
×
597
                        Ok(Field::Boolean($function(left_v, right_val)))
×
598
                    }
599
                    Field::Null => Ok(Field::Null),
×
600
                    Field::UInt(_)
601
                    | Field::U128(_)
602
                    | Field::Int(_)
603
                    | Field::I128(_)
604
                    | Field::Float(_)
605
                    | Field::Boolean(_)
606
                    | Field::Binary(_)
607
                    | Field::Decimal(_)
608
                    | Field::Timestamp(_)
609
                    | Field::Json(_)
610
                    | Field::Date(_)
611
                    | Field::Point(_) => Err(PipelineError::InvalidTypeComparison(
×
612
                        left_p,
×
613
                        right_p,
×
614
                        $op.to_string(),
×
615
                    )),
×
616
                },
617
                Field::Binary(_) | Field::Json(_) => Err(PipelineError::InvalidTypeComparison(
×
618
                    left_p,
×
619
                    right_p,
×
620
                    $op.to_string(),
×
621
                )),
×
622
            }
623
        }
70,534✔
624
    };
625
}
626

627
use crate::pipeline::expression::execution::{Expression, ExpressionExecutor};
628

629
pub fn evaluate_lt(
5,168✔
630
    schema: &Schema,
5,168✔
631
    left: &Expression,
5,168✔
632
    right: &Expression,
5,168✔
633
    record: &Record,
5,168✔
634
) -> Result<Field, PipelineError> {
5,168✔
635
    let left_p = left.evaluate(record, schema)?;
5,168✔
636
    let right_p = right.evaluate(record, schema)?;
5,168✔
637

638
    match left_p {
5,168✔
639
        Field::Null => Ok(Field::Null),
×
640
        Field::Boolean(left_v) => match right_p {
×
641
            // left: Bool, right: Bool
642
            Field::Boolean(right_v) => Ok(Field::Boolean(!left_v & right_v)),
×
643
            // left: Bool, right: String or Text
644
            Field::String(right_v) | Field::Text(right_v) => {
×
645
                let right_v_b = bool::from_str(right_v.as_str()).map_err(|_| {
×
646
                    PipelineError::UnableToCast(right_v.to_string(), "Bool".to_string())
×
647
                })?;
×
648
                Ok(Field::Boolean(!left_v & right_v_b))
×
649
            }
650
            // left: Bool, right: UInt
651
            Field::UInt(right_v) => {
×
652
                let right_v_b = bool::from_str(right_v.to_string().as_str()).map_err(|_| {
×
653
                    PipelineError::UnableToCast(format!("{}", right_v), "Bool".to_string())
×
654
                })?;
×
655
                Ok(Field::Boolean(!left_v & right_v_b))
×
656
            }
657
            // left: Bool, right: U128
658
            Field::U128(right_v) => {
×
659
                let right_v_b = bool::from_str(right_v.to_string().as_str()).map_err(|_| {
×
660
                    PipelineError::UnableToCast(format!("{}", right_v), "Bool".to_string())
×
661
                })?;
×
662
                Ok(Field::Boolean(!left_v & right_v_b))
×
663
            }
664
            // left: Bool, right: Int
665
            Field::Int(right_v) => {
×
666
                let right_v_b = bool::from_str(right_v.to_string().as_str()).map_err(|_| {
×
667
                    PipelineError::UnableToCast(format!("{}", right_v), "Bool".to_string())
×
668
                })?;
×
669
                Ok(Field::Boolean(!left_v & right_v_b))
×
670
            }
671
            // left: Bool, right: I128
672
            Field::I128(right_v) => {
×
673
                let right_v_b = bool::from_str(right_v.to_string().as_str()).map_err(|_| {
×
674
                    PipelineError::UnableToCast(format!("{}", right_v), "Bool".to_string())
×
675
                })?;
×
676
                Ok(Field::Boolean(!left_v & right_v_b))
×
677
            }
678
            // left: Bool, right: Float
679
            Field::Float(right_v) => {
×
680
                let right_v_b = bool::from_str(right_v.to_string().as_str()).map_err(|_| {
×
681
                    PipelineError::UnableToCast(format!("{}", right_v), "Bool".to_string())
×
682
                })?;
×
683
                Ok(Field::Boolean(!left_v & right_v_b))
×
684
            }
685
            // left: Bool, right: Decimal
686
            Field::Decimal(right_v) => {
×
687
                let right_v_b = bool::from_str(right_v.to_string().as_str()).map_err(|_| {
×
688
                    PipelineError::UnableToCast(format!("{}", right_v), "Bool".to_string())
×
689
                })?;
×
690
                Ok(Field::Boolean(!left_v & right_v_b))
×
691
            }
692
            Field::Binary(_)
693
            | Field::Timestamp(_)
694
            | Field::Date(_)
695
            | Field::Json(_)
696
            | Field::Point(_)
697
            | Field::Duration(_)
698
            | Field::Null => Ok(Field::Null),
×
699
        },
700
        Field::Int(left_v) => match right_p {
2,752✔
701
            // left: Int, right: Int
702
            Field::Int(right_v) => Ok(Field::Boolean(left_v < right_v)),
827✔
703
            // left: Int, right: I128
704
            Field::I128(right_v) => Ok(Field::Boolean((left_v as i128) < right_v)),
×
705
            // left: Int, right: UInt
706
            Field::UInt(right_v) => Ok(Field::Boolean(left_v < (right_v as i64))),
481✔
707
            // left: Int, right: U128
708
            Field::U128(right_v) => Ok(Field::Boolean(left_v < (right_v as i64))),
×
709
            // left: Int, right: Float
710
            Field::Float(right_v) => Ok(Field::Boolean((left_v as f64) < *right_v)),
481✔
711
            // left: Int, right: Decimal
712
            Field::Decimal(right_v) => {
481✔
713
                let left_v_d = Decimal::from_i64(left_v).ok_or(PipelineError::UnableToCast(
481✔
714
                    format!("{}", left_v),
481✔
715
                    "Decimal".to_string(),
481✔
716
                ))?;
481✔
717
                Ok(Field::Boolean(left_v_d < right_v))
481✔
718
            }
719
            // left: Int, right: String or Text
720
            Field::String(right_v) | Field::Text(right_v) => {
1✔
721
                let right_v_b = i64::from_str(right_v.as_str()).map_err(|_| {
1✔
722
                    PipelineError::UnableToCast(right_v.to_string(), "Int".to_string())
×
723
                })?;
1✔
724
                Ok(Field::Boolean(left_v < right_v_b))
1✔
725
            }
726
            // left: Int, right: Duration
727
            Field::Duration(right_v) => {
×
728
                let left_v_b =
×
729
                    DozerDuration(Duration::from_nanos(left_v as u64), TimeUnit::Nanoseconds);
×
730
                Ok(Field::Boolean(left_v_b < right_v))
×
731
            }
732
            // left: Int, right: Null
733
            Field::Null => Ok(Field::Null),
481✔
734
            Field::Boolean(_)
735
            | Field::Binary(_)
736
            | Field::Timestamp(_)
737
            | Field::Date(_)
738
            | Field::Json(_)
739
            | Field::Point(_) => Err(PipelineError::InvalidTypeComparison(
×
740
                left_p,
×
741
                right_p,
×
742
                "<".to_string(),
×
743
            )),
×
744
        },
745
        Field::I128(left_v) => match right_p {
×
746
            // left: I128, right: Int
747
            Field::Int(right_v) => Ok(Field::Boolean(left_v < (right_v as i128))),
×
748
            // left: I128, right: I128
749
            Field::I128(right_v) => Ok(Field::Boolean(left_v < right_v)),
×
750
            // left: I128, right: UInt
751
            Field::UInt(right_v) => Ok(Field::Boolean(left_v < (right_v as i128))),
×
752
            // left: I128, right: U128
753
            Field::U128(right_v) => Ok(Field::Boolean(left_v < (right_v as i128))),
×
754
            // left: I128, right: Float
755
            Field::Float(right_v) => Ok(Field::Boolean((left_v as f64) < *right_v)),
×
756
            // left: I128, right: Decimal
757
            Field::Decimal(right_v) => {
×
758
                let left_v_d = Decimal::from_i128(left_v).ok_or(PipelineError::UnableToCast(
×
759
                    format!("{}", left_v),
×
760
                    "Decimal".to_string(),
×
761
                ))?;
×
762
                Ok(Field::Boolean(left_v_d < right_v))
×
763
            }
764
            // left: I128, right: String or Text
765
            Field::String(right_v) | Field::Text(right_v) => {
×
766
                let right_v_b = i128::from_str(right_v.as_str()).map_err(|_| {
×
767
                    PipelineError::UnableToCast(right_v.to_string(), "I128".to_string())
×
768
                })?;
×
769
                Ok(Field::Boolean(left_v < right_v_b))
×
770
            }
771
            // left: I128, right: Duration
772
            Field::Duration(right_v) => {
×
773
                let left_v_b =
×
774
                    DozerDuration(Duration::from_nanos(left_v as u64), TimeUnit::Nanoseconds);
×
775
                Ok(Field::Boolean(left_v_b < right_v))
×
776
            }
777
            // left: I128, right: Null
778
            Field::Null => Ok(Field::Null),
×
779
            Field::Boolean(_)
780
            | Field::Binary(_)
781
            | Field::Timestamp(_)
782
            | Field::Date(_)
783
            | Field::Json(_)
784
            | Field::Point(_) => Err(PipelineError::InvalidTypeComparison(
×
785
                left_p,
×
786
                right_p,
×
787
                "<".to_string(),
×
788
            )),
×
789
        },
790
        Field::UInt(left_v) => match right_p {
1,020✔
791
            // left: UInt, right: Int
792
            Field::Int(right_v) => Ok(Field::Boolean((left_v as i64) < right_v)),
204✔
793
            // left: UInt, right: I128
794
            Field::I128(right_v) => Ok(Field::Boolean((left_v as i128) < right_v)),
×
795
            // left: UInt, right: UInt
796
            Field::UInt(right_v) => Ok(Field::Boolean(left_v < right_v)),
204✔
797
            // left: UInt, right: U128
798
            Field::U128(right_v) => Ok(Field::Boolean((left_v as u128) < right_v)),
×
799
            // left: UInt, right: Float
800
            Field::Float(right_v) => Ok(Field::Boolean((left_v as f64) < *right_v)),
204✔
801
            // left: UInt, right: Decimal
802
            Field::Decimal(right_v) => {
204✔
803
                let left_v_d = Decimal::from_f64(left_v as f64).ok_or(
204✔
804
                    PipelineError::UnableToCast(format!("{}", left_v), "Decimal".to_string()),
204✔
805
                )?;
204✔
806
                Ok(Field::Boolean(left_v_d < right_v))
204✔
807
            }
808
            // left: UInt, right: String or Text
809
            Field::String(right_v) | Field::Text(right_v) => {
×
810
                let right_v_b = u64::from_str(right_v.as_str()).map_err(|_| {
×
811
                    PipelineError::UnableToCast(right_v.to_string(), "UInt".to_string())
×
812
                })?;
×
813
                Ok(Field::Boolean(left_v < right_v_b))
×
814
            }
815
            // left: UInt, right: Duration
816
            Field::Duration(right_v) => {
×
817
                let left_v_b = DozerDuration(Duration::from_nanos(left_v), TimeUnit::Nanoseconds);
×
818
                Ok(Field::Boolean(left_v_b < right_v))
×
819
            }
820
            // left: UInt, right: Null
821
            Field::Null => Ok(Field::Null),
204✔
822
            Field::Boolean(_)
823
            | Field::Binary(_)
824
            | Field::Timestamp(_)
825
            | Field::Date(_)
826
            | Field::Json(_)
827
            | Field::Point(_) => Err(PipelineError::InvalidTypeComparison(
×
828
                left_p,
×
829
                right_p,
×
830
                "<".to_string(),
×
831
            )),
×
832
        },
833
        Field::U128(left_v) => match right_p {
×
834
            // left: U128, right: Int
835
            Field::Int(right_v) => Ok(Field::Boolean((left_v as i128) < (right_v as i128))),
×
836
            // left: U128, right: I128
837
            Field::I128(right_v) => Ok(Field::Boolean((left_v as i128) < right_v)),
×
838
            // left: U128, right: UInt
839
            Field::UInt(right_v) => Ok(Field::Boolean(left_v < (right_v as u128))),
×
840
            // left: U128, right: U128
841
            Field::U128(right_v) => Ok(Field::Boolean(left_v < right_v)),
×
842
            // left: U128, right: Float
843
            Field::Float(right_v) => Ok(Field::Boolean((left_v as f64) < *right_v)),
×
844
            // left: U128, right: Decimal
845
            Field::Decimal(right_v) => {
×
846
                let left_v_d = Decimal::from_f64(left_v as f64).ok_or(
×
847
                    PipelineError::UnableToCast(format!("{}", left_v), "Decimal".to_string()),
×
848
                )?;
×
849
                Ok(Field::Boolean(left_v_d < right_v))
×
850
            }
851
            // left: U128, right: String or Text
852
            Field::String(right_v) | Field::Text(right_v) => {
×
853
                let right_v_b = u128::from_str(right_v.as_str()).map_err(|_| {
×
854
                    PipelineError::UnableToCast(right_v.to_string(), "U128".to_string())
×
855
                })?;
×
856
                Ok(Field::Boolean(left_v < right_v_b))
×
857
            }
858
            // left: U128, right: Duration
859
            Field::Duration(right_v) => {
×
860
                let left_v_b =
×
861
                    DozerDuration(Duration::from_nanos(left_v as u64), TimeUnit::Nanoseconds);
×
862
                Ok(Field::Boolean(left_v_b < right_v))
×
863
            }
864
            // left: U128, right: Null
865
            Field::Null => Ok(Field::Null),
×
866
            Field::Boolean(_)
867
            | Field::Binary(_)
868
            | Field::Timestamp(_)
869
            | Field::Date(_)
870
            | Field::Json(_)
871
            | Field::Point(_) => Err(PipelineError::InvalidTypeComparison(
×
872
                left_p,
×
873
                right_p,
×
874
                "<".to_string(),
×
875
            )),
×
876
        },
877
        Field::Float(left_v) => match right_p {
475✔
878
            // left: Float, right: Float
879
            Field::Float(right_v) => Ok(Field::Boolean(left_v < right_v)),
95✔
880
            // left: Float, right: UInt
881
            Field::UInt(right_v) => Ok(Field::Boolean(*left_v < (right_v as f64))),
95✔
882
            // left: Float, right: U128
883
            Field::U128(right_v) => Ok(Field::Boolean(*left_v < (right_v as f64))),
×
884
            // left: Float, right: Int
885
            Field::Int(right_v) => Ok(Field::Boolean(*left_v < (right_v as f64))),
95✔
886
            // left: Float, right: I128
887
            Field::I128(right_v) => Ok(Field::Boolean(*left_v < (right_v as f64))),
×
888
            // left: Float, right: Decimal
889
            Field::Decimal(right_v) => {
95✔
890
                let left_v_d = Decimal::from_f64(*left_v).ok_or(PipelineError::UnableToCast(
95✔
891
                    format!("{}", left_v),
95✔
892
                    "Decimal".to_string(),
95✔
893
                ))?;
95✔
894
                Ok(Field::Boolean(left_v_d < right_v))
95✔
895
            }
896
            // left: Float, right: String or Text
897
            Field::String(right_v) | Field::Text(right_v) => {
×
898
                let right_v_b = f64::from_str(right_v.as_str()).map_err(|_| {
×
899
                    PipelineError::UnableToCast(right_v.to_string(), "Float".to_string())
×
900
                })?;
×
901
                Ok(Field::Boolean(*left_v < right_v_b))
×
902
            }
903
            // left: Float, right: Null
904
            Field::Null => Ok(Field::Null),
95✔
905
            Field::Boolean(_)
906
            | Field::Binary(_)
907
            | Field::Timestamp(_)
908
            | Field::Date(_)
909
            | Field::Json(_)
910
            | Field::Point(_)
911
            | Field::Duration(_) => Err(PipelineError::InvalidTypeComparison(
×
912
                left_p,
×
913
                right_p,
×
914
                "<".to_string(),
×
915
            )),
×
916
        },
917
        Field::Decimal(left_v) => {
920✔
918
            match right_p {
920✔
919
                // left: Decimal, right: Float
920
                Field::Float(right_v) => {
128✔
921
                    let right_v_d = Decimal::from_f64(*right_v).ok_or(
128✔
922
                        PipelineError::UnableToCast(format!("{}", right_v), "Decimal".to_string()),
128✔
923
                    )?;
128✔
924
                    Ok(Field::Boolean(left_v < right_v_d))
128✔
925
                }
926
                // left: Decimal, right: Int
927
                Field::Int(right_v) => {
417✔
928
                    let right_v_d = Decimal::from_i64(right_v).ok_or(
417✔
929
                        PipelineError::UnableToCast(format!("{}", right_v), "Decimal".to_string()),
417✔
930
                    )?;
417✔
931
                    Ok(Field::Boolean(left_v < right_v_d))
417✔
932
                }
933
                // left: Decimal, right: I128
934
                Field::I128(right_v) => {
×
935
                    let right_v_d = Decimal::from_i128(right_v).ok_or(
×
936
                        PipelineError::UnableToCast(format!("{}", right_v), "Decimal".to_string()),
×
937
                    )?;
×
938
                    Ok(Field::Boolean(left_v < right_v_d))
×
939
                }
940
                // left: Decimal, right: UInt
941
                Field::UInt(right_v) => {
125✔
942
                    let right_v_d = Decimal::from_u64(right_v).ok_or(
125✔
943
                        PipelineError::UnableToCast(format!("{}", right_v), "Decimal".to_string()),
125✔
944
                    )?;
125✔
945
                    Ok(Field::Boolean(left_v < right_v_d))
125✔
946
                }
947
                // left: Decimal, right: U128
948
                Field::U128(right_v) => {
×
949
                    let right_v_d = Decimal::from_u128(right_v).ok_or(
×
950
                        PipelineError::UnableToCast(format!("{}", right_v), "Decimal".to_string()),
×
951
                    )?;
×
952
                    Ok(Field::Boolean(left_v < right_v_d))
×
953
                }
954
                // left: Decimal, right: Decimal
955
                Field::Decimal(right_v) => Ok(Field::Boolean(left_v < right_v)),
125✔
956
                // left: Decimal, right: String or Text
957
                Field::String(right_v) | Field::Text(right_v) => {
×
958
                    let right_v_b = Decimal::from_str(right_v.as_str()).map_err(|_| {
×
959
                        PipelineError::UnableToCast(right_v.to_string(), "Decimal".to_string())
×
960
                    })?;
×
961
                    Ok(Field::Boolean(left_v < right_v_b))
×
962
                }
963
                // left: Decimal, right: Null
964
                Field::Null => Ok(Field::Null),
125✔
965
                Field::Boolean(_)
966
                | Field::Binary(_)
967
                | Field::Timestamp(_)
968
                | Field::Date(_)
969
                | Field::Json(_)
970
                | Field::Point(_)
971
                | Field::Duration(_) => Err(PipelineError::InvalidTypeComparison(
×
972
                    left_p,
×
973
                    right_p,
×
974
                    "<".to_string(),
×
975
                )),
×
976
            }
977
        }
978
        Field::String(ref left_v) | Field::Text(ref left_v) => match right_p {
×
979
            Field::String(ref right_v) => Ok(Field::Boolean(left_v < right_v)),
×
980
            Field::Text(ref right_v) => Ok(Field::Boolean(left_v < right_v)),
×
981
            Field::Null => Ok(Field::Null),
×
982
            Field::UInt(right_v) => {
×
983
                let left_val = u64::from_str(left_v).map_err(|_| {
×
984
                    PipelineError::UnableToCast(left_v.to_string(), "UInt".to_string())
×
985
                })?;
×
986
                Ok(Field::Boolean(left_val < right_v))
×
987
            }
988
            Field::U128(right_v) => {
×
989
                let left_val = u128::from_str(left_v).map_err(|_| {
×
990
                    PipelineError::UnableToCast(left_v.to_string(), "U128".to_string())
×
991
                })?;
×
992
                Ok(Field::Boolean(left_val < right_v))
×
993
            }
994
            Field::Int(right_v) => {
×
995
                let left_val = i64::from_str(left_v).map_err(|_| {
×
996
                    PipelineError::UnableToCast(left_v.to_string(), "Int".to_string())
×
997
                })?;
×
998
                Ok(Field::Boolean(left_val < right_v))
×
999
            }
1000
            Field::I128(right_v) => {
×
1001
                let left_val = i128::from_str(left_v).map_err(|_| {
×
1002
                    PipelineError::UnableToCast(left_v.to_string(), "I128".to_string())
×
1003
                })?;
×
1004
                Ok(Field::Boolean(left_val < right_v))
×
1005
            }
1006
            Field::Float(right_v) => {
×
1007
                let left_val = f64::from_str(left_v).map_err(|_| {
×
1008
                    PipelineError::UnableToCast(left_v.to_string(), "Float".to_string())
×
1009
                })?;
×
1010
                Ok(Field::Boolean(left_val < *right_v))
×
1011
            }
1012
            Field::Boolean(right_v) => {
×
1013
                let left_val = bool::from_str(left_v).map_err(|_| {
×
1014
                    PipelineError::UnableToCast(left_v.to_string(), "Bool".to_string())
×
1015
                })?;
×
1016
                Ok(Field::Boolean(!left_val & right_v))
×
1017
            }
1018
            Field::Decimal(right_v) => {
×
1019
                let left_val = Decimal::from_str(left_v).map_err(|_| {
×
1020
                    PipelineError::UnableToCast(left_v.to_string(), "Decimal".to_string())
×
1021
                })?;
×
1022
                Ok(Field::Boolean(left_val < right_v))
×
1023
            }
1024
            Field::Timestamp(right_v) => {
×
1025
                let ts = DateTime::parse_from_rfc3339(left_v).map_err(|_| {
×
1026
                    PipelineError::UnableToCast(left_v.to_string(), "Timestamp".to_string())
×
1027
                })?;
×
1028
                Ok(Field::Boolean(ts < right_v))
×
1029
            }
1030
            Field::Date(right_v) => {
×
1031
                let date = NaiveDate::parse_from_str(left_v, DATE_FORMAT).map_err(|_| {
×
1032
                    PipelineError::UnableToCast(left_v.to_string(), "Date".to_string())
×
1033
                })?;
×
1034
                Ok(Field::Boolean(date < right_v))
×
1035
            }
1036
            Field::Point(right_v) => {
×
1037
                let left_val = DozerPoint::from_str(left_v).map_err(|_| {
×
1038
                    PipelineError::UnableToCast(left_v.to_string(), "Point".to_string())
×
1039
                })?;
×
1040
                Ok(Field::Boolean(left_val < right_v))
×
1041
            }
1042
            Field::Duration(right_v) => {
×
1043
                let left_val = DozerDuration::from_str(left_v).map_err(|_| {
×
1044
                    PipelineError::UnableToCast(left_v.to_string(), "Duration".to_string())
×
1045
                })?;
×
1046
                Ok(Field::Boolean(left_val < right_v))
×
1047
            }
1048
            Field::Binary(_) | Field::Json(_) => Err(PipelineError::InvalidTypeComparison(
×
1049
                left_p,
×
1050
                right_p,
×
1051
                "<".to_string(),
×
1052
            )),
×
1053
        },
1054
        Field::Timestamp(left_v) => match right_p {
1✔
1055
            Field::Timestamp(right_v) => Ok(Field::Boolean(left_v < right_v)),
×
1056
            Field::String(ref right_v) | Field::Text(ref right_v) => {
1✔
1057
                let ts = DateTime::parse_from_rfc3339(right_v).map_err(|_| {
1✔
1058
                    PipelineError::UnableToCast(right_v.to_string(), "Timestamp".to_string())
×
1059
                })?;
1✔
1060
                Ok(Field::Boolean(left_v < ts))
1✔
1061
            }
1062
            Field::Null => Ok(Field::Null),
×
1063
            Field::UInt(_)
1064
            | Field::U128(_)
1065
            | Field::Int(_)
1066
            | Field::I128(_)
1067
            | Field::Float(_)
1068
            | Field::Boolean(_)
1069
            | Field::Binary(_)
1070
            | Field::Decimal(_)
1071
            | Field::Date(_)
1072
            | Field::Json(_)
1073
            | Field::Point(_)
1074
            | Field::Duration(_) => Err(PipelineError::InvalidTypeComparison(
×
1075
                left_p,
×
1076
                right_p,
×
1077
                "<".to_string(),
×
1078
            )),
×
1079
        },
1080
        Field::Date(left_v) => match right_p {
×
1081
            Field::Date(right_v) => Ok(Field::Boolean(left_v < right_v)),
×
1082
            Field::String(ref right_v) | Field::Text(ref right_v) => {
×
1083
                let date = NaiveDate::parse_from_str(right_v, DATE_FORMAT).map_err(|_| {
×
1084
                    PipelineError::UnableToCast(right_v.to_string(), "Date".to_string())
×
1085
                })?;
×
1086
                Ok(Field::Boolean(left_v < date))
×
1087
            }
1088
            Field::Null => Ok(Field::Null),
×
1089
            Field::UInt(_)
1090
            | Field::U128(_)
1091
            | Field::Int(_)
1092
            | Field::I128(_)
1093
            | Field::Float(_)
1094
            | Field::Boolean(_)
1095
            | Field::Binary(_)
1096
            | Field::Decimal(_)
1097
            | Field::Timestamp(_)
1098
            | Field::Json(_)
1099
            | Field::Point(_)
1100
            | Field::Duration(_) => Err(PipelineError::InvalidTypeComparison(
×
1101
                left_p,
×
1102
                right_p,
×
1103
                "<".to_string(),
×
1104
            )),
×
1105
        },
1106
        Field::Point(left_v) => match right_p {
×
1107
            Field::Point(right_v) => Ok(Field::Boolean(left_v < right_v)),
×
1108
            Field::String(right_v) | Field::Text(right_v) => {
×
1109
                let right_val = DozerPoint::from_str(right_v.as_str()).map_err(|_| {
×
1110
                    PipelineError::UnableToCast(right_v.to_string(), "Point".to_string())
×
1111
                })?;
×
1112
                Ok(Field::Boolean(left_v < right_val))
×
1113
            }
1114
            Field::Null => Ok(Field::Null),
×
1115
            Field::UInt(_)
1116
            | Field::U128(_)
1117
            | Field::Int(_)
1118
            | Field::I128(_)
1119
            | Field::Float(_)
1120
            | Field::Boolean(_)
1121
            | Field::Binary(_)
1122
            | Field::Decimal(_)
1123
            | Field::Timestamp(_)
1124
            | Field::Json(_)
1125
            | Field::Date(_)
1126
            | Field::Duration(_) => Err(PipelineError::InvalidTypeComparison(
×
1127
                left_p,
×
1128
                right_p,
×
1129
                "<".to_string(),
×
1130
            )),
×
1131
        },
1132
        Field::Duration(left_v) => match right_p {
×
1133
            Field::Duration(right_v) => Ok(Field::Boolean(left_v < right_v)),
×
1134
            Field::String(right_v) | Field::Text(right_v) => {
×
1135
                let right_val = DozerDuration::from_str(right_v.as_str()).map_err(|_| {
×
1136
                    PipelineError::UnableToCast(right_v.to_string(), "Duration".to_string())
×
1137
                })?;
×
1138
                Ok(Field::Boolean(left_v < right_val))
×
1139
            }
1140
            Field::Null => Ok(Field::Null),
×
1141
            Field::UInt(_)
1142
            | Field::U128(_)
1143
            | Field::Int(_)
1144
            | Field::I128(_)
1145
            | Field::Float(_)
1146
            | Field::Boolean(_)
1147
            | Field::Binary(_)
1148
            | Field::Decimal(_)
1149
            | Field::Timestamp(_)
1150
            | Field::Json(_)
1151
            | Field::Date(_)
1152
            | Field::Point(_) => Err(PipelineError::InvalidTypeComparison(
×
1153
                left_p,
×
1154
                right_p,
×
1155
                "<".to_string(),
×
1156
            )),
×
1157
        },
1158
        Field::Binary(_) | Field::Json(_) => Err(PipelineError::InvalidTypeComparison(
×
1159
            left_p,
×
1160
            right_p,
×
1161
            "<".to_string(),
×
1162
        )),
×
1163
    }
1164
}
5,168✔
1165

1166
pub fn evaluate_gt(
5,410✔
1167
    schema: &Schema,
5,410✔
1168
    left: &Expression,
5,410✔
1169
    right: &Expression,
5,410✔
1170
    record: &Record,
5,410✔
1171
) -> Result<Field, PipelineError> {
5,410✔
1172
    let left_p = left.evaluate(record, schema)?;
5,410✔
1173
    let right_p = right.evaluate(record, schema)?;
5,410✔
1174

1175
    match left_p {
5,410✔
1176
        Field::Null => Ok(Field::Null),
×
1177
        Field::Boolean(left_v) => match right_p {
×
1178
            // left: Bool, right: Bool
1179
            Field::Boolean(right_v) => Ok(Field::Boolean(left_v & !right_v)),
×
1180
            Field::String(right_v) | Field::Text(right_v) => {
×
1181
                let right_v_b = bool::from_str(right_v.as_str()).unwrap();
×
1182
                Ok(Field::Boolean(left_v & !right_v_b))
×
1183
            }
1184
            // left: Bool, right: UInt
1185
            Field::UInt(right_v) => {
×
1186
                let right_v_b = bool::from_str(right_v.to_string().as_str()).map_err(|_| {
×
1187
                    PipelineError::UnableToCast(format!("{}", right_v), "Bool".to_string())
×
1188
                })?;
×
1189
                Ok(Field::Boolean(left_v & !right_v_b))
×
1190
            }
1191
            // left: Bool, right: U128
1192
            Field::U128(right_v) => {
×
1193
                let right_v_b = bool::from_str(right_v.to_string().as_str()).map_err(|_| {
×
1194
                    PipelineError::UnableToCast(format!("{}", right_v), "Bool".to_string())
×
1195
                })?;
×
1196
                Ok(Field::Boolean(left_v & !right_v_b))
×
1197
            }
1198
            // left: Bool, right: Int
1199
            Field::Int(right_v) => {
×
1200
                let right_v_b = bool::from_str(right_v.to_string().as_str()).map_err(|_| {
×
1201
                    PipelineError::UnableToCast(format!("{}", right_v), "Bool".to_string())
×
1202
                })?;
×
1203
                Ok(Field::Boolean(left_v & !right_v_b))
×
1204
            }
1205
            // left: Bool, right: I128
1206
            Field::I128(right_v) => {
×
1207
                let right_v_b = bool::from_str(right_v.to_string().as_str()).map_err(|_| {
×
1208
                    PipelineError::UnableToCast(format!("{}", right_v), "Bool".to_string())
×
1209
                })?;
×
1210
                Ok(Field::Boolean(left_v & !right_v_b))
×
1211
            }
1212
            // left: Bool, right: Float
1213
            Field::Float(right_v) => {
×
1214
                let right_v_b = bool::from_str(right_v.to_string().as_str()).map_err(|_| {
×
1215
                    PipelineError::UnableToCast(format!("{}", right_v), "Bool".to_string())
×
1216
                })?;
×
1217
                Ok(Field::Boolean(left_v & !right_v_b))
×
1218
            }
1219
            // left: Bool, right: Decimal
1220
            Field::Decimal(right_v) => {
×
1221
                let right_v_b = bool::from_str(right_v.to_string().as_str()).map_err(|_| {
×
1222
                    PipelineError::UnableToCast(format!("{}", right_v), "Bool".to_string())
×
1223
                })?;
×
1224
                Ok(Field::Boolean(left_v & !right_v_b))
×
1225
            }
1226
            Field::Binary(_)
1227
            | Field::Timestamp(_)
1228
            | Field::Date(_)
1229
            | Field::Json(_)
1230
            | Field::Point(_)
1231
            | Field::Duration(_)
1232
            | Field::Null => Ok(Field::Null),
×
1233
        },
1234
        Field::Int(left_v) => match right_p {
2,876✔
1235
            // left: Int, right: Int
1236
            Field::Int(right_v) => Ok(Field::Boolean(left_v > right_v)),
952✔
1237
            // left: Int, right: I128
1238
            Field::I128(right_v) => Ok(Field::Boolean((left_v as i128) > right_v)),
×
1239
            // left: Int, right: UInt
1240
            Field::UInt(right_v) => Ok(Field::Boolean(left_v > (right_v as i64))),
481✔
1241
            // left: Int, right: U128
1242
            Field::U128(right_v) => Ok(Field::Boolean(left_v > (right_v as i64))),
×
1243
            // left: Int, right: Float
1244
            Field::Float(right_v) => Ok(Field::Boolean(left_v as f64 > *right_v)),
481✔
1245
            // left: Int, right: Decimal
1246
            Field::Decimal(right_v) => {
481✔
1247
                let left_v_d = Decimal::from_i64(left_v).ok_or(PipelineError::UnableToCast(
481✔
1248
                    format!("{}", left_v),
481✔
1249
                    "Decimal".to_string(),
481✔
1250
                ))?;
481✔
1251
                Ok(Field::Boolean(left_v_d > right_v))
481✔
1252
            }
1253
            // left: Int, right: String or Text
1254
            Field::String(right_v) | Field::Text(right_v) => {
×
1255
                let right_v_b = i64::from_str(right_v.as_str()).map_err(|_| {
1✔
1256
                    PipelineError::UnableToCast(right_v.to_string(), "Int".to_string())
×
1257
                })?;
×
1258
                Ok(Field::Boolean(left_v > right_v_b))
1✔
1259
            }
1260
            // left: Int, right: Duration
1261
            Field::Duration(right_v) => {
×
1262
                let left_v_b =
×
1263
                    DozerDuration(Duration::from_nanos(left_v as u64), TimeUnit::Nanoseconds);
×
1264
                Ok(Field::Boolean(left_v_b > right_v))
×
1265
            }
1266
            // left: Int, right: Null
1267
            Field::Null => Ok(Field::Null),
481✔
1268
            Field::Boolean(_)
1269
            | Field::Binary(_)
1270
            | Field::Timestamp(_)
1271
            | Field::Date(_)
1272
            | Field::Json(_)
1273
            | Field::Point(_) => Err(PipelineError::InvalidTypeComparison(
×
1274
                left_p,
×
1275
                right_p,
×
1276
                ">".to_string(),
×
1277
            )),
×
1278
        },
1279
        Field::I128(left_v) => match right_p {
×
1280
            // left: I128, right: Int
1281
            Field::Int(right_v) => Ok(Field::Boolean(left_v > (right_v as i128))),
×
1282
            // left: I128, right: I128
1283
            Field::I128(right_v) => Ok(Field::Boolean(left_v > right_v)),
×
1284
            // left: I128, right: UInt
1285
            Field::UInt(right_v) => Ok(Field::Boolean(left_v > (right_v as i128))),
×
1286
            // left: I128, right: U128
1287
            Field::U128(right_v) => Ok(Field::Boolean(left_v > (right_v as i128))),
×
1288
            // left: I128, right: Float
1289
            Field::Float(right_v) => Ok(Field::Boolean((left_v as f64) > *right_v)),
×
1290
            // left: I128, right: Decimal
1291
            Field::Decimal(right_v) => {
×
1292
                let left_v_d = Decimal::from_i128(left_v).ok_or(PipelineError::UnableToCast(
×
1293
                    format!("{}", left_v),
×
1294
                    "Decimal".to_string(),
×
1295
                ))?;
×
1296
                Ok(Field::Boolean(left_v_d > right_v))
×
1297
            }
1298
            // left: I128, right: String or Text
1299
            Field::String(right_v) | Field::Text(right_v) => {
×
1300
                let right_v_b = i128::from_str(right_v.as_str()).map_err(|_| {
×
1301
                    PipelineError::UnableToCast(right_v.to_string(), "I128".to_string())
×
1302
                })?;
×
1303
                Ok(Field::Boolean(left_v > right_v_b))
×
1304
            }
1305
            // left: I128, right: Duration
1306
            Field::Duration(right_v) => {
×
1307
                let left_v_b =
×
1308
                    DozerDuration(Duration::from_nanos(left_v as u64), TimeUnit::Nanoseconds);
×
1309
                Ok(Field::Boolean(left_v_b > right_v))
×
1310
            }
1311
            // left: I128, right: Null
1312
            Field::Null => Ok(Field::Null),
×
1313
            Field::Boolean(_)
1314
            | Field::Binary(_)
1315
            | Field::Timestamp(_)
1316
            | Field::Date(_)
1317
            | Field::Json(_)
1318
            | Field::Point(_) => Err(PipelineError::InvalidTypeComparison(
×
1319
                left_p,
×
1320
                right_p,
×
1321
                ">".to_string(),
×
1322
            )),
×
1323
        },
1324
        Field::UInt(left_v) => match right_p {
1,021✔
1325
            // left: UInt, right: Int
1326
            Field::Int(right_v) => Ok(Field::Boolean((left_v as i64) > right_v)),
204✔
1327
            // left: UInt, right: I128
1328
            Field::I128(right_v) => Ok(Field::Boolean((left_v as i128) > right_v)),
×
1329
            // left: UInt, right: UInt
1330
            Field::UInt(right_v) => Ok(Field::Boolean(left_v > right_v)),
204✔
1331
            // left: UInt, right: U128
1332
            Field::U128(right_v) => Ok(Field::Boolean((left_v as u128) > right_v)),
×
1333
            // left: UInt, right: Float
1334
            Field::Float(right_v) => Ok(Field::Boolean((left_v as f64) > *right_v)),
204✔
1335
            // left: UInt, right: Decimal
1336
            Field::Decimal(right_v) => {
204✔
1337
                let left_v_d = Decimal::from_f64(left_v as f64).ok_or(
204✔
1338
                    PipelineError::UnableToCast(format!("{}", left_v), "Decimal".to_string()),
204✔
1339
                )?;
204✔
1340
                Ok(Field::Boolean(left_v_d > right_v))
204✔
1341
            }
1342
            // left: UInt, right: String or Text
1343
            Field::String(right_v) | Field::Text(right_v) => {
1✔
1344
                let right_v_b = u64::from_str(right_v.as_str()).map_err(|_| {
1✔
1345
                    PipelineError::UnableToCast(right_v.to_string(), "UInt".to_string())
×
1346
                })?;
1✔
1347
                Ok(Field::Boolean(left_v > right_v_b))
×
1348
            }
1349
            // left: UInt, right: Duration
1350
            Field::Duration(right_v) => {
×
1351
                let left_v_b = DozerDuration(Duration::from_nanos(left_v), TimeUnit::Nanoseconds);
×
1352
                Ok(Field::Boolean(left_v_b > right_v))
×
1353
            }
1354
            // left: UInt, right: Null
1355
            Field::Null => Ok(Field::Null),
204✔
1356
            Field::Boolean(_)
1357
            | Field::Binary(_)
1358
            | Field::Timestamp(_)
1359
            | Field::Date(_)
1360
            | Field::Json(_)
1361
            | Field::Point(_) => Err(PipelineError::InvalidTypeComparison(
×
1362
                left_p,
×
1363
                right_p,
×
1364
                ">".to_string(),
×
1365
            )),
×
1366
        },
1367
        Field::U128(left_v) => match right_p {
×
1368
            // left: U128, right: Int
1369
            Field::Int(right_v) => Ok(Field::Boolean((left_v as i128) > (right_v as i128))),
×
1370
            // left: U128, right: I128
1371
            Field::I128(right_v) => Ok(Field::Boolean((left_v as i128) > right_v)),
×
1372
            // left: U128, right: UInt
1373
            Field::UInt(right_v) => Ok(Field::Boolean(left_v > (right_v as u128))),
×
1374
            // left: U128, right: U128
1375
            Field::U128(right_v) => Ok(Field::Boolean(left_v > right_v)),
×
1376
            // left: U128, right: Float
1377
            Field::Float(right_v) => Ok(Field::Boolean((left_v as f64) > *right_v)),
×
1378
            // left: U128, right: Decimal
1379
            Field::Decimal(right_v) => {
×
1380
                let left_v_d = Decimal::from_f64(left_v as f64).ok_or(
×
1381
                    PipelineError::UnableToCast(format!("{}", left_v), "Decimal".to_string()),
×
1382
                )?;
×
1383
                Ok(Field::Boolean(left_v_d > right_v))
×
1384
            }
1385
            // left: U128, right: String or Text
1386
            Field::String(right_v) | Field::Text(right_v) => {
×
1387
                let right_v_b = u128::from_str(right_v.as_str()).map_err(|_| {
×
1388
                    PipelineError::UnableToCast(right_v.to_string(), "U128".to_string())
×
1389
                })?;
×
1390
                Ok(Field::Boolean(left_v > right_v_b))
×
1391
            }
1392
            // left: U128, right: Duration
1393
            Field::Duration(right_v) => {
×
1394
                let left_v_b =
×
1395
                    DozerDuration(Duration::from_nanos(left_v as u64), TimeUnit::Nanoseconds);
×
1396
                Ok(Field::Boolean(left_v_b > right_v))
×
1397
            }
1398
            // left: U128, right: Null
1399
            Field::Null => Ok(Field::Null),
×
1400
            Field::Boolean(_)
1401
            | Field::Binary(_)
1402
            | Field::Timestamp(_)
1403
            | Field::Date(_)
1404
            | Field::Json(_)
1405
            | Field::Point(_) => Err(PipelineError::InvalidTypeComparison(
×
1406
                left_p,
×
1407
                right_p,
×
1408
                ">".to_string(),
×
1409
            )),
×
1410
        },
1411
        Field::Float(left_v) => match right_p {
475✔
1412
            // left: Float, right: Float
1413
            Field::Float(right_v) => Ok(Field::Boolean(left_v > right_v)),
95✔
1414
            // left: Float, right: UInt
1415
            Field::UInt(right_v) => Ok(Field::Boolean(*left_v > right_v as f64)),
95✔
1416
            // left: Float, right: U128
1417
            Field::U128(right_v) => Ok(Field::Boolean(*left_v > right_v as f64)),
×
1418
            // left: Float, right: Int
1419
            Field::Int(right_v) => Ok(Field::Boolean(*left_v > right_v as f64)),
95✔
1420
            // left: Float, right: I128
1421
            Field::I128(right_v) => Ok(Field::Boolean(*left_v > right_v as f64)),
×
1422
            // left: Float, right: Decimal
1423
            Field::Decimal(right_v) => {
95✔
1424
                let left_v_d = Decimal::from_f64(*left_v).ok_or(PipelineError::UnableToCast(
95✔
1425
                    format!("{}", left_v),
95✔
1426
                    "Decimal".to_string(),
95✔
1427
                ))?;
95✔
1428
                Ok(Field::Boolean(left_v_d > right_v))
95✔
1429
            }
1430
            // left: Float, right: String or Text
1431
            Field::String(right_v) | Field::Text(right_v) => {
×
1432
                let right_v_b = f64::from_str(right_v.as_str()).map_err(|_| {
×
1433
                    PipelineError::UnableToCast(right_v.to_string(), "Float".to_string())
×
1434
                })?;
×
1435
                Ok(Field::Boolean(*left_v > right_v_b))
×
1436
            }
1437
            // left: Float, right: Null
1438
            Field::Null => Ok(Field::Null),
95✔
1439
            Field::Boolean(_)
1440
            | Field::Binary(_)
1441
            | Field::Timestamp(_)
1442
            | Field::Date(_)
1443
            | Field::Json(_)
1444
            | Field::Point(_)
1445
            | Field::Duration(_) => Err(PipelineError::InvalidTypeComparison(
×
1446
                left_p,
×
1447
                right_p,
×
1448
                ">".to_string(),
×
1449
            )),
×
1450
        },
1451
        Field::Decimal(left_v) => {
1,037✔
1452
            match right_p {
1,037✔
1453
                // left: Decimal, right: Float
1454
                Field::Float(right_v) => {
125✔
1455
                    let right_v_d = Decimal::from_f64(*right_v).ok_or(
125✔
1456
                        PipelineError::UnableToCast(format!("{}", right_v), "Decimal".to_string()),
125✔
1457
                    )?;
125✔
1458
                    Ok(Field::Boolean(left_v > right_v_d))
125✔
1459
                }
1460
                // left: Decimal, right: Int
1461
                Field::Int(right_v) => {
537✔
1462
                    let right_v_d = Decimal::from_i64(right_v).ok_or(
537✔
1463
                        PipelineError::UnableToCast(format!("{}", right_v), "Decimal".to_string()),
537✔
1464
                    )?;
537✔
1465
                    Ok(Field::Boolean(left_v > right_v_d))
537✔
1466
                }
1467
                // left: Decimal, right: I128
1468
                Field::I128(right_v) => {
×
1469
                    let right_v_d = Decimal::from_i128(right_v).ok_or(
×
1470
                        PipelineError::UnableToCast(format!("{}", right_v), "Decimal".to_string()),
×
1471
                    )?;
×
1472
                    Ok(Field::Boolean(left_v > right_v_d))
×
1473
                }
1474
                // left: Decimal, right: UInt
1475
                Field::UInt(right_v) => {
125✔
1476
                    let right_v_d = Decimal::from_u64(right_v).ok_or(
125✔
1477
                        PipelineError::UnableToCast(format!("{}", right_v), "Decimal".to_string()),
125✔
1478
                    )?;
125✔
1479
                    Ok(Field::Boolean(left_v > right_v_d))
125✔
1480
                }
1481
                // left: Decimal, right: U128
1482
                Field::U128(right_v) => {
×
1483
                    let right_v_d = Decimal::from_u128(right_v).ok_or(
×
1484
                        PipelineError::UnableToCast(format!("{}", right_v), "Decimal".to_string()),
×
1485
                    )?;
×
1486
                    Ok(Field::Boolean(left_v > right_v_d))
×
1487
                }
1488
                // left: Decimal, right: Decimal
1489
                Field::Decimal(right_v) => Ok(Field::Boolean(left_v > right_v)),
125✔
1490
                // left: Decimal, right: String or Text
1491
                Field::String(right_v) | Field::Text(right_v) => {
×
1492
                    let right_v_b = Decimal::from_str(right_v.as_str()).map_err(|_| {
×
1493
                        PipelineError::UnableToCast(right_v.to_string(), "Decimal".to_string())
×
1494
                    })?;
×
1495
                    Ok(Field::Boolean(left_v > right_v_b))
×
1496
                }
1497
                // left: Decimal, right: Null
1498
                Field::Null => Ok(Field::Null),
125✔
1499
                Field::Boolean(_)
1500
                | Field::Binary(_)
1501
                | Field::Timestamp(_)
1502
                | Field::Date(_)
1503
                | Field::Json(_)
1504
                | Field::Point(_)
1505
                | Field::Duration(_) => Err(PipelineError::InvalidTypeComparison(
×
1506
                    left_p,
×
1507
                    right_p,
×
1508
                    ">".to_string(),
×
1509
                )),
×
1510
            }
1511
        }
1512
        Field::String(ref left_v) | Field::Text(ref left_v) => match right_p {
×
1513
            Field::String(ref right_v) => Ok(Field::Boolean(left_v > right_v)),
×
1514
            Field::Text(ref right_v) => Ok(Field::Boolean(left_v > right_v)),
×
1515
            Field::Null => Ok(Field::Null),
×
1516
            Field::UInt(right_v) => {
×
1517
                let left_val = u64::from_str(left_v).map_err(|_| {
×
1518
                    PipelineError::UnableToCast(left_v.to_string(), "UInt".to_string())
×
1519
                })?;
×
1520
                Ok(Field::Boolean(left_val > right_v))
×
1521
            }
1522
            Field::U128(right_v) => {
×
1523
                let left_val = u128::from_str(left_v).map_err(|_| {
×
1524
                    PipelineError::UnableToCast(left_v.to_string(), "U128".to_string())
×
1525
                })?;
×
1526
                Ok(Field::Boolean(left_val > right_v))
×
1527
            }
1528
            Field::Int(right_v) => {
×
1529
                let left_val = i64::from_str(left_v).map_err(|_| {
×
1530
                    PipelineError::UnableToCast(left_v.to_string(), "Int".to_string())
×
1531
                })?;
×
1532
                Ok(Field::Boolean(left_val > right_v))
×
1533
            }
1534
            Field::I128(right_v) => {
×
1535
                let left_val = i128::from_str(left_v).map_err(|_| {
×
1536
                    PipelineError::UnableToCast(left_v.to_string(), "I128".to_string())
×
1537
                })?;
×
1538
                Ok(Field::Boolean(left_val > right_v))
×
1539
            }
1540
            Field::Float(right_v) => {
×
1541
                let left_val = f64::from_str(left_v).map_err(|_| {
×
1542
                    PipelineError::UnableToCast(left_v.to_string(), "Float".to_string())
×
1543
                })?;
×
1544
                Ok(Field::Boolean(left_val > *right_v))
×
1545
            }
1546
            Field::Boolean(right_v) => {
×
1547
                let left_val = bool::from_str(left_v).map_err(|_| {
×
1548
                    PipelineError::UnableToCast(left_v.to_string(), "Bool".to_string())
×
1549
                })?;
×
1550
                Ok(Field::Boolean(left_val & !right_v))
×
1551
            }
1552
            Field::Decimal(right_v) => {
×
1553
                let left_val = Decimal::from_str(left_v).map_err(|_| {
×
1554
                    PipelineError::UnableToCast(left_v.to_string(), "Decimal".to_string())
×
1555
                })?;
×
1556
                Ok(Field::Boolean(left_val > right_v))
×
1557
            }
1558
            Field::Timestamp(right_v) => {
×
1559
                let ts = DateTime::parse_from_rfc3339(left_v).map_err(|_| {
×
1560
                    PipelineError::UnableToCast(left_v.to_string(), "Timestamp".to_string())
×
1561
                })?;
×
1562
                Ok(Field::Boolean(ts > right_v))
×
1563
            }
1564
            Field::Date(right_v) => {
×
1565
                let date = NaiveDate::parse_from_str(left_v, DATE_FORMAT).map_err(|_| {
×
1566
                    PipelineError::UnableToCast(left_v.to_string(), "Date".to_string())
×
1567
                })?;
×
1568
                Ok(Field::Boolean(date > right_v))
×
1569
            }
1570
            Field::Point(right_v) => {
×
1571
                let left_val = DozerPoint::from_str(left_v).map_err(|_| {
×
1572
                    PipelineError::UnableToCast(left_v.to_string(), "Point".to_string())
×
1573
                })?;
×
1574
                Ok(Field::Boolean(left_val > right_v))
×
1575
            }
1576
            Field::Duration(right_v) => {
×
1577
                let left_val = DozerDuration::from_str(left_v).map_err(|_| {
×
1578
                    PipelineError::UnableToCast(left_v.to_string(), "Duration".to_string())
×
1579
                })?;
×
1580
                Ok(Field::Boolean(left_val > right_v))
×
1581
            }
1582
            Field::Binary(_) | Field::Json(_) => Err(PipelineError::InvalidTypeComparison(
×
1583
                left_p,
×
1584
                right_p,
×
1585
                ">".to_string(),
×
1586
            )),
×
1587
        },
1588
        Field::Timestamp(left_v) => match right_p {
×
1589
            Field::Timestamp(right_v) => Ok(Field::Boolean(left_v > right_v)),
×
1590
            Field::String(ref right_v) | Field::Text(ref right_v) => {
×
1591
                let ts = DateTime::parse_from_rfc3339(right_v).map_err(|_| {
×
1592
                    PipelineError::UnableToCast(right_v.to_string(), "Timestamp".to_string())
×
1593
                })?;
×
1594
                Ok(Field::Boolean(left_v > ts))
×
1595
            }
1596
            Field::Null => Ok(Field::Null),
×
1597
            Field::UInt(_)
1598
            | Field::U128(_)
1599
            | Field::Int(_)
1600
            | Field::I128(_)
1601
            | Field::Float(_)
1602
            | Field::Boolean(_)
1603
            | Field::Binary(_)
1604
            | Field::Decimal(_)
1605
            | Field::Date(_)
1606
            | Field::Json(_)
1607
            | Field::Point(_)
1608
            | Field::Duration(_) => Err(PipelineError::InvalidTypeComparison(
×
1609
                left_p,
×
1610
                right_p,
×
1611
                ">".to_string(),
×
1612
            )),
×
1613
        },
1614
        Field::Date(left_v) => match right_p {
1✔
1615
            Field::Date(right_v) => Ok(Field::Boolean(left_v > right_v)),
×
1616
            Field::String(ref right_v) | Field::Text(ref right_v) => {
1✔
1617
                let date = NaiveDate::parse_from_str(right_v, DATE_FORMAT).map_err(|_| {
1✔
1618
                    PipelineError::UnableToCast(right_v.to_string(), "Date".to_string())
×
1619
                })?;
1✔
1620
                Ok(Field::Boolean(left_v > date))
1✔
1621
            }
1622
            Field::Null => Ok(Field::Null),
×
1623
            Field::UInt(_)
1624
            | Field::U128(_)
1625
            | Field::Int(_)
1626
            | Field::I128(_)
1627
            | Field::Float(_)
1628
            | Field::Boolean(_)
1629
            | Field::Binary(_)
1630
            | Field::Decimal(_)
1631
            | Field::Timestamp(_)
1632
            | Field::Json(_)
1633
            | Field::Point(_)
1634
            | Field::Duration(_) => Err(PipelineError::InvalidTypeComparison(
×
1635
                left_p,
×
1636
                right_p,
×
1637
                ">".to_string(),
×
1638
            )),
×
1639
        },
1640
        Field::Point(left_v) => match right_p {
×
1641
            Field::Point(right_v) => Ok(Field::Boolean(left_v > right_v)),
×
1642
            Field::String(right_v) | Field::Text(right_v) => {
×
1643
                let right_val = DozerPoint::from_str(right_v.as_str()).map_err(|_| {
×
1644
                    PipelineError::UnableToCast(right_v.to_string(), "Point".to_string())
×
1645
                })?;
×
1646
                Ok(Field::Boolean(left_v > right_val))
×
1647
            }
1648
            Field::Null => Ok(Field::Null),
×
1649
            Field::UInt(_)
1650
            | Field::U128(_)
1651
            | Field::Int(_)
1652
            | Field::I128(_)
1653
            | Field::Float(_)
1654
            | Field::Boolean(_)
1655
            | Field::Binary(_)
1656
            | Field::Decimal(_)
1657
            | Field::Timestamp(_)
1658
            | Field::Json(_)
1659
            | Field::Date(_)
1660
            | Field::Duration(_) => Err(PipelineError::InvalidTypeComparison(
×
1661
                left_p,
×
1662
                right_p,
×
1663
                ">".to_string(),
×
1664
            )),
×
1665
        },
1666
        Field::Duration(left_v) => match right_p {
×
1667
            Field::Duration(right_v) => Ok(Field::Boolean(left_v > right_v)),
×
1668
            Field::String(right_v) | Field::Text(right_v) => {
×
1669
                let right_val = DozerDuration::from_str(right_v.as_str()).map_err(|_| {
×
1670
                    PipelineError::UnableToCast(right_v.to_string(), "Duration".to_string())
×
1671
                })?;
×
1672
                Ok(Field::Boolean(left_v > right_val))
×
1673
            }
1674
            Field::Null => Ok(Field::Null),
×
1675
            Field::UInt(_)
1676
            | Field::U128(_)
1677
            | Field::Int(_)
1678
            | Field::I128(_)
1679
            | Field::Float(_)
1680
            | Field::Boolean(_)
1681
            | Field::Binary(_)
1682
            | Field::Decimal(_)
1683
            | Field::Timestamp(_)
1684
            | Field::Json(_)
1685
            | Field::Date(_)
1686
            | Field::Point(_) => Err(PipelineError::InvalidTypeComparison(
×
1687
                left_p,
×
1688
                right_p,
×
1689
                ">".to_string(),
×
1690
            )),
×
1691
        },
1692
        Field::Binary(_) | Field::Json(_) => Err(PipelineError::InvalidTypeComparison(
×
1693
            left_p,
×
1694
            right_p,
×
1695
            ">".to_string(),
×
1696
        )),
×
1697
    }
1698
}
5,410✔
1699

1700
define_comparison!(evaluate_eq, "=", |l, r| { l == r });
17,678✔
1701
define_comparison!(evaluate_ne, "!=", |l, r| { l != r });
13,261✔
1702
define_comparison!(evaluate_lte, "<=", |l, r| { l <= r });
3,818✔
1703
define_comparison!(evaluate_gte, ">=", |l, r| { l >= r });
14,277✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc