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