Skip to content

Commit 38af34a

Browse files
committed
Add a test for reversing a FixedSizeList with nulls
1 parent 7f3dc5c commit 38af34a

File tree

1 file changed

+33
-5
lines changed

1 file changed

+33
-5
lines changed

datafusion/functions-nested/src/reverse.rs

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -277,11 +277,13 @@ fn fixed_size_array_reverse(
277277
let mut indices: Vec<u64> = Vec::with_capacity(values.len());
278278

279279
for row_index in 0..array.len() {
280-
// skip the null value
280+
// If the (sub) array is null, it doesn't matter what its values are, but
281+
// we do need to insert `value_length` elements since it's a fixed size list
281282
if array.is_null(row_index) {
282-
indices.push(0);
283+
indices.extend(vec![0; value_length]);
283284
continue;
284285
}
286+
285287
let start = row_index * value_length;
286288
let end = start + value_length;
287289
for idx in (start..end).rev() {
@@ -302,11 +304,11 @@ fn fixed_size_array_reverse(
302304

303305
#[cfg(test)]
304306
mod tests {
305-
use crate::reverse::list_view_reverse;
307+
use crate::reverse::{fixed_size_array_reverse, list_view_reverse};
306308
use arrow::{
307309
array::{
308-
AsArray, GenericListViewArray, Int32Array, LargeListViewArray, ListViewArray,
309-
OffsetSizeTrait,
310+
AsArray, FixedSizeListArray, GenericListViewArray, Int32Array,
311+
LargeListViewArray, ListViewArray, OffsetSizeTrait,
310312
},
311313
buffer::{NullBuffer, ScalarBuffer},
312314
datatypes::{DataType, Field, Int32Type},
@@ -323,6 +325,13 @@ mod tests {
323325
.collect()
324326
}
325327

328+
fn fixed_size_list_values(array: &FixedSizeListArray) -> Vec<Option<Vec<i32>>> {
329+
array
330+
.iter()
331+
.map(|x| x.map(|x| x.as_primitive::<Int32Type>().values().to_vec()))
332+
.collect()
333+
}
334+
326335
#[test]
327336
fn test_reverse_list_view() -> Result<()> {
328337
let field = Arc::new(Field::new("a", DataType::Int32, false));
@@ -461,4 +470,23 @@ mod tests {
461470
assert_eq!(expected, reversed);
462471
Ok(())
463472
}
473+
474+
#[test]
475+
fn test_reverse_fixed_size_list() -> Result<()> {
476+
let field = Arc::new(Field::new("a", DataType::Int32, false));
477+
let values = Arc::new(Int32Array::from(vec![1, 2, 3, 4, 5, 6, 7, 8, 9]));
478+
let result = fixed_size_array_reverse(
479+
&FixedSizeListArray::new(
480+
field,
481+
3,
482+
values,
483+
Some(NullBuffer::from(vec![true, false, true])),
484+
),
485+
&Arc::new(Field::new("test", DataType::Int32, true)),
486+
)?;
487+
let reversed = fixed_size_list_values(result.as_fixed_size_list());
488+
let expected = vec![Some(vec![3, 2, 1]), None, Some(vec![9, 8, 7])];
489+
assert_eq!(expected, reversed);
490+
Ok(())
491+
}
464492
}

0 commit comments

Comments
 (0)