diff --git a/arrow-row/src/lib.rs b/arrow-row/src/lib.rs index 325d2953c858..96e92676051d 100644 --- a/arrow-row/src/lib.rs +++ b/arrow-row/src/lib.rs @@ -2357,6 +2357,22 @@ mod tests { assert_eq!(back.len(), 1); back[0].to_data().validate_full().unwrap(); assert_eq!(&back[0], &list); + + let sliced_list = list.slice(1, 5); + let rows_on_sliced_list = converter + .convert_columns(&[Arc::clone(&sliced_list)]) + .unwrap(); + + assert!(rows_on_sliced_list.row(1) > rows_on_sliced_list.row(0)); // [32, 52] > [32, 52, 12] + assert!(rows_on_sliced_list.row(2) < rows_on_sliced_list.row(1)); // null < [32, 52] + assert!(rows_on_sliced_list.row(3) < rows_on_sliced_list.row(1)); // [32, null] < [32, 52] + assert!(rows_on_sliced_list.row(4) > rows_on_sliced_list.row(1)); // [] > [32, 52] + assert!(rows_on_sliced_list.row(2) < rows_on_sliced_list.row(4)); // null < [] + + let back = converter.convert_rows(&rows_on_sliced_list).unwrap(); + assert_eq!(back.len(), 1); + back[0].to_data().validate_full().unwrap(); + assert_eq!(&back[0], &sliced_list); } fn test_nested_list() { @@ -2448,6 +2464,19 @@ mod tests { assert_eq!(back.len(), 1); back[0].to_data().validate_full().unwrap(); assert_eq!(&back[0], &list); + + let sliced_list = list.slice(1, 3); + let rows = converter + .convert_columns(&[Arc::clone(&sliced_list)]) + .unwrap(); + + assert!(rows.row(0) < rows.row(1)); + assert!(rows.row(1) < rows.row(2)); + + let back = converter.convert_rows(&rows).unwrap(); + assert_eq!(back.len(), 1); + back[0].to_data().validate_full().unwrap(); + assert_eq!(&back[0], &sliced_list); } #[test] @@ -2568,6 +2597,21 @@ mod tests { assert_eq!(back.len(), 1); back[0].to_data().validate_full().unwrap(); assert_eq!(&back[0], &list); + + let sliced_list = list.slice(1, 5); + let rows_on_sliced_list = converter + .convert_columns(&[Arc::clone(&sliced_list)]) + .unwrap(); + + assert!(rows_on_sliced_list.row(2) < rows_on_sliced_list.row(1)); // null < [32, 52, null] + assert!(rows_on_sliced_list.row(3) < rows_on_sliced_list.row(1)); // [32, null, null] < [32, 52, null] + assert!(rows_on_sliced_list.row(4) < rows_on_sliced_list.row(1)); // [null, null, null] > [32, 52, null] + assert!(rows_on_sliced_list.row(2) < rows_on_sliced_list.row(4)); // null < [null, null, null] + + let back = converter.convert_rows(&rows_on_sliced_list).unwrap(); + assert_eq!(back.len(), 1); + back[0].to_data().validate_full().unwrap(); + assert_eq!(&back[0], &sliced_list); } #[test] @@ -2907,7 +2951,7 @@ mod tests { fn generate_column(len: usize) -> ArrayRef { let mut rng = rng(); - match rng.random_range(0..17) { + match rng.random_range(0..18) { 0 => Arc::new(generate_primitive_array::(len, 0.8)), 1 => Arc::new(generate_primitive_array::(len, 0.8)), 2 => Arc::new(generate_primitive_array::(len, 0.8)), @@ -2944,6 +2988,12 @@ mod tests { 14 => Arc::new(generate_string_view(len, 0.8)), 15 => Arc::new(generate_byte_view(len, 0.8)), 16 => Arc::new(generate_fixed_stringview_column(len)), + 17 => Arc::new( + generate_list(len + 1000, 0.8, |values_len| { + Arc::new(generate_primitive_array::(values_len, 0.8)) + }) + .slice(500, len), + ), _ => unreachable!(), } }