vortex_array/expr/analysis/
fallible.rs1use crate::expr::Expression;
5use crate::expr::analysis::BooleanLabels;
6use crate::expr::label_tree;
7
8pub fn label_is_fallible(expr: &Expression) -> BooleanLabels<'_> {
9 label_tree(expr, |expr| expr.is_fallible(), |acc, &child| acc | child)
10}
11
12#[cfg(test)]
13mod tests {
14 use super::*;
15 use crate::expr::exprs::binary::checked_add;
16 use crate::expr::exprs::binary::eq;
17 use crate::expr::exprs::get_item::col;
18 use crate::expr::exprs::is_null::is_null;
19 use crate::expr::exprs::literal::lit;
20 use crate::expr::exprs::merge::DuplicateHandling;
21 use crate::expr::exprs::merge::merge_opts;
22 use crate::expr::exprs::not::not;
23
24 #[test]
25 fn not_is_not_fallible() {
26 let expr = not(col("x"));
27 let labels = label_is_fallible(&expr);
28 assert_eq!(labels.get(&expr), Some(&false));
29 }
30
31 #[test]
32 fn checked_add_defaults_to_fallible() {
33 let expr = checked_add(col("a"), col("b"));
34 let labels = label_is_fallible(&expr);
35 assert_eq!(labels.get(&expr), Some(&true));
36 }
37
38 #[test]
39 fn eq_not_fallible() {
40 let expr = eq(col("a"), lit(5));
41 let labels = label_is_fallible(&expr);
42 assert_eq!(labels.get(&expr), Some(&false));
43 }
44
45 #[test]
46 fn merge_with_error_handling_is_fallible() {
47 let expr = merge_opts([col("a"), col("b")], DuplicateHandling::Error);
48 let labels = label_is_fallible(&expr);
49 assert_eq!(labels.get(&expr), Some(&true));
50 }
51
52 #[test]
53 fn merge_with_rightmost_handling_is_not_fallible() {
54 let expr = merge_opts([col("a"), col("b")], DuplicateHandling::RightMost);
55 let labels = label_is_fallible(&expr);
56 assert_eq!(labels.get(&expr), Some(&false));
57 }
58
59 #[test]
60 fn nested_with_fallible_child() {
61 let child = checked_add(col("a"), col("b"));
62 let expr = not(child.clone());
63 let labels = label_is_fallible(&expr);
64 assert_eq!(labels.get(&child), Some(&true));
65 assert_eq!(labels.get(&expr), Some(&true));
66 }
67
68 #[test]
69 fn nested_without_fallible_child() {
70 let child = is_null(col("x"));
71 let expr = not(child.clone());
72 let labels = label_is_fallible(&expr);
73 assert_eq!(labels.get(&child), Some(&false));
74 assert_eq!(labels.get(&expr), Some(&false));
75 }
76}