Coverage Report

Created: 2025-08-26 07:03

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/Users/andrewlamb/Software/arrow-rs/arrow-array/src/builder/null_builder.rs
Line
Count
Source
1
// Licensed to the Apache Software Foundation (ASF) under one
2
// or more contributor license agreements.  See the NOTICE file
3
// distributed with this work for additional information
4
// regarding copyright ownership.  The ASF licenses this file
5
// to you under the Apache License, Version 2.0 (the
6
// "License"); you may not use this file except in compliance
7
// with the License.  You may obtain a copy of the License at
8
//
9
//   http://www.apache.org/licenses/LICENSE-2.0
10
//
11
// Unless required by applicable law or agreed to in writing,
12
// software distributed under the License is distributed on an
13
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
// KIND, either express or implied.  See the License for the
15
// specific language governing permissions and limitations
16
// under the License.
17
18
use crate::builder::ArrayBuilder;
19
use crate::{ArrayRef, NullArray};
20
use arrow_data::ArrayData;
21
use arrow_schema::DataType;
22
use std::any::Any;
23
use std::sync::Arc;
24
25
/// Builder for [`NullArray`]
26
///
27
/// # Example
28
///
29
/// Create a `NullArray` from a `NullBuilder`
30
///
31
/// ```
32
///
33
/// # use arrow_array::{Array, NullArray, builder::NullBuilder};
34
///
35
/// let mut b = NullBuilder::new();
36
/// b.append_empty_value();
37
/// b.append_null();
38
/// b.append_nulls(3);
39
/// b.append_empty_values(3);
40
/// let arr = b.finish();
41
///
42
/// assert_eq!(8, arr.len());
43
/// assert_eq!(0, arr.null_count());
44
/// ```
45
#[derive(Debug)]
46
pub struct NullBuilder {
47
    len: usize,
48
}
49
50
impl Default for NullBuilder {
51
0
    fn default() -> Self {
52
0
        Self::new()
53
0
    }
54
}
55
56
impl NullBuilder {
57
    /// Creates a new null builder
58
0
    pub fn new() -> Self {
59
0
        Self { len: 0 }
60
0
    }
61
62
    /// Appends a null slot into the builder
63
    #[inline]
64
    pub fn append_null(&mut self) {
65
        self.len += 1;
66
    }
67
68
    /// Appends `n` `null`s into the builder.
69
    #[inline]
70
    pub fn append_nulls(&mut self, n: usize) {
71
        self.len += n;
72
    }
73
74
    /// Appends a null slot into the builder
75
    #[inline]
76
    pub fn append_empty_value(&mut self) {
77
        self.append_null();
78
    }
79
80
    /// Appends `n` `null`s into the builder.
81
    #[inline]
82
    pub fn append_empty_values(&mut self, n: usize) {
83
        self.append_nulls(n);
84
    }
85
86
    /// Builds the [NullArray] and reset this builder.
87
0
    pub fn finish(&mut self) -> NullArray {
88
0
        let len = self.len();
89
0
        let builder = ArrayData::new_null(&DataType::Null, len).into_builder();
90
91
0
        let array_data = unsafe { builder.build_unchecked() };
92
0
        NullArray::from(array_data)
93
0
    }
94
95
    /// Builds the [NullArray] without resetting the builder.
96
0
    pub fn finish_cloned(&self) -> NullArray {
97
0
        let len = self.len();
98
0
        let builder = ArrayData::new_null(&DataType::Null, len).into_builder();
99
100
0
        let array_data = unsafe { builder.build_unchecked() };
101
0
        NullArray::from(array_data)
102
0
    }
103
}
104
105
impl ArrayBuilder for NullBuilder {
106
    /// Returns the builder as a non-mutable `Any` reference.
107
0
    fn as_any(&self) -> &dyn Any {
108
0
        self
109
0
    }
110
111
    /// Returns the builder as a mutable `Any` reference.
112
0
    fn as_any_mut(&mut self) -> &mut dyn Any {
113
0
        self
114
0
    }
115
116
    /// Returns the boxed builder as a box of `Any`.
117
0
    fn into_box_any(self: Box<Self>) -> Box<dyn Any> {
118
0
        self
119
0
    }
120
121
    /// Returns the number of array slots in the builder
122
0
    fn len(&self) -> usize {
123
0
        self.len
124
0
    }
125
126
    /// Builds the array and reset this builder.
127
0
    fn finish(&mut self) -> ArrayRef {
128
0
        Arc::new(self.finish())
129
0
    }
130
131
    /// Builds the array without resetting the builder.
132
0
    fn finish_cloned(&self) -> ArrayRef {
133
0
        Arc::new(self.finish_cloned())
134
0
    }
135
}
136
137
#[cfg(test)]
138
mod tests {
139
    use super::*;
140
    use crate::Array;
141
142
    #[test]
143
    fn test_null_array_builder() {
144
        let mut builder = NullArray::builder(10);
145
        builder.append_null();
146
        builder.append_nulls(4);
147
        builder.append_empty_value();
148
        builder.append_empty_values(4);
149
150
        let arr = builder.finish();
151
        assert_eq!(10, arr.len());
152
        assert_eq!(0, arr.offset());
153
        assert_eq!(0, arr.null_count());
154
        assert!(arr.is_nullable());
155
    }
156
157
    #[test]
158
    fn test_null_array_builder_finish_cloned() {
159
        let mut builder = NullArray::builder(16);
160
        builder.append_null();
161
        builder.append_empty_value();
162
        builder.append_empty_values(3);
163
        let mut array = builder.finish_cloned();
164
        assert_eq!(5, array.len());
165
166
        builder.append_empty_values(5);
167
        array = builder.finish();
168
        assert_eq!(10, array.len());
169
    }
170
}