• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

vortex-data / vortex / 16979224669

14 Aug 2025 11:42PM UTC coverage: 23.728%. First build
16979224669

Pull #2456

github

web-flow
Merge 30049dfa7 into aaf3e36ad
Pull Request #2456: feat: basic BoolBuffer / BoolBufferMut

68 of 1065 new or added lines in 82 files covered. (6.38%)

8616 of 36312 relevant lines covered (23.73%)

146.37 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/vortex-array/src/builders/bool.rs
1
// SPDX-License-Identifier: Apache-2.0
2
// SPDX-FileCopyrightText: Copyright the Vortex contributors
3

4
use std::any::Any;
5
use std::mem;
6

7
use vortex_buffer::BitBufferMut;
8
use vortex_dtype::{DType, Nullability};
9
use vortex_error::{VortexResult, vortex_bail};
10
use vortex_mask::Mask;
11

12
use crate::arrays::BoolArray;
13
use crate::builders::ArrayBuilder;
14
use crate::builders::lazy_validity_builder::LazyBitBufferBuilder;
15
use crate::{Array, ArrayRef, Canonical, IntoArray};
16

17
pub struct BoolBuilder {
18
    inner: BitBufferMut,
19
    nulls: LazyBitBufferBuilder,
20
    nullability: Nullability,
21
    dtype: DType,
22
}
23

24
impl BoolBuilder {
25
    pub fn new(nullability: Nullability) -> Self {
×
26
        Self::with_capacity(nullability, 1024) // Same as Arrow builders
×
27
    }
×
28

29
    pub fn with_capacity(nullability: Nullability, capacity: usize) -> Self {
×
30
        Self {
×
NEW
31
            inner: BitBufferMut::new(capacity),
×
NEW
32
            nulls: LazyBitBufferBuilder::new(capacity),
×
33
            nullability,
×
34
            dtype: DType::Bool(nullability),
×
35
        }
×
36
    }
×
37

38
    pub fn append_value(&mut self, value: bool) {
×
39
        self.append_values(value, 1)
×
40
    }
×
41

42
    pub fn append_values(&mut self, value: bool, n: usize) {
×
NEW
43
        self.inner.append_n(value, n);
×
44
        self.nulls.append_n_non_nulls(n)
×
45
    }
×
46

47
    pub fn append_option(&mut self, value: Option<bool>) {
×
48
        match value {
×
49
            Some(value) => self.append_value(value),
×
50
            None => self.append_null(),
×
51
        }
52
    }
×
53
}
54

55
impl ArrayBuilder for BoolBuilder {
56
    fn as_any(&self) -> &dyn Any {
×
57
        self
×
58
    }
×
59

60
    fn as_any_mut(&mut self) -> &mut dyn Any {
×
61
        self
×
62
    }
×
63

64
    fn dtype(&self) -> &DType {
×
65
        &self.dtype
×
66
    }
×
67

68
    fn len(&self) -> usize {
×
69
        self.inner.len()
×
70
    }
×
71

72
    fn append_zeros(&mut self, n: usize) {
×
73
        self.append_values(false, n)
×
74
    }
×
75

76
    fn append_nulls(&mut self, n: usize) {
×
NEW
77
        self.inner.append_n(false, n);
×
78
        self.nulls.append_n_nulls(n)
×
79
    }
×
80

81
    fn extend_from_array(&mut self, array: &dyn Array) -> VortexResult<()> {
×
82
        let array = array.to_canonical()?;
×
83
        let Canonical::Bool(array) = array else {
×
84
            vortex_bail!("Expected Canonical::Bool, found {:?}", array);
×
85
        };
86

NEW
87
        self.inner.append_buffer(array.bit_buffer());
×
88
        self.nulls.append_validity_mask(array.validity_mask()?);
×
89

90
        Ok(())
×
91
    }
×
92

93
    fn ensure_capacity(&mut self, capacity: usize) {
×
94
        if capacity > self.inner.capacity() {
×
95
            self.nulls.ensure_capacity(capacity);
×
96
            self.inner.reserve(capacity - self.inner.capacity());
×
97
        }
×
98
    }
×
99

100
    fn set_validity(&mut self, validity: Mask) {
×
NEW
101
        self.nulls = LazyBitBufferBuilder::new(validity.len());
×
102
        self.nulls.append_validity_mask(validity);
×
103
    }
×
104

105
    fn finish(&mut self) -> ArrayRef {
×
106
        assert_eq!(
×
107
            self.nulls.len(),
×
108
            self.inner.len(),
×
109
            "Null count and value count should match when calling BoolBuilder::finish."
×
110
        );
111

112
        BoolArray::new(
×
NEW
113
            mem::take(&mut self.inner).freeze(),
×
114
            self.nulls.finish_with_nullability(self.nullability),
×
115
        )
×
116
        .into_array()
×
117
    }
×
118
}
119

120
#[cfg(test)]
121
mod tests {
122
    use rand::prelude::StdRng;
123
    use rand::{Rng, SeedableRng};
124

125
    use crate::array::Array;
126
    use crate::arrays::{BoolArray, ChunkedArray};
127
    use crate::builders::builder_with_capacity;
128
    use crate::canonical::ToCanonical;
129
    use crate::vtable::ValidityHelper;
130
    use crate::{ArrayRef, IntoArray};
131
    fn make_opt_bool_chunks(len: usize, chunk_count: usize) -> ArrayRef {
132
        let mut rng = StdRng::seed_from_u64(0);
133

134
        (0..chunk_count)
135
            .map(|_| {
136
                BoolArray::from_iter((0..len).map(|_| match rng.random_range::<u8, _>(0..=2) {
137
                    0 => Some(false),
138
                    1 => Some(true),
139
                    2 => None,
140
                    _ => unreachable!(),
141
                }))
142
                .into_array()
143
            })
144
            .collect::<ChunkedArray>()
145
            .into_array()
146
    }
147

148
    #[test]
149
    fn tests() {
150
        let len = 1000;
151
        let chunk_count = 10;
152
        let chunk = make_opt_bool_chunks(len, chunk_count);
153

154
        let mut builder = builder_with_capacity(chunk.dtype(), len * chunk_count);
155
        chunk.clone().append_to_builder(builder.as_mut()).unwrap();
156
        let canon_into = builder
157
            .finish()
158
            .to_canonical()
159
            .unwrap()
160
            .into_bool()
161
            .unwrap();
162

163
        let into_canon = chunk.to_bool().unwrap();
164

165
        assert_eq!(canon_into.validity(), into_canon.validity());
166
        assert_eq!(canon_into.bit_buffer(), into_canon.bit_buffer());
167
    }
168
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc