use vortex_error::VortexResult;
use crate::transform::match_between::find_between;
use crate::traversal::{NodeExt, Transformed};
use crate::{ExprRef, GetItemVTable, PackVTable};
pub fn simplify(e: ExprRef) -> VortexResult<ExprRef> {
let e = e
.transform_up(simplify_transformer)
.map(|e| e.into_inner())?;
Ok(find_between(e.clone()))
}
fn simplify_transformer(node: ExprRef) -> VortexResult<Transformed<ExprRef>> {
if let Some(get_item) = node.as_opt::<GetItemVTable>()
&& let Some(pack) = get_item.child().as_opt::<PackVTable>()
{
let expr = pack.field(get_item.field())?;
return Ok(Transformed::yes(expr));
}
Ok(Transformed::no(node))
}
#[cfg(test)]
mod tests {
use vortex_dtype::Nullability::NonNullable;
use crate::transform::simplify::simplify;
use crate::{get_item, lit, pack};
#[test]
fn test_simplify() {
let e = get_item("b", pack([("a", lit(1)), ("b", lit(2))], NonNullable));
let e = simplify(e).unwrap();
assert_eq!(&e, &lit(2));
}
}