Compares two List/LargeList/FixedSizeList/ListView/LargeListView scalars
(arr1: &dyn Array, arr2: &dyn Array)
| 793 | |
| 794 | /// Compares two List/LargeList/FixedSizeList/ListView/LargeListView scalars |
| 795 | fn partial_cmp_list(arr1: &dyn Array, arr2: &dyn Array) -> Option<Ordering> { |
| 796 | if arr1.data_type() != arr2.data_type() { |
| 797 | return None; |
| 798 | } |
| 799 | let arr1 = first_array_for_list(arr1); |
| 800 | let arr2 = first_array_for_list(arr2); |
| 801 | |
| 802 | let min_length = arr1.len().min(arr2.len()); |
| 803 | let arr1_trimmed = arr1.slice(0, min_length); |
| 804 | let arr2_trimmed = arr2.slice(0, min_length); |
| 805 | |
| 806 | let lt_res = arrow::compute::kernels::cmp::lt(&arr1_trimmed, &arr2_trimmed).ok()?; |
| 807 | let eq_res = arrow::compute::kernels::cmp::eq(&arr1_trimmed, &arr2_trimmed).ok()?; |
| 808 | |
| 809 | for j in 0..lt_res.len() { |
| 810 | // In Postgres, NULL values in lists are always considered to be greater than non-NULL values: |
| 811 | // |
| 812 | // $ SELECT ARRAY[NULL]::integer[] > ARRAY[1] |
| 813 | // true |
| 814 | // |
| 815 | // These next two if statements are introduced for replicating Postgres behavior, as |
| 816 | // arrow::compute does not account for this. |
| 817 | if arr1_trimmed.is_null(j) && !arr2_trimmed.is_null(j) { |
| 818 | return Some(Ordering::Greater); |
| 819 | } |
| 820 | if !arr1_trimmed.is_null(j) && arr2_trimmed.is_null(j) { |
| 821 | return Some(Ordering::Less); |
| 822 | } |
| 823 | |
| 824 | if lt_res.is_valid(j) && lt_res.value(j) { |
| 825 | return Some(Ordering::Less); |
| 826 | } |
| 827 | if eq_res.is_valid(j) && !eq_res.value(j) { |
| 828 | return Some(Ordering::Greater); |
| 829 | } |
| 830 | } |
| 831 | |
| 832 | Some(arr1.len().cmp(&arr2.len())) |
| 833 | } |
| 834 | |
| 835 | fn flatten<'a>(array: &'a StructArray, columns: &mut Vec<&'a ArrayRef>) { |
| 836 | for i in 0..array.num_columns() { |
no test coverage detected
searching dependent graphs…