1use std::fmt::Debug;
7use std::ops::BitAnd;
8use std::ops::RangeBounds;
9use std::sync::Arc;
10use vortex_error::VortexExpect;
11use vortex_error::VortexResult;
12use vortex_error::vortex_ensure;
13use vortex_mask::Mask;
14
15use crate::Vector;
16use crate::VectorMutOps;
17use crate::VectorOps;
18use crate::struct_::StructScalar;
19use crate::struct_::StructVectorMut;
20
21#[derive(Debug, Clone)]
26pub struct StructVector {
27 pub(super) fields: Arc<Box<[Vector]>>,
36
37 pub(super) validity: Mask,
39
40 pub(super) len: usize,
44}
45
46impl PartialEq for StructVector {
47 fn eq(&self, other: &Self) -> bool {
48 if self.len != other.len {
49 return false;
50 }
51 if self.fields.len() != other.fields.len() {
53 return false;
54 }
55 if self.validity != other.validity {
57 return false;
58 }
59 let combined_mask = self.validity.bitand(&other.validity);
62
63 for (self_field, other_field) in self.fields.iter().zip(other.fields.iter()) {
65 let mut self_field_masked = self_field.clone();
66 let mut other_field_masked = other_field.clone();
67 self_field_masked.mask_validity(&combined_mask);
68 other_field_masked.mask_validity(&combined_mask);
69
70 if self_field_masked != other_field_masked {
71 return false;
72 }
73 }
74 true
75 }
76}
77
78impl StructVector {
79 pub fn new(fields: Arc<Box<[Vector]>>, validity: Mask) -> Self {
91 Self::try_new(fields, validity).vortex_expect("Failed to create `StructVector`")
92 }
93
94 pub fn try_new(fields: Arc<Box<[Vector]>>, validity: Mask) -> VortexResult<Self> {
106 let len = validity.len();
107
108 for (i, field) in fields.iter().enumerate() {
110 vortex_ensure!(
111 field.len() == len,
112 "Field {} has length {} but expected length {}",
113 i,
114 field.len(),
115 len
116 );
117 }
118
119 Ok(Self {
120 fields,
121 validity,
122 len,
123 })
124 }
125
126 pub unsafe fn new_unchecked(fields: Arc<Box<[Vector]>>, validity: Mask) -> Self {
138 let len = validity.len();
139
140 if cfg!(debug_assertions) {
141 Self::new(fields, validity)
142 } else {
143 Self {
144 fields,
145 validity,
146 len,
147 }
148 }
149 }
150
151 pub fn into_parts(self) -> (Arc<Box<[Vector]>>, Mask) {
153 (self.fields, self.validity)
154 }
155
156 pub fn fields(&self) -> &Arc<Box<[Vector]>> {
158 &self.fields
159 }
160}
161
162impl Eq for StructVector {}
163
164impl VectorOps for StructVector {
165 type Mutable = StructVectorMut;
166 type Scalar = StructScalar;
167
168 fn len(&self) -> usize {
169 self.len
170 }
171
172 fn validity(&self) -> &Mask {
173 &self.validity
174 }
175
176 fn mask_validity(&mut self, mask: &Mask) {
177 self.validity = self.validity.bitand(mask);
178 }
179
180 fn scalar_at(&self, index: usize) -> StructScalar {
181 assert!(index < self.len());
182 StructScalar::new(self.slice(index..index + 1))
183 }
184
185 fn slice(&self, range: impl RangeBounds<usize> + Clone + Debug) -> Self {
186 let sliced_fields: Box<[_]> = self
187 .fields
188 .iter()
189 .map(|field| field.slice(range.clone()))
190 .collect();
191
192 let sliced_validity = self.validity.slice(range);
193 let len = sliced_validity.len();
194
195 StructVector {
196 fields: Arc::new(sliced_fields),
197 validity: sliced_validity,
198 len,
199 }
200 }
201
202 fn clear(&mut self) {
203 self.len = 0;
204 self.validity.clear();
205 Arc::make_mut(&mut self.fields)
206 .iter_mut()
207 .for_each(|f| f.clear());
208 }
209
210 fn try_into_mut(self) -> Result<StructVectorMut, Self> {
211 let len = self.len;
212
213 let fields = match Arc::try_unwrap(self.fields) {
214 Ok(fields) => fields,
215 Err(fields) => return Err(Self { fields, ..self }),
216 };
217
218 let validity = match self.validity.try_into_mut() {
219 Ok(validity) => validity,
220 Err(validity) => {
221 return Err(Self {
222 fields: Arc::new(fields),
223 validity,
224 len,
225 });
226 }
227 };
228
229 let mut mutable_fields = Vec::with_capacity(fields.len());
231 let mut fields_iter = fields.into_iter();
232
233 while let Some(field) = fields_iter.next() {
234 match field.try_into_mut() {
235 Ok(mutable_field) => {
236 mutable_fields.push(mutable_field);
238 }
239 Err(immutable_field) => {
240 let mut all_fields: Vec<Vector> = mutable_fields
243 .into_iter()
244 .map(|mut_field| mut_field.freeze())
245 .collect();
246
247 all_fields.push(immutable_field);
248 all_fields.extend(fields_iter);
249
250 return Err(Self {
251 fields: Arc::new(all_fields.into_boxed_slice()),
252 len: self.len,
253 validity: validity.freeze(),
254 });
255 }
256 }
257 }
258
259 Ok(StructVectorMut {
260 fields: mutable_fields.into_boxed_slice(),
261 len: self.len,
262 validity,
263 })
264 }
265
266 fn into_mut(self) -> StructVectorMut {
267 let len = self.len;
268 let validity = self.validity.into_mut();
269
270 let fields = Arc::try_unwrap(self.fields).unwrap_or_else(|arc| (*arc).clone());
273
274 let mutable_fields: Box<[_]> = fields
275 .into_vec()
276 .into_iter()
277 .map(|field| field.into_mut())
278 .collect();
279
280 StructVectorMut {
281 fields: mutable_fields,
282 len,
283 validity,
284 }
285 }
286}
287
288#[cfg(test)]
289mod tests {
290 use std::sync::Arc;
291
292 use vortex_mask::Mask;
293
294 use super::*;
295 use crate::bool::BoolVectorMut;
296 use crate::null::NullVector;
297 use crate::primitive::PVectorMut;
298
299 #[test]
300 fn test_struct_vector_eq_identical() {
301 let v1 = StructVector::new(
303 Arc::new(Box::new([
304 NullVector::new(3).into(),
305 BoolVectorMut::from_iter([true, false, true])
306 .freeze()
307 .into(),
308 PVectorMut::<i32>::from_iter([10, 20, 30]).freeze().into(),
309 ])),
310 Mask::AllTrue(3),
311 );
312
313 let v2 = StructVector::new(
314 Arc::new(Box::new([
315 NullVector::new(3).into(),
316 BoolVectorMut::from_iter([true, false, true])
317 .freeze()
318 .into(),
319 PVectorMut::<i32>::from_iter([10, 20, 30]).freeze().into(),
320 ])),
321 Mask::AllTrue(3),
322 );
323
324 assert_eq!(v1, v2);
325 }
326
327 #[test]
328 fn test_struct_vector_eq_different_length() {
329 let v1 = StructVector::new(
331 Arc::new(Box::new([PVectorMut::<i32>::from_iter([10, 20, 30])
332 .freeze()
333 .into()])),
334 Mask::AllTrue(3),
335 );
336
337 let v2 = StructVector::new(
338 Arc::new(Box::new([PVectorMut::<i32>::from_iter([10, 20])
339 .freeze()
340 .into()])),
341 Mask::AllTrue(2),
342 );
343
344 assert_ne!(v1, v2);
345 }
346
347 #[test]
348 fn test_struct_vector_eq_different_field_count() {
349 let v1 = StructVector::new(
351 Arc::new(Box::new([
352 PVectorMut::<i32>::from_iter([10, 20, 30]).freeze().into(),
353 BoolVectorMut::from_iter([true, false, true])
354 .freeze()
355 .into(),
356 ])),
357 Mask::AllTrue(3),
358 );
359
360 let v2 = StructVector::new(
361 Arc::new(Box::new([PVectorMut::<i32>::from_iter([10, 20, 30])
362 .freeze()
363 .into()])),
364 Mask::AllTrue(3),
365 );
366
367 assert_ne!(v1, v2);
368 }
369
370 #[test]
371 fn test_struct_vector_eq_different_validity() {
372 let v1 = StructVector::new(
374 Arc::new(Box::new([PVectorMut::<i32>::from_iter([10, 20, 30])
375 .freeze()
376 .into()])),
377 Mask::AllTrue(3),
378 );
379
380 let v2 = StructVector::new(
381 Arc::new(Box::new([PVectorMut::<i32>::from_iter([10, 20, 30])
382 .freeze()
383 .into()])),
384 Mask::from_iter([true, false, true]),
385 );
386
387 assert_ne!(v1, v2);
388 }
389
390 #[test]
391 fn test_struct_vector_eq_different_field_values() {
392 let v1 = StructVector::new(
394 Arc::new(Box::new([PVectorMut::<i32>::from_iter([10, 20, 30])
395 .freeze()
396 .into()])),
397 Mask::AllTrue(3),
398 );
399
400 let v2 = StructVector::new(
401 Arc::new(Box::new([PVectorMut::<i32>::from_iter([10, 99, 30])
402 .freeze()
403 .into()])),
404 Mask::AllTrue(3),
405 );
406
407 assert_ne!(v1, v2);
408 }
409
410 #[test]
411 fn test_struct_vector_eq_ignores_invalid_positions() {
412 let validity = Mask::from_iter([true, false, true]);
417
418 let v1 = StructVector::new(
419 Arc::new(Box::new([PVectorMut::<i32>::from_iter([10, 20, 30])
420 .freeze()
421 .into()])),
422 validity.clone(),
423 );
424
425 let v2 = StructVector::new(
427 Arc::new(Box::new([PVectorMut::<i32>::from_iter([10, 99, 30])
428 .freeze()
429 .into()])),
430 validity,
431 );
432
433 assert_eq!(v1, v2);
434 }
435
436 #[test]
437 fn test_struct_vector_eq_combined_mask_applied() {
438 let validity = Mask::from_iter([true, false, true, false, true]);
443
444 let v1 = StructVector::new(
445 Arc::new(Box::new([
446 PVectorMut::<i32>::from_iter([1, 2, 3, 4, 5])
447 .freeze()
448 .into(),
449 BoolVectorMut::from_iter([true, true, true, true, true])
450 .freeze()
451 .into(),
452 ])),
453 validity.clone(),
454 );
455
456 let v2 = StructVector::new(
458 Arc::new(Box::new([
459 PVectorMut::<i32>::from_iter([1, 999, 3, 888, 5])
460 .freeze()
461 .into(),
462 BoolVectorMut::from_iter([true, false, true, false, true])
463 .freeze()
464 .into(),
465 ])),
466 validity,
467 );
468
469 assert_eq!(v1, v2);
470 }
471
472 #[test]
473 fn test_struct_vector_eq_nested() {
474 let inner1 = StructVector::new(
476 Arc::new(Box::new([BoolVectorMut::from_iter([true, false, true])
477 .freeze()
478 .into()])),
479 Mask::AllTrue(3),
480 );
481
482 let inner2 = StructVector::new(
483 Arc::new(Box::new([BoolVectorMut::from_iter([true, false, true])
484 .freeze()
485 .into()])),
486 Mask::AllTrue(3),
487 );
488
489 let v1 = StructVector::new(Arc::new(Box::new([inner1.into()])), Mask::AllTrue(3));
490
491 let v2 = StructVector::new(Arc::new(Box::new([inner2.into()])), Mask::AllTrue(3));
492
493 assert_eq!(v1, v2);
494 }
495
496 #[test]
497 fn test_struct_vector_eq_empty() {
498 let v1 = StructVector::new(Arc::new(Box::new([])), Mask::AllTrue(0));
500 let v2 = StructVector::new(Arc::new(Box::new([])), Mask::AllTrue(0));
501
502 assert_eq!(v1, v2);
503 }
504}