vortex_array/
expression.rs1use itertools::Itertools;
5use vortex_error::VortexResult;
6
7use crate::ArrayRef;
8use crate::IntoArray;
9use crate::arrays::ConstantArray;
10use crate::arrays::ScalarFnArray;
11use crate::expr::Expression;
12use crate::optimizer::ArrayOptimizer;
13use crate::scalar_fn::fns::literal::Literal;
14use crate::scalar_fn::fns::root::Root;
15
16impl ArrayRef {
17 pub fn apply(self, expr: &Expression) -> VortexResult<ArrayRef> {
19 if expr.is::<Root>() {
21 return Ok(self);
22 }
23
24 if let Some(scalar) = expr.as_opt::<Literal>() {
26 return Ok(ConstantArray::new(scalar.clone(), self.len()).into_array());
27 }
28
29 let children: Vec<_> = expr
31 .children()
32 .iter()
33 .map(|e| self.clone().apply(e))
34 .try_collect()?;
35
36 let array =
38 ScalarFnArray::try_new(expr.scalar_fn().clone(), children, self.len())?.into_array();
39
40 array.optimize()
42 }
43}