vortex_array/arrays/scalar_fn/vtable/
canonical.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use 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}