This is an automated email from the ASF dual-hosted git repository.

alamb pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git


The following commit(s) were added to refs/heads/main by this push:
     new a65a984b6d test: add tests for converting sliced list to row based 
(#7994)
a65a984b6d is described below

commit a65a984b6db899c7bb2e909ba801773c05d07acb
Author: Raz Luvaton <[email protected]>
AuthorDate: Sun Jul 27 13:18:46 2025 +0300

    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 <[email protected]>
---
 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 325d2953c8..96e9267605 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<O: OffsetSizeTrait>() {
@@ -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::<Int32Type>(len, 0.8)),
             1 => Arc::new(generate_primitive_array::<UInt32Type>(len, 0.8)),
             2 => Arc::new(generate_primitive_array::<Int64Type>(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::<Int64Type>(values_len, 
0.8))
+                })
+                .slice(500, len),
+            ),
             _ => unreachable!(),
         }
     }

Reply via email to