Skip to content

Commit 685356e

Browse files
committed
Avoid a clone when creating MapArray from ArrayData
1 parent 9e822e0 commit 685356e

File tree

1 file changed

+13
-12
lines changed

1 file changed

+13
-12
lines changed

arrow-array/src/array/map_array.rs

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -272,28 +272,29 @@ impl From<MapArray> for ArrayData {
272272

273273
impl MapArray {
274274
fn try_new_from_array_data(data: ArrayData) -> Result<Self, ArrowError> {
275-
if !matches!(data.data_type(), DataType::Map(_, _)) {
275+
let (data_type, len, nulls, offset, mut buffers, mut child_data) = data.into_parts();
276+
277+
if !matches!(data_type, DataType::Map(_, _)) {
276278
return Err(ArrowError::InvalidArgumentError(format!(
277-
"MapArray expected ArrayData with DataType::Map got {}",
278-
data.data_type()
279+
"MapArray expected ArrayData with DataType::Map got {data_type}",
279280
)));
280281
}
281282

282-
if data.buffers().len() != 1 {
283+
if buffers.len() != 1 {
283284
return Err(ArrowError::InvalidArgumentError(format!(
284285
"MapArray data should contain a single buffer only (value offsets), had {}",
285-
data.len()
286+
buffers.len(),
286287
)));
287288
}
289+
let buffer = buffers.pop().expect("checked above");
288290

289-
if data.child_data().len() != 1 {
291+
if child_data.len() != 1 {
290292
return Err(ArrowError::InvalidArgumentError(format!(
291293
"MapArray should contain a single child array (values array), had {}",
292-
data.child_data().len()
294+
child_data.len()
293295
)));
294296
}
295-
296-
let entries = data.child_data()[0].clone();
297+
let entries = child_data.pop().expect("checked above");
297298

298299
if let DataType::Struct(fields) = entries.data_type() {
299300
if fields.len() != 2 {
@@ -312,11 +313,11 @@ impl MapArray {
312313

313314
// SAFETY:
314315
// ArrayData is valid, and verified type above
315-
let value_offsets = unsafe { get_offsets(&data) };
316+
let value_offsets = unsafe { get_offsets(buffer, offset, len) };
316317

317318
Ok(Self {
318-
data_type: data.data_type().clone(),
319-
nulls: data.nulls().cloned(),
319+
data_type,
320+
nulls,
320321
entries,
321322
value_offsets,
322323
})

0 commit comments

Comments
 (0)