From a65a984b6db899c7bb2e909ba801773c05d07acb Mon Sep 17 00:00:00 2001 From: Raz Luvaton <16746759+rluvaton@users.noreply.github.com> Date: Sun, 27 Jul 2025 13:18:46 +0300 Subject: [PATCH] test: add tests for converting sliced list to row based (#7994) # Which issue does this PR close? Before I fix the issue below I wanna add tests: - #7993 # Rationale for this change When started fixing #7993 and I wanted to know if there were any tests that will protect me so I only changed: https://github.com/apache/arrow-rs/blob/16794ab14fa62ecf67de0da9460cc5752a9358f4/arrow-row/src/lib.rs#L520-L526 to: ```rust let values = match array.data_type() { DataType::List(_) => { let list_array = as_list_array(array); let first_offset = list_array.offsets()[0] as usize; let last_offset = list_array.offsets()[list_array.offsets().len() - 1] as usize; list_array.values().slice(first_offset, last_offset - first_offset) }, DataType::LargeList(_) => { let list_array = as_large_list_array(array); let first_offset = list_array.offsets()[0] as usize; let last_offset = list_array.offsets()[list_array.offsets().len() - 1] as usize; list_array.values().slice(first_offset, last_offset - first_offset) }, DataType::FixedSizeList(_, _) => as_fixed_size_list_array(array).values().clone(), _ => unreachable!(), }; let rows = converter.convert_columns(&[values])?; ``` and no test failed # What changes are included in this PR? just added tests # Are these changes tested? - # Are there any user-facing changes? No --------- Co-authored-by: Andrew Lamb --- arrow-row/src/lib.rs | 52 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) 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!(), } }