in arrow-ord/src/sort.rs [3647:4050]
fn test_lex_sort_mixed_types() {
let input = vec![
SortColumn {
values: Arc::new(PrimitiveArray::<Int64Type>::from(vec![
Some(0),
Some(2),
Some(-1),
Some(0),
])) as ArrayRef,
options: None,
},
SortColumn {
values: Arc::new(PrimitiveArray::<UInt32Type>::from(vec![
Some(101),
Some(8),
Some(7),
Some(102),
])) as ArrayRef,
options: None,
},
SortColumn {
values: Arc::new(PrimitiveArray::<Int64Type>::from(vec![
Some(-1),
Some(-2),
Some(-3),
Some(-4),
])) as ArrayRef,
options: None,
},
];
let expected = vec![
Arc::new(PrimitiveArray::<Int64Type>::from(vec![
Some(-1),
Some(0),
Some(0),
Some(2),
])) as ArrayRef,
Arc::new(PrimitiveArray::<UInt32Type>::from(vec![
Some(7),
Some(101),
Some(102),
Some(8),
])) as ArrayRef,
Arc::new(PrimitiveArray::<Int64Type>::from(vec![
Some(-3),
Some(-1),
Some(-4),
Some(-2),
])) as ArrayRef,
];
test_lex_sort_arrays(input.clone(), expected.clone(), None);
test_lex_sort_arrays(input, slice_arrays(expected, 0, 2), Some(2));
// test mix of string and in64 with option
let input = vec![
SortColumn {
values: Arc::new(PrimitiveArray::<Int64Type>::from(vec![
Some(0),
Some(2),
Some(-1),
Some(0),
])) as ArrayRef,
options: Some(SortOptions {
descending: true,
nulls_first: true,
}),
},
SortColumn {
values: Arc::new(StringArray::from(vec![
Some("foo"),
Some("9"),
Some("7"),
Some("bar"),
])) as ArrayRef,
options: Some(SortOptions {
descending: true,
nulls_first: true,
}),
},
];
let expected = vec![
Arc::new(PrimitiveArray::<Int64Type>::from(vec![
Some(2),
Some(0),
Some(0),
Some(-1),
])) as ArrayRef,
Arc::new(StringArray::from(vec![
Some("9"),
Some("foo"),
Some("bar"),
Some("7"),
])) as ArrayRef,
];
test_lex_sort_arrays(input.clone(), expected.clone(), None);
test_lex_sort_arrays(input, slice_arrays(expected, 0, 3), Some(3));
// test sort with nulls first
let input = vec![
SortColumn {
values: Arc::new(PrimitiveArray::<Int64Type>::from(vec![
None,
Some(-1),
Some(2),
None,
])) as ArrayRef,
options: Some(SortOptions {
descending: true,
nulls_first: true,
}),
},
SortColumn {
values: Arc::new(StringArray::from(vec![
Some("foo"),
Some("world"),
Some("hello"),
None,
])) as ArrayRef,
options: Some(SortOptions {
descending: true,
nulls_first: true,
}),
},
];
let expected = vec![
Arc::new(PrimitiveArray::<Int64Type>::from(vec![
None,
None,
Some(2),
Some(-1),
])) as ArrayRef,
Arc::new(StringArray::from(vec![
None,
Some("foo"),
Some("hello"),
Some("world"),
])) as ArrayRef,
];
test_lex_sort_arrays(input.clone(), expected.clone(), None);
test_lex_sort_arrays(input, slice_arrays(expected, 0, 1), Some(1));
// test sort with nulls last
let input = vec![
SortColumn {
values: Arc::new(PrimitiveArray::<Int64Type>::from(vec![
None,
Some(-1),
Some(2),
None,
])) as ArrayRef,
options: Some(SortOptions {
descending: true,
nulls_first: false,
}),
},
SortColumn {
values: Arc::new(StringArray::from(vec![
Some("foo"),
Some("world"),
Some("hello"),
None,
])) as ArrayRef,
options: Some(SortOptions {
descending: true,
nulls_first: false,
}),
},
];
let expected = vec![
Arc::new(PrimitiveArray::<Int64Type>::from(vec![
Some(2),
Some(-1),
None,
None,
])) as ArrayRef,
Arc::new(StringArray::from(vec![
Some("hello"),
Some("world"),
Some("foo"),
None,
])) as ArrayRef,
];
test_lex_sort_arrays(input.clone(), expected.clone(), None);
test_lex_sort_arrays(input, slice_arrays(expected, 0, 2), Some(2));
// test sort with opposite options
let input = vec![
SortColumn {
values: Arc::new(PrimitiveArray::<Int64Type>::from(vec![
None,
Some(-1),
Some(2),
Some(-1),
None,
])) as ArrayRef,
options: Some(SortOptions {
descending: false,
nulls_first: false,
}),
},
SortColumn {
values: Arc::new(StringArray::from(vec![
Some("foo"),
Some("bar"),
Some("world"),
Some("hello"),
None,
])) as ArrayRef,
options: Some(SortOptions {
descending: true,
nulls_first: true,
}),
},
];
let expected = vec![
Arc::new(PrimitiveArray::<Int64Type>::from(vec![
Some(-1),
Some(-1),
Some(2),
None,
None,
])) as ArrayRef,
Arc::new(StringArray::from(vec![
Some("hello"),
Some("bar"),
Some("world"),
None,
Some("foo"),
])) as ArrayRef,
];
test_lex_sort_arrays(input.clone(), expected.clone(), None);
test_lex_sort_arrays(input.clone(), slice_arrays(expected.clone(), 0, 5), Some(5));
// Limiting by more rows than present is ok
test_lex_sort_arrays(input, slice_arrays(expected, 0, 5), Some(10));
// test with FixedSizeListArray, arrays order: [UInt32, FixedSizeList(UInt32, 1)]
// case1
let primitive_array_data = vec![
Some(2),
Some(3),
Some(2),
Some(0),
None,
Some(2),
Some(1),
Some(2),
];
let list_array_data = vec![
None,
Some(vec![Some(4)]),
Some(vec![Some(3)]),
Some(vec![Some(1)]),
Some(vec![Some(5)]),
Some(vec![Some(0)]),
Some(vec![Some(2)]),
Some(vec![None]),
];
let expected_primitive_array_data = vec![
None,
Some(0),
Some(1),
Some(2),
Some(2),
Some(2),
Some(2),
Some(3),
];
let expected_list_array_data = vec![
Some(vec![Some(5)]),
Some(vec![Some(1)]),
Some(vec![Some(2)]),
None, // <-
Some(vec![None]),
Some(vec![Some(0)]),
Some(vec![Some(3)]), // <-
Some(vec![Some(4)]),
];
test_lex_sort_mixed_types_with_fixed_size_list::<Int32Type>(
primitive_array_data.clone(),
list_array_data.clone(),
expected_primitive_array_data.clone(),
expected_list_array_data,
None,
None,
);
// case2
let primitive_array_options = SortOptions {
descending: false,
nulls_first: true,
};
let list_array_options = SortOptions {
descending: false,
nulls_first: false, // has been modified
};
let expected_list_array_data = vec![
Some(vec![Some(5)]),
Some(vec![Some(1)]),
Some(vec![Some(2)]),
Some(vec![Some(0)]), // <-
Some(vec![Some(3)]),
Some(vec![None]),
None, // <-
Some(vec![Some(4)]),
];
test_lex_sort_mixed_types_with_fixed_size_list::<Int32Type>(
primitive_array_data.clone(),
list_array_data.clone(),
expected_primitive_array_data.clone(),
expected_list_array_data,
Some(primitive_array_options),
Some(list_array_options),
);
// case3
let primitive_array_options = SortOptions {
descending: false,
nulls_first: true,
};
let list_array_options = SortOptions {
descending: true, // has been modified
nulls_first: true,
};
let expected_list_array_data = vec![
Some(vec![Some(5)]),
Some(vec![Some(1)]),
Some(vec![Some(2)]),
None, // <-
Some(vec![None]),
Some(vec![Some(3)]),
Some(vec![Some(0)]), // <-
Some(vec![Some(4)]),
];
test_lex_sort_mixed_types_with_fixed_size_list::<Int32Type>(
primitive_array_data.clone(),
list_array_data.clone(),
expected_primitive_array_data,
expected_list_array_data,
Some(primitive_array_options),
Some(list_array_options),
);
// test with ListArray/LargeListArray, arrays order: [List<UInt32>/LargeList<UInt32>, UInt32]
let list_array_data = vec![
Some(vec![Some(2), Some(1)]), // 0
None, // 10
Some(vec![Some(3)]), // 1
Some(vec![Some(2), Some(0)]), // 2
Some(vec![None, Some(2)]), // 3
Some(vec![Some(0)]), // none
None, // 11
Some(vec![Some(2), None]), // 4
Some(vec![None]), // 5
Some(vec![Some(2), Some(1)]), // 6
];
let primitive_array_data = vec![
Some(0),
Some(10),
Some(1),
Some(2),
Some(3),
None,
Some(11),
Some(4),
Some(5),
Some(6),
];
let expected_list_array_data = vec![
None,
None,
Some(vec![None]),
Some(vec![None, Some(2)]),
Some(vec![Some(0)]),
Some(vec![Some(2), None]),
Some(vec![Some(2), Some(0)]),
Some(vec![Some(2), Some(1)]),
Some(vec![Some(2), Some(1)]),
Some(vec![Some(3)]),
];
let expected_primitive_array_data = vec![
Some(10),
Some(11),
Some(5),
Some(3),
None,
Some(4),
Some(2),
Some(0),
Some(6),
Some(1),
];
test_lex_sort_mixed_types_with_list::<Int32Type>(
list_array_data.clone(),
primitive_array_data.clone(),
expected_list_array_data,
expected_primitive_array_data,
None,
None,
);
}