vortex_array/arrays/scalar_fn/vtable/
canonical.rs1use vortex_error::VortexExpect;
5
6use crate::Array;
7use crate::Canonical;
8use crate::LEGACY_SESSION;
9use crate::arrays::scalar_fn::array::ScalarFnArray;
10use crate::arrays::scalar_fn::vtable::ScalarFnVTable;
11use crate::executor::VectorExecutor;
12use crate::expr::ExecutionArgs;
13use crate::vectors::VectorIntoArray;
14use crate::vtable::CanonicalVTable;
15
16impl CanonicalVTable<ScalarFnVTable> for ScalarFnVTable {
17 fn canonicalize(array: &ScalarFnArray) -> Canonical {
18 let child_dtypes: Vec<_> = array.children.iter().map(|c| c.dtype().clone()).collect();
19
20 let mut child_datums = Vec::with_capacity(array.children.len());
21 for child in array.children.iter() {
22 let datum = child.execute_datum(&LEGACY_SESSION).vortex_expect(
23 "Failed to execute child array during canonicalization of ScalarFnArray",
24 );
25 child_datums.push(datum);
26 }
27
28 let ctx = ExecutionArgs {
29 datums: child_datums,
30 dtypes: child_dtypes,
31 row_count: array.len,
32 return_dtype: array.dtype.clone(),
33 };
34
35 let len = array.len;
36 let result_vector = array
37 .scalar_fn
38 .execute(ctx)
39 .vortex_expect("Canonicalize should be fallible")
40 .unwrap_into_vector(len);
41
42 result_vector.into_array(&array.dtype).to_canonical()
43 }
44}