diff --git a/src/array/binary/mutable.rs b/src/array/binary/mutable.rs index c23d91dbe3a..31d219079eb 100644 --- a/src/array/binary/mutable.rs +++ b/src/array/binary/mutable.rs @@ -146,6 +146,15 @@ impl MutableArray for MutableBinaryArray { &self.validity } + fn as_box(&mut self) -> Box { + Box::new(BinaryArray::from_data( + self.data_type.clone(), + std::mem::take(&mut self.offsets).into(), + std::mem::take(&mut self.values).into(), + std::mem::take(&mut self.validity).map(|x| x.into()), + )) + } + fn as_arc(&mut self) -> Arc { Arc::new(BinaryArray::from_data( self.data_type.clone(), diff --git a/src/array/boolean/mutable.rs b/src/array/boolean/mutable.rs index 8ab6d01faa1..070f60666b2 100644 --- a/src/array/boolean/mutable.rs +++ b/src/array/boolean/mutable.rs @@ -338,6 +338,14 @@ impl MutableArray for MutableBooleanArray { &self.validity } + fn as_box(&mut self) -> Box { + Box::new(BooleanArray::from_data( + self.data_type.clone(), + std::mem::take(&mut self.values).into(), + std::mem::take(&mut self.validity).map(|x| x.into()), + )) + } + fn as_arc(&mut self) -> Arc { Arc::new(BooleanArray::from_data( self.data_type.clone(), diff --git a/src/array/dictionary/mutable.rs b/src/array/dictionary/mutable.rs index 386857a4a78..b6392af5383 100644 --- a/src/array/dictionary/mutable.rs +++ b/src/array/dictionary/mutable.rs @@ -115,6 +115,13 @@ impl MutableArray for MutableDictio self.keys.validity() } + fn as_box(&mut self) -> Box { + Box::new(DictionaryArray::::from_data( + std::mem::take(&mut self.keys).into(), + self.values.as_arc(), + )) + } + fn as_arc(&mut self) -> Arc { Arc::new(DictionaryArray::::from_data( std::mem::take(&mut self.keys).into(), diff --git a/src/array/fixed_size_binary/mutable.rs b/src/array/fixed_size_binary/mutable.rs index cfb020d9072..b024ddb895d 100644 --- a/src/array/fixed_size_binary/mutable.rs +++ b/src/array/fixed_size_binary/mutable.rs @@ -173,6 +173,14 @@ impl MutableArray for MutableFixedSizeBinaryArray { &self.validity } + fn as_box(&mut self) -> Box { + Box::new(FixedSizeBinaryArray::from_data( + DataType::FixedSizeBinary(self.size as i32), + std::mem::take(&mut self.values).into(), + std::mem::take(&mut self.validity).map(|x| x.into()), + )) + } + fn as_arc(&mut self) -> Arc { Arc::new(FixedSizeBinaryArray::from_data( DataType::FixedSizeBinary(self.size as i32), diff --git a/src/array/fixed_size_list/mutable.rs b/src/array/fixed_size_list/mutable.rs index 73a9ff21ed8..d9d5fc30abd 100644 --- a/src/array/fixed_size_list/mutable.rs +++ b/src/array/fixed_size_list/mutable.rs @@ -69,6 +69,14 @@ impl MutableArray for MutableFixedSizeListArray { &self.validity } + fn as_box(&mut self) -> Box { + Box::new(FixedSizeListArray::from_data( + self.data_type.clone(), + self.values.as_arc(), + std::mem::take(&mut self.validity).map(|x| x.into()), + )) + } + fn as_arc(&mut self) -> Arc { Arc::new(FixedSizeListArray::from_data( self.data_type.clone(), diff --git a/src/array/list/mutable.rs b/src/array/list/mutable.rs index 80a846b8e8d..4c60fe82bbb 100644 --- a/src/array/list/mutable.rs +++ b/src/array/list/mutable.rs @@ -177,6 +177,15 @@ impl MutableArray for MutableListArray Box { + Box::new(ListArray::from_data( + self.data_type.clone(), + std::mem::take(&mut self.offsets).into(), + self.values.as_arc(), + std::mem::take(&mut self.validity).map(|x| x.into()), + )) + } + fn as_arc(&mut self) -> Arc { Arc::new(ListArray::from_data( self.data_type.clone(), diff --git a/src/array/mod.rs b/src/array/mod.rs index 5dbadb28846..0abe387a98b 100644 --- a/src/array/mod.rs +++ b/src/array/mod.rs @@ -113,8 +113,16 @@ pub trait MutableArray: std::fmt::Debug { /// The optional validity of the array. fn validity(&self) -> &Option; - /// Convert itself to an (immutable) [`Array`]. - fn as_arc(&mut self) -> Arc; + /// Convert itself to an (immutable) ['Array']. + fn as_box(&mut self) -> Box; + + /// Convert itself to an (immutable) atomically reference counted [`Array`]. + // This provided implementation has an extra allocation as it first + // boxes `self`, then converts the box into an `Arc`. Implementors may wish + // to avoid an allocation by skipping the box completely. + fn as_arc(&mut self) -> Arc { + self.as_box().into() + } /// Convert to `Any`, to enable dynamic casting. fn as_any(&self) -> &dyn Any; diff --git a/src/array/primitive/mutable.rs b/src/array/primitive/mutable.rs index 64d8c245abb..9dc03fcfec4 100644 --- a/src/array/primitive/mutable.rs +++ b/src/array/primitive/mutable.rs @@ -326,6 +326,14 @@ impl MutableArray for MutablePrimitiveArray { &self.validity } + fn as_box(&mut self) -> Box { + Box::new(PrimitiveArray::from_data( + self.data_type.clone(), + std::mem::take(&mut self.values).into(), + std::mem::take(&mut self.validity).map(|x| x.into()), + )) + } + fn as_arc(&mut self) -> Arc { Arc::new(PrimitiveArray::from_data( self.data_type.clone(), diff --git a/src/array/utf8/mutable.rs b/src/array/utf8/mutable.rs index ab1bb0744f1..0d49b60e9e0 100644 --- a/src/array/utf8/mutable.rs +++ b/src/array/utf8/mutable.rs @@ -187,6 +187,15 @@ impl MutableArray for MutableUtf8Array { &self.validity } + fn as_box(&mut self) -> Box { + Box::new(Utf8Array::from_data( + Self::default_data_type(), + std::mem::take(&mut self.offsets).into(), + std::mem::take(&mut self.values).into(), + std::mem::take(&mut self.validity).map(|x| x.into()), + )) + } + fn as_arc(&mut self) -> Arc { Arc::new(Utf8Array::from_data( Self::default_data_type(),