MCPcopy Create free account
hub / github.com/apache/datafusion / partial_cmp_list

Function partial_cmp_list

datafusion/common/src/scalar/mod.rs:795–833  ·  view source on GitHub ↗

Compares two List/LargeList/FixedSizeList/ListView/LargeListView scalars

(arr1: &dyn Array, arr2: &dyn Array)

Source from the content-addressed store, hash-verified

793
794/// Compares two List/LargeList/FixedSizeList/ListView/LargeListView scalars
795fn 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
835fn flatten<'a>(array: &'a StructArray, columns: &mut Vec<&'a ArrayRef>) {
836 for i in 0..array.num_columns() {

Callers 1

partial_cmpMethod · 0.85

Calls 10

first_array_for_listFunction · 0.85
eqFunction · 0.85
sliceMethod · 0.80
data_typeMethod · 0.45
minMethod · 0.45
lenMethod · 0.45
is_nullMethod · 0.45
is_validMethod · 0.45
valueMethod · 0.45
cmpMethod · 0.45

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…