hdbconnect_arrow/builders/
boolean.rs1use 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#[derive(Debug)]
14pub struct BooleanBuilderWrapper {
15 builder: BooleanBuilder,
16 len: usize,
17}
18
19impl BooleanBuilderWrapper {
20 #[must_use]
22 pub fn new(capacity: usize) -> Self {
23 Self {
24 builder: BooleanBuilder::with_capacity(capacity),
25 len: 0,
26 }
27 }
28
29 #[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}