Skip to content

Commit 3f9da4d

Browse files
committed
arrow-row: Add tests with nested ListView
1 parent 57a8d3f commit 3f9da4d

File tree

1 file changed

+155
-0
lines changed

1 file changed

+155
-0
lines changed

arrow-row/src/lib.rs

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3354,14 +3354,169 @@ mod tests {
33543354
back[0].to_data().validate_full().unwrap();
33553355
}
33563356

3357+
fn test_nested_list_view<O: OffsetSizeTrait>() {
3358+
let mut builder = GenericListViewBuilder::<O, _>::new(GenericListViewBuilder::<O, _>::new(
3359+
Int32Builder::new(),
3360+
));
3361+
3362+
// Row 0: [[1, 2], [1, null]]
3363+
builder.values().values().append_value(1);
3364+
builder.values().values().append_value(2);
3365+
builder.values().append(true);
3366+
builder.values().values().append_value(1);
3367+
builder.values().values().append_null();
3368+
builder.values().append(true);
3369+
builder.append(true);
3370+
3371+
// Row 1: [[1, null], [1, null]]
3372+
builder.values().values().append_value(1);
3373+
builder.values().values().append_null();
3374+
builder.values().append(true);
3375+
builder.values().values().append_value(1);
3376+
builder.values().values().append_null();
3377+
builder.values().append(true);
3378+
builder.append(true);
3379+
3380+
// Row 2: [[1, null], null]
3381+
builder.values().values().append_value(1);
3382+
builder.values().values().append_null();
3383+
builder.values().append(true);
3384+
builder.values().append(false);
3385+
builder.append(true);
3386+
3387+
// Row 3: null
3388+
builder.append(false);
3389+
3390+
// Row 4: [[1, 2]]
3391+
builder.values().values().append_value(1);
3392+
builder.values().values().append_value(2);
3393+
builder.values().append(true);
3394+
builder.append(true);
3395+
3396+
let list = Arc::new(builder.finish()) as ArrayRef;
3397+
let d = list.data_type().clone();
3398+
3399+
// [
3400+
// [[1, 2], [1, null]],
3401+
// [[1, null], [1, null]],
3402+
// [[1, null], null]
3403+
// null
3404+
// [[1, 2]]
3405+
// ]
3406+
let options = SortOptions::default().asc().with_nulls_first(true);
3407+
let field = SortField::new_with_options(d.clone(), options);
3408+
let converter = RowConverter::new(vec![field]).unwrap();
3409+
let rows = converter.convert_columns(&[Arc::clone(&list)]).unwrap();
3410+
3411+
assert!(rows.row(0) > rows.row(1));
3412+
assert!(rows.row(1) > rows.row(2));
3413+
assert!(rows.row(2) > rows.row(3));
3414+
assert!(rows.row(4) < rows.row(0));
3415+
assert!(rows.row(4) > rows.row(1));
3416+
3417+
let back = converter.convert_rows(&rows).unwrap();
3418+
assert_eq!(back.len(), 1);
3419+
back[0].to_data().validate_full().unwrap();
3420+
3421+
// Verify the content matches (ListView may have different physical layout but same logical content)
3422+
let back_list_view = back[0]
3423+
.as_any()
3424+
.downcast_ref::<GenericListViewArray<O>>()
3425+
.unwrap();
3426+
let orig_list_view = list
3427+
.as_any()
3428+
.downcast_ref::<GenericListViewArray<O>>()
3429+
.unwrap();
3430+
3431+
assert_eq!(back_list_view.len(), orig_list_view.len());
3432+
for i in 0..back_list_view.len() {
3433+
assert_eq!(back_list_view.is_valid(i), orig_list_view.is_valid(i));
3434+
if back_list_view.is_valid(i) {
3435+
assert_eq!(&back_list_view.value(i), &orig_list_view.value(i));
3436+
}
3437+
}
3438+
3439+
let options = SortOptions::default().desc().with_nulls_first(true);
3440+
let field = SortField::new_with_options(d.clone(), options);
3441+
let converter = RowConverter::new(vec![field]).unwrap();
3442+
let rows = converter.convert_columns(&[Arc::clone(&list)]).unwrap();
3443+
3444+
assert!(rows.row(0) > rows.row(1));
3445+
assert!(rows.row(1) > rows.row(2));
3446+
assert!(rows.row(2) > rows.row(3));
3447+
assert!(rows.row(4) > rows.row(0));
3448+
assert!(rows.row(4) > rows.row(1));
3449+
3450+
let back = converter.convert_rows(&rows).unwrap();
3451+
assert_eq!(back.len(), 1);
3452+
back[0].to_data().validate_full().unwrap();
3453+
3454+
// Verify the content matches
3455+
let back_list_view = back[0]
3456+
.as_any()
3457+
.downcast_ref::<GenericListViewArray<O>>()
3458+
.unwrap();
3459+
3460+
assert_eq!(back_list_view.len(), orig_list_view.len());
3461+
for i in 0..back_list_view.len() {
3462+
assert_eq!(back_list_view.is_valid(i), orig_list_view.is_valid(i));
3463+
if back_list_view.is_valid(i) {
3464+
assert_eq!(&back_list_view.value(i), &orig_list_view.value(i));
3465+
}
3466+
}
3467+
3468+
let options = SortOptions::default().desc().with_nulls_first(false);
3469+
let field = SortField::new_with_options(d.clone(), options);
3470+
let converter = RowConverter::new(vec![field]).unwrap();
3471+
let rows = converter.convert_columns(&[Arc::clone(&list)]).unwrap();
3472+
3473+
assert!(rows.row(0) < rows.row(1));
3474+
assert!(rows.row(1) < rows.row(2));
3475+
assert!(rows.row(2) < rows.row(3));
3476+
assert!(rows.row(4) > rows.row(0));
3477+
assert!(rows.row(4) < rows.row(1));
3478+
3479+
let back = converter.convert_rows(&rows).unwrap();
3480+
assert_eq!(back.len(), 1);
3481+
back[0].to_data().validate_full().unwrap();
3482+
3483+
// Verify the content matches
3484+
let back_list_view = back[0]
3485+
.as_any()
3486+
.downcast_ref::<GenericListViewArray<O>>()
3487+
.unwrap();
3488+
3489+
assert_eq!(back_list_view.len(), orig_list_view.len());
3490+
for i in 0..back_list_view.len() {
3491+
assert_eq!(back_list_view.is_valid(i), orig_list_view.is_valid(i));
3492+
if back_list_view.is_valid(i) {
3493+
assert_eq!(&back_list_view.value(i), &orig_list_view.value(i));
3494+
}
3495+
}
3496+
3497+
let sliced_list = list.slice(1, 3);
3498+
let rows = converter
3499+
.convert_columns(&[Arc::clone(&sliced_list)])
3500+
.unwrap();
3501+
3502+
assert!(rows.row(0) < rows.row(1));
3503+
assert!(rows.row(1) < rows.row(2));
3504+
3505+
let back = converter.convert_rows(&rows).unwrap();
3506+
assert_eq!(back.len(), 1);
3507+
back[0].to_data().validate_full().unwrap();
3508+
}
3509+
33573510
#[test]
33583511
fn test_list_view() {
33593512
test_single_list_view::<i32>();
3513+
test_nested_list_view::<i32>();
33603514
}
33613515

33623516
#[test]
33633517
fn test_large_list_view() {
33643518
test_single_list_view::<i64>();
3519+
test_nested_list_view::<i64>();
33653520
}
33663521

33673522
fn test_list_view_with_shared_values<O: OffsetSizeTrait>() {

0 commit comments

Comments
 (0)