use aisle::{roaring_to_row_selection, row_selection_to_roaring};
use parquet::arrow::arrow_reader::{RowSelection, RowSelector};
#[test]
fn test_large_dataset_roaring_returns_none() {
let large_dataset_rows = u32::MAX as u64 + 1000;
let selection = RowSelection::from(vec![
RowSelector::skip(1000),
RowSelector::select(500),
RowSelector::skip(2000),
RowSelector::select(1500),
]);
let roaring = row_selection_to_roaring(&selection, large_dataset_rows);
assert!(
roaring.is_none(),
"RoaringBitmap conversion should return None for datasets > u32::MAX"
);
}
#[test]
fn test_boundary_condition_at_u32_max() {
let max_rows = u32::MAX as u64;
let selection = RowSelection::from(vec![RowSelector::skip(100), RowSelector::select(1000)]);
let roaring = row_selection_to_roaring(&selection, max_rows);
assert!(
roaring.is_some(),
"RoaringBitmap should work for datasets at exactly u32::MAX"
);
let bitmap = roaring.unwrap();
assert_eq!(
bitmap.len(),
1000,
"Bitmap should contain exactly 1000 selected rows"
);
let recovered = roaring_to_row_selection(&bitmap, max_rows as usize);
let recovered_selectors: Vec<RowSelector> = recovered.into();
let selected_count: usize = recovered_selectors
.iter()
.filter(|s| !s.skip)
.map(|s| s.row_count)
.sum();
assert_eq!(
selected_count, 1000,
"Round-trip should preserve 1000 selected rows"
);
}
#[test]
fn test_row_selection_works_for_any_size() {
let very_large = u64::MAX / 2;
let selection = RowSelection::from(vec![
RowSelector::skip(very_large as usize / 2),
RowSelector::select(1000),
]);
let selectors: Vec<RowSelector> = selection.into();
assert_eq!(selectors.len(), 2);
let selection_again = RowSelection::from(vec![
RowSelector::skip(very_large as usize / 2),
RowSelector::select(1000),
]);
let roaring = row_selection_to_roaring(&selection_again, very_large);
assert!(
roaring.is_none(),
"Should return None for very large datasets"
);
}
#[test]
fn test_small_dataset_still_works() {
let small_dataset = 1_000_000u64;
let selection = RowSelection::from(vec![
RowSelector::skip(100_000),
RowSelector::select(500_000),
RowSelector::skip(200_000),
RowSelector::select(200_000),
]);
let roaring = row_selection_to_roaring(&selection, small_dataset);
assert!(
roaring.is_some(),
"RoaringBitmap should work for normal-sized datasets"
);
let bitmap = roaring.unwrap();
assert_eq!(
bitmap.len(),
700_000,
"Should select 700k rows (500k + 200k)"
);
}