use crate::stream::relational::index::{IntervalIndex, OrderedIndex};
use crate::stream::relational::DenseRowStore;
use crate::stream::relational::RowHandle;
fn handles(n: usize) -> Vec<RowHandle> {
let mut store = DenseRowStore::new();
(0..n).map(|i| store.insert(i)).collect()
}
#[test]
fn ordered_probes_honor_strict_and_inclusive_bounds() {
let live = handles(5);
let mut index: OrderedIndex<i64> = OrderedIndex::new();
for (handle, key) in live.iter().zip([10i64, 20, 20, 30, 40]) {
index.insert(*handle, key);
}
assert_eq!(index.less_than(&20, false), vec![live[0]]);
assert_eq!(index.less_than(&20, true), vec![live[0], live[1], live[2]]);
assert_eq!(index.greater_than(&20, false), vec![live[3], live[4]]);
assert_eq!(
index.greater_than(&20, true),
vec![live[1], live[2], live[3], live[4]]
);
index.remove(live[1]);
assert_eq!(index.less_than(&20, true), vec![live[0], live[2]]);
index.remove(live[0]);
index.remove(live[2]);
assert_eq!(index.less_than(&20, true), vec![]);
}
#[test]
fn interval_narrowing_keeps_every_overlap_candidate() {
let live = handles(4);
let mut index: IntervalIndex<i64> = IntervalIndex::new();
for (handle, (s, e)) in live
.iter()
.zip([(0i64, 10i64), (5, 15), (10, 20), (30, 40)])
{
index.insert(*handle, s, e);
}
let mut got = index.overlapping(8, 12);
got.sort();
let mut want = vec![live[0], live[1], live[2]];
want.sort();
assert_eq!(got, want);
assert_eq!(index.overlapping(20, 30), vec![]);
index.remove(live[1]);
let mut got = index.overlapping(8, 12);
got.sort();
assert_eq!(got, vec![live[0], live[2]]);
}