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(
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}