| 846 | } |
| 847 | |
| 848 | pub fn partial_cmp_struct(s1: &StructArray, s2: &StructArray) -> Option<Ordering> { |
| 849 | if s1.len() != s2.len() { |
| 850 | return None; |
| 851 | } |
| 852 | |
| 853 | if s1.data_type() != s2.data_type() { |
| 854 | return None; |
| 855 | } |
| 856 | |
| 857 | let mut expanded_columns1 = Vec::with_capacity(s1.num_columns()); |
| 858 | let mut expanded_columns2 = Vec::with_capacity(s2.num_columns()); |
| 859 | |
| 860 | flatten(s1, &mut expanded_columns1); |
| 861 | flatten(s2, &mut expanded_columns2); |
| 862 | |
| 863 | for col_index in 0..expanded_columns1.len() { |
| 864 | let arr1 = expanded_columns1[col_index]; |
| 865 | let arr2 = expanded_columns2[col_index]; |
| 866 | |
| 867 | let lt_res = arrow::compute::kernels::cmp::lt(arr1, arr2).ok()?; |
| 868 | let eq_res = arrow::compute::kernels::cmp::eq(arr1, arr2).ok()?; |
| 869 | |
| 870 | for j in 0..lt_res.len() { |
| 871 | if lt_res.is_valid(j) && lt_res.value(j) { |
| 872 | return Some(Ordering::Less); |
| 873 | } |
| 874 | if eq_res.is_valid(j) && !eq_res.value(j) { |
| 875 | return Some(Ordering::Greater); |
| 876 | } |
| 877 | } |
| 878 | } |
| 879 | Some(Ordering::Equal) |
| 880 | } |
| 881 | |
| 882 | fn partial_cmp_map(m1: &Arc<MapArray>, m2: &Arc<MapArray>) -> Option<Ordering> { |
| 883 | if m1.len() != m2.len() { |