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, FilterFn, IsConstantFn, IsConstantOpts, MinMaxFn, MinMaxResult, ScalarAtFn,
12 SliceFn, SumFn, TakeFn, ToArrowFn, UncompressedSizeFn, filter, is_constant_opts, min_max,
13 scalar_at, slice, sum, take, uncompressed_size,
14};
15use crate::variants::ExtensionArrayTrait;
16use crate::vtable::ComputeVTable;
17use crate::{Array, ArrayRef};
18
19impl ComputeVTable for ExtensionEncoding {
20 fn cast_fn(&self) -> Option<&dyn CastFn<&dyn Array>> {
21 None
25 }
26
27 fn compare_fn(&self) -> Option<&dyn CompareFn<&dyn Array>> {
28 Some(self)
29 }
30
31 fn filter_fn(&self) -> Option<&dyn FilterFn<&dyn Array>> {
32 Some(self)
33 }
34
35 fn is_constant_fn(&self) -> Option<&dyn IsConstantFn<&dyn Array>> {
36 Some(self)
37 }
38
39 fn scalar_at_fn(&self) -> Option<&dyn ScalarAtFn<&dyn Array>> {
40 Some(self)
41 }
42
43 fn slice_fn(&self) -> Option<&dyn SliceFn<&dyn Array>> {
44 Some(self)
45 }
46
47 fn sum_fn(&self) -> Option<&dyn SumFn<&dyn Array>> {
48 Some(self)
49 }
50
51 fn take_fn(&self) -> Option<&dyn TakeFn<&dyn Array>> {
52 Some(self)
53 }
54
55 fn to_arrow_fn(&self) -> Option<&dyn ToArrowFn<&dyn Array>> {
56 Some(self)
57 }
58
59 fn min_max_fn(&self) -> Option<&dyn MinMaxFn<&dyn Array>> {
60 Some(self)
61 }
62
63 fn uncompressed_size_fn(&self) -> Option<&dyn UncompressedSizeFn<&dyn Array>> {
64 Some(self)
65 }
66}
67
68impl FilterFn<&ExtensionArray> for ExtensionEncoding {
69 fn filter(&self, array: &ExtensionArray, mask: &Mask) -> VortexResult<ArrayRef> {
70 Ok(
71 ExtensionArray::new(array.ext_dtype().clone(), filter(array.storage(), mask)?)
72 .into_array(),
73 )
74 }
75}
76
77impl ScalarAtFn<&ExtensionArray> for ExtensionEncoding {
78 fn scalar_at(&self, array: &ExtensionArray, index: usize) -> VortexResult<Scalar> {
79 Ok(Scalar::extension(
80 array.ext_dtype().clone(),
81 scalar_at(array.storage(), index)?,
82 ))
83 }
84}
85
86impl SliceFn<&ExtensionArray> for ExtensionEncoding {
87 fn slice(&self, array: &ExtensionArray, start: usize, stop: usize) -> VortexResult<ArrayRef> {
88 Ok(ExtensionArray::new(
89 array.ext_dtype().clone(),
90 slice(array.storage(), start, stop)?,
91 )
92 .into_array())
93 }
94}
95
96impl SumFn<&ExtensionArray> for ExtensionEncoding {
97 fn sum(&self, array: &ExtensionArray) -> VortexResult<Scalar> {
98 sum(array.storage())
99 }
100}
101
102impl TakeFn<&ExtensionArray> for ExtensionEncoding {
103 fn take(&self, array: &ExtensionArray, indices: &dyn Array) -> VortexResult<ArrayRef> {
104 Ok(
105 ExtensionArray::new(array.ext_dtype().clone(), take(array.storage(), indices)?)
106 .into_array(),
107 )
108 }
109}
110
111impl MinMaxFn<&ExtensionArray> for ExtensionEncoding {
112 fn min_max(&self, array: &ExtensionArray) -> VortexResult<Option<MinMaxResult>> {
113 Ok(
114 min_max(array.storage())?.map(|MinMaxResult { min, max }| MinMaxResult {
115 min: Scalar::extension(array.ext_dtype().clone(), min),
116 max: Scalar::extension(array.ext_dtype().clone(), max),
117 }),
118 )
119 }
120}
121
122impl IsConstantFn<&ExtensionArray> for ExtensionEncoding {
123 fn is_constant(
124 &self,
125 array: &ExtensionArray,
126 opts: &IsConstantOpts,
127 ) -> VortexResult<Option<bool>> {
128 is_constant_opts(array.storage(), opts).map(Some)
129 }
130}
131
132impl UncompressedSizeFn<&ExtensionArray> for ExtensionEncoding {
133 fn uncompressed_size(&self, array: &ExtensionArray) -> VortexResult<usize> {
134 uncompressed_size(array.storage())
135 }
136}