vortex_vector/struct_/mod.rs
1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4//! Definition and implementation of [`StructVector`] and [`StructVectorMut`].
5//!
6//! # Examples
7//!
8//! ## Creating a [`StructVector`] and [`StructVectorMut`]
9//!
10//! ```
11//! use vortex_vector::bool::BoolVectorMut;
12//! use vortex_vector::null::NullVectorMut;
13//! use vortex_vector::primitive::PVectorMut;
14//! use vortex_vector::struct_::StructVectorMut;
15//! use vortex_vector::{VectorMut, VectorMutOps};
16//! use vortex_mask::MaskMut;
17//!
18//! // Create a struct with three fields: nulls, booleans, and integers.
19//! let fields = Box::new([
20//! NullVectorMut::new(3).into(),
21//! BoolVectorMut::from_iter([true, false, true]).into(),
22//! PVectorMut::<i32>::from_iter([10, 20, 30]).into(),
23//! ]);
24//!
25//! let mut struct_vec = StructVectorMut::new(fields, MaskMut::new_true(3));
26//! assert_eq!(struct_vec.len(), 3);
27//! ```
28//!
29//! ## Working with [`split_off()`] and [`unsplit()`]
30//!
31//! [`split_off()`]: crate::VectorMutOps::split_off
32//! [`unsplit()`]: crate::VectorMutOps::unsplit
33//!
34//! ```
35//! use vortex_vector::bool::BoolVectorMut;
36//! use vortex_vector::null::NullVectorMut;
37//! use vortex_vector::primitive::PVectorMut;
38//! use vortex_vector::struct_::StructVectorMut;
39//! use vortex_vector::{VectorMut, VectorMutOps};
40//! use vortex_mask::MaskMut;
41//!
42//! let fields = Box::new([
43//! NullVectorMut::new(6).into(),
44//! PVectorMut::<i32>::from_iter([1, 2, 3, 4, 5, 6]).into(),
45//! ]);
46//!
47//! let mut struct_vec = StructVectorMut::new(fields, MaskMut::new_true(6));
48//!
49//! // Split at position 4.
50//! let second_part = struct_vec.split_off(4);
51//!
52//! assert_eq!(struct_vec.len(), 4);
53//! assert_eq!(second_part.len(), 2);
54//!
55//! // Rejoin the parts.
56//! struct_vec.unsplit(second_part);
57//! assert_eq!(struct_vec.len(), 6);
58//! ```
59//!
60//! ## Accessing field values
61//!
62//! ```
63//! use vortex_vector::bool::BoolVectorMut;
64//! use vortex_vector::null::NullVectorMut;
65//! use vortex_vector::primitive::PVectorMut;
66//! use vortex_vector::struct_::StructVectorMut;
67//! use vortex_vector::{VectorMut, VectorMutOps};
68//! use vortex_mask::MaskMut;
69//! use vortex_dtype::PTypeDowncast;
70//!
71//! let fields = Box::new([
72//! NullVectorMut::new(3).into(),
73//! BoolVectorMut::from_iter([true, false, true]).into(),
74//! PVectorMut::<i32>::from_iter([10, 20, 30]).into(),
75//! ]);
76//!
77//! let struct_vec = StructVectorMut::new(fields, MaskMut::new_true(3));
78//!
79//! // Access the boolean field vector (field index 1).
80//! if let VectorMut::Bool(bool_vec) = struct_vec.fields()[1].clone() {
81//! let values: Vec<_> = bool_vec.into_iter().map(|v| v.unwrap()).collect();
82//! assert_eq!(values, vec![true, false, true]);
83//! }
84//!
85//! // Access the integer field column (field index 2).
86//! if let VectorMut::Primitive(prim_vec) = struct_vec.fields()[2].clone() {
87//! let values: Vec<_> = prim_vec.into_i32().into_iter().map(|v| v.unwrap()).collect();
88//! assert_eq!(values, vec![10, 20, 30]);
89//! }
90//! ```
91
92mod vector;
93pub use vector::StructVector;
94
95mod vector_mut;
96pub use vector_mut::StructVectorMut;
97
98mod scalar;
99
100pub use scalar::StructScalar;
101
102use crate::{Vector, VectorMut};
103
104impl From<StructVector> for Vector {
105 fn from(v: StructVector) -> Self {
106 Self::Struct(v)
107 }
108}
109
110impl From<StructVectorMut> for VectorMut {
111 fn from(v: StructVectorMut) -> Self {
112 Self::Struct(v)
113 }
114}