vortex_array/arrays/bool/
serde.rs1use arrow_buffer::BooleanBuffer;
2use vortex_buffer::{Alignment, ByteBuffer};
3use vortex_dtype::DType;
4use vortex_error::{VortexExpect, VortexResult, vortex_bail};
5
6use crate::arrays::{BoolArray, BoolEncoding};
7use crate::serde::ArrayParts;
8use crate::validity::Validity;
9use crate::vtable::SerdeVTable;
10use crate::{
11 Array, ArrayBufferVisitor, ArrayChildVisitor, ArrayContext, ArrayRef, ArrayVisitorImpl,
12 DeserializeMetadata, RkyvMetadata,
13};
14
15#[derive(Debug, Clone, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
16pub struct BoolMetadata {
17 offset: u8,
19}
20
21impl ArrayVisitorImpl<RkyvMetadata<BoolMetadata>> for BoolArray {
22 fn _buffers(&self, visitor: &mut dyn ArrayBufferVisitor) {
23 visitor.visit_buffer(&ByteBuffer::from_arrow_buffer(
24 self.boolean_buffer().clone().into_inner(),
25 Alignment::none(),
26 ))
27 }
28
29 fn _children(&self, visitor: &mut dyn ArrayChildVisitor) {
30 visitor.visit_validity(&self.validity, self.len());
31 }
32
33 fn _metadata(&self) -> RkyvMetadata<BoolMetadata> {
34 let bit_offset = self.boolean_buffer().offset();
35 assert!(bit_offset < 8, "Offset must be <8, got {}", bit_offset);
36 RkyvMetadata(BoolMetadata {
37 offset: u8::try_from(bit_offset).vortex_expect("checked"),
38 })
39 }
40}
41
42impl SerdeVTable<&BoolArray> for BoolEncoding {
43 fn decode(
44 &self,
45 parts: &ArrayParts,
46 ctx: &ArrayContext,
47 dtype: DType,
48 len: usize,
49 ) -> VortexResult<ArrayRef> {
50 let metadata = RkyvMetadata::<BoolMetadata>::deserialize(parts.metadata())?;
51
52 if parts.nbuffers() != 1 {
53 vortex_bail!("Expected 1 buffer, got {}", parts.nbuffers());
54 }
55 let buffer = BooleanBuffer::new(
56 parts.buffer(0)?.into_arrow_buffer(),
57 metadata.offset as usize,
58 len,
59 );
60
61 let validity = if parts.nchildren() == 0 {
62 Validity::from(dtype.nullability())
63 } else if parts.nchildren() == 1 {
64 let validity = parts.child(0).decode(ctx, Validity::DTYPE, len)?;
65 Validity::Array(validity)
66 } else {
67 vortex_bail!("Expected 0 or 1 child, got {}", parts.nchildren());
68 };
69
70 Ok(BoolArray::new(buffer, validity).into_array())
71 }
72}