11use super :: * ;
22
3- pub struct AnonymousListBuilder < ' a > {
4- name : PlSmallStr ,
5- builder : AnonymousBuilder < ' a > ,
6- fast_explode : bool ,
7- inner_dtype : Option < DataType > ,
8- }
9-
10- impl Default for AnonymousListBuilder < ' _ > {
11- fn default ( ) -> Self {
12- Self :: new ( PlSmallStr :: EMPTY , 0 , None )
13- }
14- }
15-
16- impl < ' a > AnonymousListBuilder < ' a > {
17- pub fn new ( name : PlSmallStr , capacity : usize , inner_dtype : Option < DataType > ) -> Self {
18- Self {
19- name,
20- builder : AnonymousBuilder :: new ( capacity) ,
21- fast_explode : true ,
22- inner_dtype,
23- }
24- }
25-
26- pub fn append_opt_series ( & mut self , opt_s : Option < & ' a Series > ) -> PolarsResult < ( ) > {
27- match opt_s {
28- Some ( s) => return self . append_series ( s) ,
29- None => {
30- self . append_null ( ) ;
31- } ,
32- }
33- Ok ( ( ) )
34- }
35-
36- pub fn append_opt_array ( & mut self , opt_s : Option < & ' a dyn Array > ) {
37- match opt_s {
38- Some ( s) => self . append_array ( s) ,
39- None => {
40- self . append_null ( ) ;
41- } ,
42- }
43- }
44-
45- pub fn append_array ( & mut self , arr : & ' a dyn Array ) {
46- self . builder . push ( arr)
47- }
48-
49- #[ inline]
50- pub fn append_null ( & mut self ) {
51- self . fast_explode = false ;
52- self . builder . push_null ( ) ;
53- }
54-
55- #[ inline]
56- pub fn append_empty ( & mut self ) {
57- self . fast_explode = false ;
58- self . builder . push_empty ( )
59- }
60-
61- pub fn append_series ( & mut self , s : & ' a Series ) -> PolarsResult < ( ) > {
62- match ( s. dtype ( ) , & self . inner_dtype ) {
63- ( DataType :: Null , _) => { } ,
64- ( dt, None ) => self . inner_dtype = Some ( dt. clone ( ) ) ,
65- ( dt, Some ( set_dt) ) => {
66- polars_bail ! ( ComputeError : "dtypes don't match, got {}, expected: {}" , dt. pretty_format( ) , set_dt. pretty_format( ) ) ;
67- } ,
68- }
69- if s. is_empty ( ) {
70- self . append_empty ( ) ;
71- } else {
72- self . builder . push_multiple ( s. chunks ( ) ) ;
73- }
74- Ok ( ( ) )
75- }
76-
77- pub fn finish ( & mut self ) -> ListChunked {
78- // Don't use self from here on out.
79- let slf = std:: mem:: take ( self ) ;
80- if slf. builder . is_empty ( ) {
81- ListChunked :: full_null_with_dtype (
82- slf. name . clone ( ) ,
83- 0 ,
84- & slf. inner_dtype . unwrap_or ( DataType :: Null ) ,
85- )
86- } else {
87- let inner_dtype_physical = self
88- . inner_dtype
89- . as_ref ( )
90- . map ( |dt| dt. to_physical ( ) . to_arrow ( CompatLevel :: newest ( ) ) ) ;
91- let arr = slf. builder . finish ( inner_dtype_physical. as_ref ( ) ) . unwrap ( ) ;
92-
93- let list_dtype_logical = match & self . inner_dtype {
94- None => DataType :: from_arrow_dtype ( arr. dtype ( ) ) ,
95- Some ( dt) => DataType :: List ( Box :: new ( dt. clone ( ) ) ) ,
96- } ;
97-
98- let mut ca = ListChunked :: with_chunk ( PlSmallStr :: EMPTY , arr) ;
99- if slf. fast_explode {
100- ca. set_fast_explode ( ) ;
101- }
102- ca. field = Arc :: new ( Field :: new ( slf. name , list_dtype_logical) ) ;
103- ca
104- }
105- }
106- }
107-
1083pub struct AnonymousOwnedListBuilder {
1094 name : PlSmallStr ,
1105 builder : AnonymousBuilder < ' static > ,
@@ -121,6 +16,10 @@ impl Default for AnonymousOwnedListBuilder {
12116
12217impl ListBuilderTrait for AnonymousOwnedListBuilder {
12318 fn append_series ( & mut self , s : & Series ) -> PolarsResult < ( ) > {
19+ self . append_owned_series ( s. clone ( ) )
20+ }
21+
22+ fn append_owned_series ( & mut self , s : Series ) -> PolarsResult < ( ) > {
12423 match ( s. dtype ( ) , & self . inner_dtype ) {
12524 ( DataType :: Null , _) => { } ,
12625 ( dt, None ) => self . inner_dtype = Some ( dt. clone ( ) ) ,
@@ -135,8 +34,8 @@ impl ListBuilderTrait for AnonymousOwnedListBuilder {
13534 self . builder
13635 . push_multiple ( & * ( s. chunks ( ) . as_ref ( ) as * const [ ArrayRef ] ) ) ;
13736 }
138- // This make sure that the underlying ArrayRef's are not dropped.
139- self . owned . push ( s. clone ( ) ) ;
37+ // This ensures that the underlying ArrayRef's are not dropped.
38+ self . owned . push ( s) ;
14039 }
14140 Ok ( ( ) )
14241 }
0 commit comments