vortex_array/compute/
optimize.rs

1use vortex_error::{VortexExpect, VortexResult};
2
3use crate::arrays::ConstantArray;
4use crate::{Array, ArrayRef, Encoding};
5
6pub trait OptimizeFn<A> {
7    fn optimize(&self, array: A) -> VortexResult<ArrayRef>;
8}
9
10impl<E: Encoding> OptimizeFn<&dyn Array> for E
11where
12    E: for<'a> OptimizeFn<&'a E::Array>,
13{
14    fn optimize(&self, array: &dyn Array) -> VortexResult<ArrayRef> {
15        let array_ref = array
16            .as_any()
17            .downcast_ref::<E::Array>()
18            .vortex_expect("Failed to downcast array");
19        OptimizeFn::optimize(self, array_ref)
20    }
21}
22
23pub fn optimize(array: &dyn Array) -> VortexResult<ArrayRef> {
24    if let Some(v) = array.as_constant() {
25        return Ok(ConstantArray::new(v, array.len()).into_array());
26    }
27
28    if let Some(optimize_fn) = array.vtable().optimize_fn() {
29        optimize_fn.optimize(array)
30    } else {
31        log::debug!("No optimize implementation found for {}", array.encoding());
32        Ok(array.to_array())
33    }
34}