1use crate::bit_iterator::{BitIndexIterator, BitIterator, BitSliceIterator};
19use crate::buffer::BooleanBuffer;
20use crate::{Buffer, MutableBuffer};
21
22#[derive(Debug, Clone, Eq, PartialEq)]
34pub struct NullBuffer {
35 buffer: BooleanBuffer,
36 null_count: usize,
37}
38
39impl NullBuffer {
40 pub fn new(buffer: BooleanBuffer) -> Self {
42 let null_count = buffer.len() - buffer.count_set_bits();
43 Self { buffer, null_count }
44 }
45
46 pub fn new_null(len: usize) -> Self {
48 Self {
49 buffer: BooleanBuffer::new_unset(len),
50 null_count: len,
51 }
52 }
53
54 pub fn new_valid(len: usize) -> Self {
59 Self {
60 buffer: BooleanBuffer::new_set(len),
61 null_count: 0,
62 }
63 }
64
65 pub unsafe fn new_unchecked(buffer: BooleanBuffer, null_count: usize) -> Self {
71 Self { buffer, null_count }
72 }
73
74 pub fn union(lhs: Option<&NullBuffer>, rhs: Option<&NullBuffer>) -> Option<NullBuffer> {
80 match (lhs, rhs) {
81 (Some(lhs), Some(rhs)) if lhs.null_count() > 0 || rhs.null_count() > 0 => {
82 Some(Self::new(lhs.inner() & rhs.inner()))
83 }
84 (Some(n), None) | (None, Some(n)) if n.null_count() > 0 => Some(n.clone()),
85 (_, _) => None,
86 }
87 }
88
89 pub fn union_many<'a>(
93 nulls: impl IntoIterator<Item = Option<&'a NullBuffer>>,
94 ) -> Option<NullBuffer> {
95 let mut buffers = nulls.into_iter().filter_map(|nb| match nb {
97 Some(nb) if nb.null_count > 0 => Some(nb.inner()),
98 _ => None,
99 });
100 let first = buffers.next()?;
101 let mut result = first.clone();
102 for buf in buffers {
103 result &= buf;
104 }
105 Some(Self::new(result))
106 }
107
108 pub fn contains(&self, other: &NullBuffer) -> bool {
110 if other.null_count == 0 {
111 return true;
112 }
113 let lhs = self.inner().bit_chunks().iter_padded();
114 let rhs = other.inner().bit_chunks().iter_padded();
115 lhs.zip(rhs).all(|(l, r)| (l & !r) == 0)
116 }
117
118 pub fn expand(&self, count: usize) -> Self {
122 let capacity = self.buffer.len().checked_mul(count).unwrap();
123 let mut buffer = MutableBuffer::new_null(capacity);
124
125 for i in 0..self.buffer.len() {
128 if self.is_null(i) {
129 continue;
130 }
131 for j in 0..count {
132 crate::bit_util::set_bit(buffer.as_mut(), i * count + j)
133 }
134 }
135 Self {
136 buffer: BooleanBuffer::new(buffer.into(), 0, capacity),
137 null_count: self.null_count * count,
138 }
139 }
140
141 #[inline]
143 pub fn len(&self) -> usize {
144 self.buffer.len()
145 }
146
147 #[inline]
149 pub fn offset(&self) -> usize {
150 self.buffer.offset()
151 }
152
153 #[inline]
155 pub fn is_empty(&self) -> bool {
156 self.buffer.is_empty()
157 }
158
159 pub fn shrink_to_fit(&mut self) {
161 self.buffer.shrink_to_fit();
162 }
163
164 #[inline]
166 pub fn null_count(&self) -> usize {
167 self.null_count
168 }
169
170 #[inline]
172 pub fn is_valid(&self, idx: usize) -> bool {
173 self.buffer.value(idx)
174 }
175
176 #[inline]
178 pub fn is_null(&self, idx: usize) -> bool {
179 !self.is_valid(idx)
180 }
181
182 #[inline]
184 pub fn validity(&self) -> &[u8] {
185 self.buffer.values()
186 }
187
188 pub fn slice(&self, offset: usize, len: usize) -> Self {
190 Self::new(self.buffer.slice(offset, len))
191 }
192
193 pub fn iter(&self) -> BitIterator<'_> {
200 self.buffer.iter()
201 }
202
203 pub fn valid_indices(&self) -> BitIndexIterator<'_> {
207 self.buffer.set_indices()
208 }
209
210 pub fn valid_slices(&self) -> BitSliceIterator<'_> {
214 self.buffer.set_slices()
215 }
216
217 #[inline]
219 pub fn try_for_each_valid_idx<E, F: FnMut(usize) -> Result<(), E>>(
220 &self,
221 f: F,
222 ) -> Result<(), E> {
223 if self.null_count == self.len() {
224 return Ok(());
225 }
226 self.valid_indices().try_for_each(f)
227 }
228
229 #[inline]
231 pub fn inner(&self) -> &BooleanBuffer {
232 &self.buffer
233 }
234
235 #[inline]
237 pub fn into_inner(self) -> BooleanBuffer {
238 self.buffer
239 }
240
241 #[inline]
243 pub fn buffer(&self) -> &Buffer {
244 self.buffer.inner()
245 }
246
247 pub fn from_unsliced_buffer(buffer: impl Into<Buffer>, len: usize) -> Option<Self> {
251 let bb = BooleanBuffer::new(buffer.into(), 0, len);
252 let nb = NullBuffer::new(bb);
253 (nb.null_count() > 0).then_some(nb)
254 }
255
256 #[cfg(feature = "pool")]
258 pub fn claim(&self, pool: &dyn crate::MemoryPool) {
259 self.buffer.inner().claim(pool);
261 }
262}
263
264impl<'a> IntoIterator for &'a NullBuffer {
265 type Item = bool;
266 type IntoIter = BitIterator<'a>;
267
268 fn into_iter(self) -> Self::IntoIter {
269 self.buffer.iter()
270 }
271}
272
273impl From<BooleanBuffer> for NullBuffer {
274 fn from(value: BooleanBuffer) -> Self {
275 Self::new(value)
276 }
277}
278
279impl From<&[bool]> for NullBuffer {
280 fn from(value: &[bool]) -> Self {
281 BooleanBuffer::from(value).into()
282 }
283}
284
285impl<const N: usize> From<&[bool; N]> for NullBuffer {
286 fn from(value: &[bool; N]) -> Self {
287 value[..].into()
288 }
289}
290
291impl From<Vec<bool>> for NullBuffer {
292 fn from(value: Vec<bool>) -> Self {
293 BooleanBuffer::from(value).into()
294 }
295}
296
297impl FromIterator<bool> for NullBuffer {
298 fn from_iter<T: IntoIterator<Item = bool>>(iter: T) -> Self {
299 BooleanBuffer::from_iter(iter).into()
300 }
301}
302
303#[cfg(test)]
304mod tests {
305 use super::*;
306
307 #[test]
308 fn test_size() {
309 assert_eq!(
311 std::mem::size_of::<NullBuffer>(),
312 std::mem::size_of::<Option<NullBuffer>>()
313 );
314 }
315
316 #[test]
317 fn test_from_unsliced_buffer_with_nulls() {
318 let buf = Buffer::from([0b10110010u8]);
320 let result = NullBuffer::from_unsliced_buffer(buf, 8);
321 assert!(result.is_some());
322 let nb = result.unwrap();
323 assert_eq!(nb.len(), 8);
324 assert_eq!(nb.null_count(), 4);
325 assert!(nb.is_null(0));
326 assert!(nb.is_valid(1));
327 assert!(nb.is_null(2));
328 assert!(nb.is_null(3));
329 assert!(nb.is_valid(4));
330 assert!(nb.is_valid(5));
331 assert!(nb.is_null(6));
332 assert!(nb.is_valid(7));
333 }
334
335 #[test]
336 fn test_from_unsliced_buffer_all_valid() {
337 let buf = Buffer::from([0b11111111u8]);
339 let result = NullBuffer::from_unsliced_buffer(buf, 8);
340 assert!(result.is_none());
341 }
342
343 #[test]
344 fn test_from_unsliced_buffer_all_null() {
345 let buf = Buffer::from([0b00000000u8]);
347 let result = NullBuffer::from_unsliced_buffer(buf, 8);
348 assert!(result.is_some());
349 let nb = result.unwrap();
350 assert_eq!(nb.len(), 8);
351 assert_eq!(nb.null_count(), 8);
352 }
353
354 #[test]
355 fn test_from_unsliced_buffer_empty() {
356 let buf = Buffer::from([]);
357 let result = NullBuffer::from_unsliced_buffer(buf, 0);
358 assert!(result.is_none());
359 }
360
361 #[test]
362 fn test_union_many_all_none() {
363 let result = NullBuffer::union_many([None, None, None]);
364 assert!(result.is_none());
365 }
366
367 #[test]
368 fn test_union_many_single_some() {
369 let a = NullBuffer::from(&[true, false, true, true]);
370 let result = NullBuffer::union_many([Some(&a)]);
371 assert_eq!(result, Some(a));
372 }
373
374 #[test]
375 fn test_union_many_two_inputs() {
376 let a = NullBuffer::from(&[true, false, true, true]);
377 let b = NullBuffer::from(&[true, true, false, true]);
378 let result = NullBuffer::union_many([Some(&a), Some(&b)]);
379 let expected = NullBuffer::union(Some(&a), Some(&b));
380 assert_eq!(result, expected);
381 }
382
383 #[test]
384 fn test_union_many_three_inputs() {
385 let a = NullBuffer::from(&[true, false, true, true]);
386 let b = NullBuffer::from(&[true, true, false, true]);
387 let c = NullBuffer::from(&[false, true, true, true]);
388 let result = NullBuffer::union_many([Some(&a), Some(&b), Some(&c)]);
389 let expected = NullBuffer::from(&[false, false, false, true]);
390 assert_eq!(result, Some(expected));
391 }
392
393 #[test]
394 fn test_union_many_mixed_none() {
395 let a = NullBuffer::from(&[true, false, true, true]);
396 let b = NullBuffer::from(&[false, true, true, true]);
397 let result = NullBuffer::union_many([Some(&a), None, Some(&b)]);
398 let expected = NullBuffer::union(Some(&a), Some(&b));
399 assert_eq!(result, expected);
400 }
401
402 #[test]
403 fn test_union_many_empty_slice() {
404 let result = NullBuffer::union_many([] as [Option<&NullBuffer>; 0]);
405 assert!(result.is_none());
406 }
407
408 #[test]
409 fn test_union_many_no_nulls() {
410 let a = NullBuffer::from(&[true, true, true, true]);
411
412 let result = NullBuffer::union_many([Some(&a), Some(&a), Some(&a)]);
413 assert_eq!(result, None);
414 }
415
416 #[test]
417 fn test_union_no_nulls() {
418 let a = NullBuffer::from(&[true, true, true, true]);
419
420 let result = NullBuffer::union(Some(&a), Some(&a));
421 assert_eq!(result, None);
422
423 let result = NullBuffer::union(Some(&a), None);
424 assert_eq!(result, None);
425
426 let result = NullBuffer::union(None, Some(&a));
427 assert_eq!(result, None);
428 }
429
430 #[test]
431 fn test_union_nulls_one_side() {
432 let all_valid = NullBuffer::from(&[true, true, true, true]);
433 let all_null = NullBuffer::from(&[false, false, false, false]);
434
435 let result = NullBuffer::union(Some(&all_valid), Some(&all_null));
436 assert_eq!(result, Some(all_null.clone()));
437
438 let result = NullBuffer::union(Some(&all_null), Some(&all_valid));
439 assert_eq!(result, Some(all_null.clone()));
440 }
441}