vortex_expr/transform/
simplify.rs1use vortex_error::VortexResult;
5
6use crate::transform::match_between::find_between;
7use crate::traversal::{NodeExt, Transformed};
9use crate::{ExprRef, GetItemVTable, PackVTable};
10
11pub fn simplify(e: ExprRef) -> VortexResult<ExprRef> {
15 let e = e
16 .transform_up(simplify_transformer)
17 .map(|e| e.into_inner())?;
18 Ok(find_between(e.clone()))
19}
20
21fn simplify_transformer(node: ExprRef) -> VortexResult<Transformed<ExprRef>> {
22 if let Some(get_item) = node.as_opt::<GetItemVTable>()
24 && let Some(pack) = get_item.child().as_opt::<PackVTable>()
25 {
26 let expr = pack.field(get_item.field())?;
27 return Ok(Transformed::yes(expr));
28 }
29 Ok(Transformed::no(node))
30}
31
32#[cfg(test)]
33mod tests {
34 use vortex_dtype::Nullability::NonNullable;
35
36 use crate::transform::simplify::simplify;
37 use crate::{get_item, lit, pack};
38
39 #[test]
40 fn test_simplify() {
41 let e = get_item("b", pack([("a", lit(1)), ("b", lit(2))], NonNullable));
42 let e = simplify(e).unwrap();
43 assert_eq!(&e, &lit(2));
44 }
45}