Skip to main content

hdbconnect_arrow/builders/
boolean.rs

1//! Boolean type builder for Arrow boolean arrays.
2
3use std::sync::Arc;
4
5use arrow_array::ArrayRef;
6use arrow_array::builder::BooleanBuilder;
7
8use crate::Result;
9use crate::traits::builder::HanaCompatibleBuilder;
10use crate::traits::sealed::private::Sealed;
11
12/// Builder for Arrow Boolean arrays (HANA BOOLEAN).
13#[derive(Debug)]
14pub struct BooleanBuilderWrapper {
15    builder: BooleanBuilder,
16    len: usize,
17}
18
19impl BooleanBuilderWrapper {
20    /// Create a new boolean builder.
21    #[must_use]
22    pub fn new(capacity: usize) -> Self {
23        Self {
24            builder: BooleanBuilder::with_capacity(capacity),
25            len: 0,
26        }
27    }
28
29    /// Create with default capacity.
30    #[must_use]
31    pub fn default_capacity() -> Self {
32        Self::new(1024)
33    }
34}
35
36impl Sealed for BooleanBuilderWrapper {}
37
38impl HanaCompatibleBuilder for BooleanBuilderWrapper {
39    fn append_hana_value(&mut self, value: &hdbconnect::HdbValue) -> Result<()> {
40        use hdbconnect::HdbValue;
41
42        match value {
43            HdbValue::BOOLEAN(b) => {
44                self.builder.append_value(*b);
45            }
46            other => {
47                return Err(crate::ArrowConversionError::value_conversion(
48                    "boolean",
49                    format!("expected BOOLEAN, got {other:?}"),
50                ));
51            }
52        }
53        self.len += 1;
54        Ok(())
55    }
56
57    fn append_null(&mut self) {
58        self.builder.append_null();
59        self.len += 1;
60    }
61
62    fn finish(&mut self) -> ArrayRef {
63        self.len = 0;
64        Arc::new(self.builder.finish())
65    }
66
67    fn len(&self) -> usize {
68        self.len
69    }
70
71    fn capacity(&self) -> Option<usize> {
72        Some(self.builder.capacity())
73    }
74}
75
76#[cfg(test)]
77mod tests {
78    use hdbconnect::HdbValue;
79
80    use super::*;
81
82    #[test]
83    fn test_boolean_builder() {
84        let mut builder = BooleanBuilderWrapper::new(10);
85
86        builder.append_hana_value(&HdbValue::BOOLEAN(true)).unwrap();
87        builder.append_null();
88        builder
89            .append_hana_value(&HdbValue::BOOLEAN(false))
90            .unwrap();
91
92        assert_eq!(builder.len(), 3);
93        let array = builder.finish();
94        assert_eq!(array.len(), 3);
95    }
96}