@@ -105,21 +105,34 @@ impl Series {
105105 } )
106106 }
107107 } else {
108- // TODO! null_count paths, but first exactsize iters must be implmeneted upstream
109108 match dtype {
110109 DataType :: Utf8 => {
111110 let arr = arr. as_any ( ) . downcast_ref :: < Utf8Array < i64 > > ( ) . unwrap ( ) ;
112- Box :: new ( arr. iter ( ) . map ( |value| match value {
113- Some ( value) => AnyValue :: Utf8 ( value) ,
114- None => AnyValue :: Null ,
115- } ) ) as Box < dyn ExactSizeIterator < Item = AnyValue < ' _ > > + ' _ >
111+ if arr. null_count ( ) == 0 {
112+ Box :: new ( arr. values_iter ( ) . map ( AnyValue :: Utf8 ) )
113+ as Box < dyn ExactSizeIterator < Item = AnyValue < ' _ > > + ' _ >
114+ } else {
115+ let zipvalid = arr. iter ( ) ;
116+ Box :: new ( zipvalid. unwrap_optional ( ) . map ( |v| match v {
117+ Some ( value) => AnyValue :: Utf8 ( value) ,
118+ None => AnyValue :: Null ,
119+ } ) )
120+ as Box < dyn ExactSizeIterator < Item = AnyValue < ' _ > > + ' _ >
121+ }
116122 }
117123 DataType :: Boolean => {
118124 let arr = arr. as_any ( ) . downcast_ref :: < BooleanArray > ( ) . unwrap ( ) ;
119- Box :: new ( arr. iter ( ) . map ( |value| match value {
120- Some ( value) => AnyValue :: Boolean ( value) ,
121- None => AnyValue :: Null ,
122- } ) ) as Box < dyn ExactSizeIterator < Item = AnyValue < ' _ > > + ' _ >
125+ if arr. null_count ( ) == 0 {
126+ Box :: new ( arr. values_iter ( ) . map ( AnyValue :: Boolean ) )
127+ as Box < dyn ExactSizeIterator < Item = AnyValue < ' _ > > + ' _ >
128+ } else {
129+ let zipvalid = arr. iter ( ) ;
130+ Box :: new ( zipvalid. unwrap_optional ( ) . map ( |v| match v {
131+ Some ( value) => AnyValue :: Boolean ( value) ,
132+ None => AnyValue :: Null ,
133+ } ) )
134+ as Box < dyn ExactSizeIterator < Item = AnyValue < ' _ > > + ' _ >
135+ }
123136 }
124137 _ => Box :: new ( self . iter ( ) ) ,
125138 }
0 commit comments