(data: ArrayData)
| 680 | |
| 681 | impl From<ArrayData> for UnionArray { |
| 682 | fn from(data: ArrayData) -> Self { |
| 683 | let (data_type, len, _nulls, offset, buffers, child_data) = data.into_parts(); |
| 684 | |
| 685 | let (fields, mode) = match &data_type { |
| 686 | DataType::Union(fields, mode) => (fields, mode), |
| 687 | d => panic!("UnionArray expected ArrayData with type Union got {d}"), |
| 688 | }; |
| 689 | |
| 690 | let (type_ids, offsets) = match mode { |
| 691 | UnionMode::Sparse => { |
| 692 | let [buffer]: [Buffer; 1] = buffers.try_into().expect("1 buffer for type_ids"); |
| 693 | (ScalarBuffer::new(buffer, offset, len), None) |
| 694 | } |
| 695 | UnionMode::Dense => { |
| 696 | let [type_ids_buffer, offsets_buffer]: [Buffer; 2] = buffers |
| 697 | .try_into() |
| 698 | .expect("2 buffers for type_ids and offsets"); |
| 699 | ( |
| 700 | ScalarBuffer::new(type_ids_buffer, offset, len), |
| 701 | Some(ScalarBuffer::new(offsets_buffer, offset, len)), |
| 702 | ) |
| 703 | } |
| 704 | }; |
| 705 | |
| 706 | let max_id = fields.iter().map(|(i, _)| i).max().unwrap_or_default() as usize; |
| 707 | let mut boxed_fields = vec![None; max_id + 1]; |
| 708 | for (cd, (field_id, _)) in child_data.into_iter().zip(fields.iter()) { |
| 709 | boxed_fields[field_id as usize] = Some(make_array(cd)); |
| 710 | } |
| 711 | Self { |
| 712 | data_type, |
| 713 | type_ids, |
| 714 | offsets, |
| 715 | fields: boxed_fields, |
| 716 | } |
| 717 | } |
| 718 | } |
| 719 | |
| 720 | impl From<UnionArray> for ArrayData { |
nothing calls this directly
no test coverage detected