vortex_array/expr/analysis/
fallible.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use 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}