polars_core/chunked_array/builder/list/
binary.rs1use super::*;
2
3pub struct ListStringChunkedBuilder {
4 builder: LargeListBinViewBuilder<str>,
5 field: Field,
6 fast_explode: bool,
7}
8
9impl ListStringChunkedBuilder {
10 pub fn new(name: PlSmallStr, capacity: usize, values_capacity: usize) -> Self {
11 let values = MutableBinaryViewArray::with_capacity(values_capacity);
12 let builder = LargeListBinViewBuilder::new_with_capacity(values, capacity);
13 let field = Field::new(name, DataType::List(Box::new(DataType::String)));
14
15 ListStringChunkedBuilder {
16 builder,
17 field,
18 fast_explode: true,
19 }
20 }
21
22 #[inline]
23 pub fn append_trusted_len_iter<'a, I: Iterator<Item = Option<&'a str>> + TrustedLen>(
24 &mut self,
25 iter: I,
26 ) {
27 if iter.size_hint().0 == 0 {
28 self.fast_explode = false;
29 }
30 self.builder.mut_values().extend_trusted_len(iter);
33 self.builder.try_push_valid().unwrap();
34 }
35
36 #[inline]
37 pub fn append_values_iter<'a, I: Iterator<Item = &'a str>>(&mut self, iter: I) {
38 if iter.size_hint().0 == 0 {
39 self.fast_explode = false;
40 }
41 self.builder.mut_values().extend_values(iter);
42 self.builder.try_push_valid().unwrap();
43 }
44
45 #[inline]
46 pub(crate) fn append(&mut self, ca: &StringChunked) {
47 if ca.is_empty() {
48 self.fast_explode = false;
49 }
50 for arr in ca.downcast_iter() {
51 if arr.null_count() == 0 {
52 self.builder
53 .mut_values()
54 .extend_values(arr.non_null_values_iter());
55 } else {
56 self.builder.mut_values().extend_trusted_len(arr.iter())
57 }
58 }
59 self.builder.try_push_valid().unwrap();
60 }
61}
62
63impl ListBuilderTrait for ListStringChunkedBuilder {
64 #[inline]
65 fn append_null(&mut self) {
66 self.fast_explode = false;
67 self.builder.push_null();
68 }
69
70 #[inline]
71 fn append_series(&mut self, s: &Series) -> PolarsResult<()> {
72 if s.is_empty() {
73 self.fast_explode = false;
74 }
75 let ca = s.str()?;
76 self.append(ca);
77 Ok(())
78 }
79
80 fn field(&self) -> &Field {
81 &self.field
82 }
83
84 fn inner_array(&mut self) -> ArrayRef {
85 self.builder.as_box()
86 }
87
88 fn fast_explode(&self) -> bool {
89 self.fast_explode
90 }
91}
92
93pub struct ListBinaryChunkedBuilder {
94 builder: LargeListBinViewBuilder<[u8]>,
95 field: Field,
96 fast_explode: bool,
97}
98
99impl ListBinaryChunkedBuilder {
100 pub fn new(name: PlSmallStr, capacity: usize, values_capacity: usize) -> Self {
101 let values = MutablePlBinary::with_capacity(values_capacity);
102 let builder = LargeListBinViewBuilder::new_with_capacity(values, capacity);
103 let field = Field::new(name, DataType::List(Box::new(DataType::Binary)));
104
105 ListBinaryChunkedBuilder {
106 builder,
107 field,
108 fast_explode: true,
109 }
110 }
111
112 pub fn append_trusted_len_iter<'a, I: Iterator<Item = Option<&'a [u8]>> + TrustedLen>(
113 &mut self,
114 iter: I,
115 ) {
116 if iter.size_hint().0 == 0 {
117 self.fast_explode = false;
118 }
119 self.builder.mut_values().extend_trusted_len(iter);
122 self.builder.try_push_valid().unwrap();
123 }
124
125 pub fn append_values_iter<'a, I: Iterator<Item = &'a [u8]>>(&mut self, iter: I) {
126 if iter.size_hint().0 == 0 {
127 self.fast_explode = false;
128 }
129 self.builder.mut_values().extend_values(iter);
130 self.builder.try_push_valid().unwrap();
131 }
132
133 pub(crate) fn append(&mut self, ca: &BinaryChunked) {
134 if ca.is_empty() {
135 self.fast_explode = false;
136 }
137 for arr in ca.downcast_iter() {
138 if arr.null_count() == 0 {
139 self.builder
140 .mut_values()
141 .extend_values(arr.non_null_values_iter());
142 } else {
143 self.builder.mut_values().extend_trusted_len(arr.iter())
144 }
145 }
146 self.builder.try_push_valid().unwrap();
147 }
148}
149
150impl ListBuilderTrait for ListBinaryChunkedBuilder {
151 #[inline]
152 fn append_null(&mut self) {
153 self.fast_explode = false;
154 self.builder.push_null();
155 }
156
157 fn append_series(&mut self, s: &Series) -> PolarsResult<()> {
158 if s.is_empty() {
159 self.fast_explode = false;
160 }
161 let ca = s.binary()?;
162 self.append(ca);
163 Ok(())
164 }
165
166 fn field(&self) -> &Field {
167 &self.field
168 }
169
170 fn inner_array(&mut self) -> ArrayRef {
171 self.builder.as_box()
172 }
173
174 fn fast_explode(&self) -> bool {
175 self.fast_explode
176 }
177}