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

getdozer / dozer / 5965835627

24 Aug 2023 03:33PM UTC coverage: 75.462% (-0.2%) from 75.617%
5965835627

push

github

web-flow
chore: Update for Rust 1.72.0 (#1911)

Rust 1.72.0 has introduced a bunch of new lints. Here we fix them all.

`let ... else` finally gets formatted.

37 of 37 new or added lines in 8 files covered. (100.0%)

46984 of 62262 relevant lines covered (75.46%)

48124.47 hits per line

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

23.28
/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::Record;
5
use dozer_types::types::{DozerDuration, DozerPoint, Field, Schema, TimeUnit};
6
use num_traits::cast::*;
7
use std::str::FromStr;
8
use std::time::Duration;
9

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

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

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

628
use crate::pipeline::expression::execution::Expression;
629

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

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

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

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

1701
fn eq<T: PartialEq>(left: T, right: T) -> bool {
18,143✔
1702
    left == right
18,143✔
1703
}
18,143✔
1704

×
1705
fn ne<T: PartialEq>(left: T, right: T) -> bool {
13,417✔
1706
    left != right
13,417✔
1707
}
13,417✔
1708

1709
fn le<T: PartialOrd>(left: T, right: T) -> bool {
3,801✔
1710
    left <= right
3,801✔
1711
}
3,801✔
1712

1713
fn ge<T: PartialOrd>(left: T, right: T) -> bool {
14,601✔
1714
    left >= right
14,601✔
1715
}
14,601✔
1716

1717
define_comparison!(evaluate_eq, "=", eq);
×
1718
define_comparison!(evaluate_ne, "!=", ne);
×
1719
define_comparison!(evaluate_lte, "<=", le);
×
1720
define_comparison!(evaluate_gte, ">=", ge);
×
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