vortex_expr/transform/
simplify.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use vortex_error::VortexResult;
5
6use crate::transform::match_between::find_between;
7// use crate::transform::match_between::find_between;
8use crate::traversal::{NodeExt, Transformed};
9use crate::{ExprRef, GetItemVTable, PackVTable};
10
11/// Simplifies an expression into an equivalent expression which is faster and easier to analyze.
12///
13/// If the scope dtype is known, see `simplify_typed` for a simplifier which uses dtype.
14pub 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    // pack(l_1: e_1, ..., l_i: e_i, ..., l_n: e_n).get_item(l_i) = e_i where 0 <= i <= n
23    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}