(&self, array: &dyn Array)
| 700 | } |
| 701 | |
| 702 | fn encoder(&self, array: &dyn Array) -> Result<Encoder<'_>, ArrowError> { |
| 703 | match self { |
| 704 | Codec::Stateless => Ok(Encoder::Stateless), |
| 705 | Codec::Dictionary(converter, nulls) => { |
| 706 | let values = array.as_any_dictionary().values().clone(); |
| 707 | let rows = converter.convert_columns(&[values])?; |
| 708 | Ok(Encoder::Dictionary(rows, nulls.row())) |
| 709 | } |
| 710 | Codec::Struct(converter, null) => { |
| 711 | let v = as_struct_array(array); |
| 712 | let rows = converter.convert_columns(v.columns())?; |
| 713 | Ok(Encoder::Struct(rows, null.row())) |
| 714 | } |
| 715 | Codec::List(converter) => { |
| 716 | let values = match array.data_type() { |
| 717 | DataType::List(_) => { |
| 718 | let list_array = as_list_array(array); |
| 719 | let first_offset = list_array.offsets()[0] as usize; |
| 720 | let last_offset = |
| 721 | list_array.offsets()[list_array.offsets().len() - 1] as usize; |
| 722 | |
| 723 | // values can include more data than referenced in the ListArray, only encode |
| 724 | // the referenced values. |
| 725 | list_array |
| 726 | .values() |
| 727 | .slice(first_offset, last_offset - first_offset) |
| 728 | } |
| 729 | DataType::LargeList(_) => { |
| 730 | let list_array = as_large_list_array(array); |
| 731 | |
| 732 | let first_offset = list_array.offsets()[0] as usize; |
| 733 | let last_offset = |
| 734 | list_array.offsets()[list_array.offsets().len() - 1] as usize; |
| 735 | |
| 736 | // values can include more data than referenced in the LargeListArray, only encode |
| 737 | // the referenced values. |
| 738 | list_array |
| 739 | .values() |
| 740 | .slice(first_offset, last_offset - first_offset) |
| 741 | } |
| 742 | DataType::ListView(_) => { |
| 743 | let list_view_array = array.as_list_view::<i32>(); |
| 744 | let (min_offset, max_end) = compute_list_view_bounds(list_view_array); |
| 745 | list_view_array |
| 746 | .values() |
| 747 | .slice(min_offset, max_end - min_offset) |
| 748 | } |
| 749 | DataType::LargeListView(_) => { |
| 750 | let list_view_array = array.as_list_view::<i64>(); |
| 751 | let (min_offset, max_end) = compute_list_view_bounds(list_view_array); |
| 752 | list_view_array |
| 753 | .values() |
| 754 | .slice(min_offset, max_end - min_offset) |
| 755 | } |
| 756 | DataType::FixedSizeList(_, _) => { |
| 757 | as_fixed_size_list_array(array).values().clone() |
| 758 | } |
| 759 | _ => unreachable!(), |
no test coverage detected