Returns a `PrimitiveBuilder` for this array, suitable for mutating values in place. # Buffer Reuse If the underlying data buffer has no other outstanding references, the buffer is used without copying. If the underlying data buffer does have outstanding references, returns `Err(self)`
(self)
| 1119 | /// If the underlying data buffer does have outstanding references, returns |
| 1120 | /// `Err(self)` |
| 1121 | pub fn into_builder(self) -> Result<PrimitiveBuilder<T>, Self> { |
| 1122 | let len = self.len(); |
| 1123 | let data = self.into_data(); |
| 1124 | let null_bit_buffer = data.nulls().map(|b| b.inner().sliced()); |
| 1125 | |
| 1126 | let element_len = std::mem::size_of::<T::Native>(); |
| 1127 | let buffer = |
| 1128 | data.buffers()[0].slice_with_length(data.offset() * element_len, len * element_len); |
| 1129 | |
| 1130 | drop(data); |
| 1131 | |
| 1132 | let try_mutable_null_buffer = match null_bit_buffer { |
| 1133 | None => Ok(None), |
| 1134 | Some(null_buffer) => { |
| 1135 | // Null buffer exists, tries to make it mutable |
| 1136 | null_buffer.into_mutable().map(Some) |
| 1137 | } |
| 1138 | }; |
| 1139 | |
| 1140 | let try_mutable_buffers = match try_mutable_null_buffer { |
| 1141 | Ok(mutable_null_buffer) => { |
| 1142 | // Got mutable null buffer, tries to get mutable value buffer |
| 1143 | let try_mutable_buffer = buffer.into_mutable(); |
| 1144 | |
| 1145 | // try_mutable_buffer.map(...).map_err(...) doesn't work as the compiler complains |
| 1146 | // mutable_null_buffer is moved into map closure. |
| 1147 | match try_mutable_buffer { |
| 1148 | Ok(mutable_buffer) => Ok(PrimitiveBuilder::<T>::new_from_buffer( |
| 1149 | mutable_buffer, |
| 1150 | mutable_null_buffer, |
| 1151 | )), |
| 1152 | Err(buffer) => Err((buffer, mutable_null_buffer.map(|b| b.into()))), |
| 1153 | } |
| 1154 | } |
| 1155 | Err(mutable_null_buffer) => { |
| 1156 | // Unable to get mutable null buffer |
| 1157 | Err((buffer, Some(mutable_null_buffer))) |
| 1158 | } |
| 1159 | }; |
| 1160 | |
| 1161 | match try_mutable_buffers { |
| 1162 | Ok(builder) => Ok(builder), |
| 1163 | Err((buffer, null_bit_buffer)) => { |
| 1164 | let builder = ArrayData::builder(T::DATA_TYPE) |
| 1165 | .len(len) |
| 1166 | .add_buffer(buffer) |
| 1167 | .null_bit_buffer(null_bit_buffer); |
| 1168 | |
| 1169 | let array_data = unsafe { builder.build_unchecked() }; |
| 1170 | let array = PrimitiveArray::<T>::from(array_data); |
| 1171 | |
| 1172 | Err(array) |
| 1173 | } |
| 1174 | } |
| 1175 | } |
| 1176 | } |
| 1177 | |
| 1178 | impl<T: ArrowPrimitiveType> From<PrimitiveArray<T>> for ArrayData { |