vortex_array/array/
mod.rs1mod canonical;
2mod convert;
3mod implementation;
4mod statistics;
5mod validity;
6mod variants;
7mod visitor;
8
9use std::any::{Any, type_name};
10use std::fmt::{Debug, Display, Formatter};
11use std::sync::Arc;
12
13pub use canonical::*;
14pub use convert::*;
15pub use implementation::*;
16pub use statistics::*;
17pub use validity::*;
18pub use variants::*;
19pub use visitor::*;
20use vortex_dtype::DType;
21use vortex_error::{VortexExpect, VortexResult, vortex_err};
22use vortex_mask::Mask;
23
24use crate::arrays::{
25 BoolEncoding, ExtensionEncoding, ListEncoding, NullEncoding, PrimitiveEncoding, StructEncoding,
26 VarBinEncoding, VarBinViewEncoding,
27};
28use crate::builders::ArrayBuilder;
29use crate::stats::StatsSetRef;
30use crate::vtable::{EncodingVTable, VTableRef};
31use crate::{Canonical, EncodingId};
32
33pub trait Array: Send + Sync + Debug + ArrayStatistics + ArrayVariants + ArrayVisitor {
39 fn as_any(&self) -> &dyn Any;
41
42 fn as_any_arc(self: Arc<Self>) -> Arc<dyn Any + Send + Sync>;
44
45 fn to_array(&self) -> ArrayRef;
47
48 fn into_array(self) -> ArrayRef
50 where
51 Self: Sized;
52
53 fn len(&self) -> usize;
55
56 fn is_empty(&self) -> bool {
58 self.len() == 0
59 }
60
61 fn dtype(&self) -> &DType;
63
64 fn encoding(&self) -> EncodingId;
66
67 fn vtable(&self) -> VTableRef;
69
70 fn is_encoding(&self, encoding: EncodingId) -> bool {
72 self.encoding() == encoding
73 }
74
75 fn is_arrow(&self) -> bool {
78 self.is_encoding(NullEncoding.id())
79 || self.is_encoding(BoolEncoding.id())
80 || self.is_encoding(PrimitiveEncoding.id())
81 || self.is_encoding(VarBinEncoding.id())
82 || self.is_encoding(VarBinViewEncoding.id())
83 }
84
85 fn is_canonical(&self) -> bool {
88 self.is_encoding(NullEncoding.id())
89 || self.is_encoding(BoolEncoding.id())
90 || self.is_encoding(PrimitiveEncoding.id())
91 || self.is_encoding(StructEncoding.id())
92 || self.is_encoding(ListEncoding.id())
93 || self.is_encoding(VarBinViewEncoding.id())
94 || self.is_encoding(ExtensionEncoding.id())
95 }
96
97 fn is_valid(&self, index: usize) -> VortexResult<bool>;
99
100 fn is_invalid(&self, index: usize) -> VortexResult<bool>;
102
103 fn all_valid(&self) -> VortexResult<bool>;
107
108 fn all_invalid(&self) -> VortexResult<bool>;
112
113 fn valid_count(&self) -> VortexResult<usize>;
115
116 fn invalid_count(&self) -> VortexResult<usize>;
118
119 fn validity_mask(&self) -> VortexResult<Mask>;
121
122 fn to_canonical(&self) -> VortexResult<Canonical>;
124
125 fn append_to_builder(&self, builder: &mut dyn ArrayBuilder) -> VortexResult<()>;
129
130 fn statistics(&self) -> StatsSetRef<'_>;
133}
134
135impl Array for Arc<dyn Array> {
136 fn as_any(&self) -> &dyn Any {
137 self.as_ref().as_any()
138 }
139
140 fn as_any_arc(self: Arc<Self>) -> Arc<dyn Any + Send + Sync> {
141 self
142 }
143
144 fn to_array(&self) -> ArrayRef {
145 self.clone()
146 }
147
148 fn into_array(self) -> ArrayRef {
149 self
150 }
151
152 fn len(&self) -> usize {
153 self.as_ref().len()
154 }
155
156 fn dtype(&self) -> &DType {
157 self.as_ref().dtype()
158 }
159
160 fn encoding(&self) -> EncodingId {
161 self.as_ref().encoding()
162 }
163
164 fn vtable(&self) -> VTableRef {
165 self.as_ref().vtable()
166 }
167
168 fn is_valid(&self, index: usize) -> VortexResult<bool> {
169 self.as_ref().is_valid(index)
170 }
171
172 fn is_invalid(&self, index: usize) -> VortexResult<bool> {
173 self.as_ref().is_invalid(index)
174 }
175
176 fn all_valid(&self) -> VortexResult<bool> {
177 self.as_ref().all_valid()
178 }
179
180 fn all_invalid(&self) -> VortexResult<bool> {
181 self.as_ref().all_invalid()
182 }
183
184 fn valid_count(&self) -> VortexResult<usize> {
185 self.as_ref().valid_count()
186 }
187
188 fn invalid_count(&self) -> VortexResult<usize> {
189 self.as_ref().invalid_count()
190 }
191
192 fn validity_mask(&self) -> VortexResult<Mask> {
193 self.as_ref().validity_mask()
194 }
195
196 fn to_canonical(&self) -> VortexResult<Canonical> {
197 self.as_ref().to_canonical()
198 }
199
200 fn append_to_builder(&self, builder: &mut dyn ArrayBuilder) -> VortexResult<()> {
201 self.as_ref().append_to_builder(builder)
202 }
203
204 fn statistics(&self) -> StatsSetRef<'_> {
205 self.as_ref().statistics()
206 }
207}
208
209pub type ArrayRef = Arc<dyn Array>;
211
212impl ToOwned for dyn Array {
213 type Owned = ArrayRef;
214
215 fn to_owned(&self) -> Self::Owned {
216 self.to_array()
217 }
218}
219
220impl<A: Array + Clone + 'static> TryFromArrayRef for A {
221 fn try_from_array(array: ArrayRef) -> VortexResult<Self> {
222 Ok(Arc::unwrap_or_clone(
223 array
224 .as_any_arc()
225 .downcast::<A>()
226 .map_err(|_| vortex_err!("Cannot downcast to {}", type_name::<A>()))?,
227 ))
228 }
229}
230
231impl<A: Array + Clone + 'static> TryFromArrayRef for Arc<A> {
232 fn try_from_array(array: ArrayRef) -> VortexResult<Self> {
233 array
234 .as_any_arc()
235 .downcast::<A>()
236 .map_err(|_| vortex_err!("Cannot downcast to {}", type_name::<A>()))
237 }
238}
239
240pub trait ArrayExt: Array {
241 fn as_<A: Array + 'static>(&self) -> &A {
243 self.as_any()
244 .downcast_ref::<A>()
245 .vortex_expect("Failed to downcast")
246 }
247
248 fn as_opt<A: Array + 'static>(&self) -> Option<&A> {
250 self.as_any().downcast_ref::<A>()
251 }
252}
253
254impl<A: Array + ?Sized> ArrayExt for A {}
255
256impl Display for dyn Array {
257 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
258 write!(
259 f,
260 "{}({}, len={})",
261 self.encoding(),
262 self.dtype(),
263 self.len()
264 )
265 }
266}
267
268#[macro_export]
269macro_rules! try_from_array_ref {
270 ($Array:ty) => {
271 impl TryFrom<$crate::ArrayRef> for $Array {
272 type Error = vortex_error::VortexError;
273
274 fn try_from(value: $crate::ArrayRef) -> Result<Self, Self::Error> {
275 Ok(::std::sync::Arc::unwrap_or_clone(
276 value.as_any_arc().downcast::<Self>().map_err(|_| {
277 vortex_error::vortex_err!(
278 "Cannot downcast to {}",
279 std::any::type_name::<Self>()
280 )
281 })?,
282 ))
283 }
284 }
285 };
286}