use vortex_utils::aliases::hash_map::HashMap;
use super::labeling::label_tree;
use crate::expr::Expression;
pub type BooleanLabels<'a> = HashMap<&'a Expression, bool>;
pub fn label_null_sensitive(expr: &Expression) -> BooleanLabels<'_> {
label_tree(
expr,
|expr| expr.signature().is_null_sensitive(),
|acc, &child| acc | child,
)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::expr::col;
use crate::expr::eq;
use crate::expr::is_null;
use crate::expr::lit;
#[test]
fn test_null_sensitive_with_is_null() {
let expr = is_null(col("col1"));
let labels = label_null_sensitive(&expr);
assert_eq!(labels.get(&expr), Some(&true));
}
#[test]
fn test_null_sensitive_without_is_null() {
let expr = eq(col("col1"), lit(5));
let labels = label_null_sensitive(&expr);
assert_eq!(labels.get(&expr), Some(&true));
}
#[test]
fn test_null_sensitive_nested() {
let left = eq(col("col1"), lit(5));
let right = is_null(col("col2"));
let expr = eq(left.clone(), right.clone());
let labels = label_null_sensitive(&expr);
assert_eq!(labels.get(&left), Some(&true));
assert_eq!(labels.get(&right), Some(&true));
assert_eq!(labels.get(&expr), Some(&true));
}
}