vortex_array/compute/
optimize.rs1use 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}