vortex_array/arrays/extension/compute/
mod.rs1mod compare;
2mod to_arrow;
3
4use vortex_error::VortexResult;
5use vortex_mask::Mask;
6use vortex_scalar::Scalar;
7
8use crate::arrays::ExtensionEncoding;
9use crate::arrays::extension::ExtensionArray;
10use crate::compute::{
11 CastFn, CompareFn, FilterKernel, FilterKernelAdapter, IsConstantFn, IsConstantOpts, IsSortedFn,
12 KernelRef, MinMaxFn, MinMaxResult, ScalarAtFn, SliceFn, SumFn, TakeFn, ToArrowFn,
13 UncompressedSizeFn, filter, is_constant_opts, is_sorted, is_strict_sorted, min_max, scalar_at,
14 slice, sum, take, uncompressed_size,
15};
16use crate::variants::ExtensionArrayTrait;
17use crate::vtable::ComputeVTable;
18use crate::{Array, ArrayComputeImpl, ArrayRef};
19
20impl ArrayComputeImpl for ExtensionArray {
21 const FILTER: Option<KernelRef> = FilterKernelAdapter(ExtensionEncoding).some();
22}
23
24impl ComputeVTable for ExtensionEncoding {
25 fn cast_fn(&self) -> Option<&dyn CastFn<&dyn Array>> {
26 None
30 }
31
32 fn compare_fn(&self) -> Option<&dyn CompareFn<&dyn Array>> {
33 Some(self)
34 }
35
36 fn is_constant_fn(&self) -> Option<&dyn IsConstantFn<&dyn Array>> {
37 Some(self)
38 }
39
40 fn is_sorted_fn(&self) -> Option<&dyn IsSortedFn<&dyn Array>> {
41 Some(self)
42 }
43
44 fn scalar_at_fn(&self) -> Option<&dyn ScalarAtFn<&dyn Array>> {
45 Some(self)
46 }
47
48 fn slice_fn(&self) -> Option<&dyn SliceFn<&dyn Array>> {
49 Some(self)
50 }
51
52 fn sum_fn(&self) -> Option<&dyn SumFn<&dyn Array>> {
53 Some(self)
54 }
55
56 fn take_fn(&self) -> Option<&dyn TakeFn<&dyn Array>> {
57 Some(self)
58 }
59
60 fn to_arrow_fn(&self) -> Option<&dyn ToArrowFn<&dyn Array>> {
61 Some(self)
62 }
63
64 fn min_max_fn(&self) -> Option<&dyn MinMaxFn<&dyn Array>> {
65 Some(self)
66 }
67
68 fn uncompressed_size_fn(&self) -> Option<&dyn UncompressedSizeFn<&dyn Array>> {
69 Some(self)
70 }
71}
72
73impl FilterKernel for ExtensionEncoding {
74 fn filter(&self, array: &ExtensionArray, mask: &Mask) -> VortexResult<ArrayRef> {
75 Ok(
76 ExtensionArray::new(array.ext_dtype().clone(), filter(array.storage(), mask)?)
77 .into_array(),
78 )
79 }
80}
81
82impl ScalarAtFn<&ExtensionArray> for ExtensionEncoding {
83 fn scalar_at(&self, array: &ExtensionArray, index: usize) -> VortexResult<Scalar> {
84 Ok(Scalar::extension(
85 array.ext_dtype().clone(),
86 scalar_at(array.storage(), index)?,
87 ))
88 }
89}
90
91impl SliceFn<&ExtensionArray> for ExtensionEncoding {
92 fn slice(&self, array: &ExtensionArray, start: usize, stop: usize) -> VortexResult<ArrayRef> {
93 Ok(ExtensionArray::new(
94 array.ext_dtype().clone(),
95 slice(array.storage(), start, stop)?,
96 )
97 .into_array())
98 }
99}
100
101impl SumFn<&ExtensionArray> for ExtensionEncoding {
102 fn sum(&self, array: &ExtensionArray) -> VortexResult<Scalar> {
103 sum(array.storage())
104 }
105}
106
107impl TakeFn<&ExtensionArray> for ExtensionEncoding {
108 fn take(&self, array: &ExtensionArray, indices: &dyn Array) -> VortexResult<ArrayRef> {
109 Ok(
110 ExtensionArray::new(array.ext_dtype().clone(), take(array.storage(), indices)?)
111 .into_array(),
112 )
113 }
114}
115
116impl MinMaxFn<&ExtensionArray> for ExtensionEncoding {
117 fn min_max(&self, array: &ExtensionArray) -> VortexResult<Option<MinMaxResult>> {
118 Ok(
119 min_max(array.storage())?.map(|MinMaxResult { min, max }| MinMaxResult {
120 min: Scalar::extension(array.ext_dtype().clone(), min),
121 max: Scalar::extension(array.ext_dtype().clone(), max),
122 }),
123 )
124 }
125}
126
127impl IsConstantFn<&ExtensionArray> for ExtensionEncoding {
128 fn is_constant(
129 &self,
130 array: &ExtensionArray,
131 opts: &IsConstantOpts,
132 ) -> VortexResult<Option<bool>> {
133 is_constant_opts(array.storage(), opts).map(Some)
134 }
135}
136
137impl UncompressedSizeFn<&ExtensionArray> for ExtensionEncoding {
138 fn uncompressed_size(&self, array: &ExtensionArray) -> VortexResult<usize> {
139 uncompressed_size(array.storage())
140 }
141}
142
143impl IsSortedFn<&ExtensionArray> for ExtensionEncoding {
144 fn is_sorted(&self, array: &ExtensionArray) -> VortexResult<bool> {
145 is_sorted(array.storage())
146 }
147
148 fn is_strict_sorted(&self, array: &ExtensionArray) -> VortexResult<bool> {
149 is_strict_sorted(array.storage())
150 }
151}