Skip to content

Commit 80dcbe8

Browse files
Cache range search result for ExtendAnti leaper
1 parent ed72e29 commit 80dcbe8

File tree

1 file changed

+21
-4
lines changed

1 file changed

+21
-4
lines changed

src/treefrog.rs

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,8 @@ pub(crate) mod extend_with {
412412
}
413413

414414
pub(crate) mod extend_anti {
415+
use std::ops::Range;
416+
415417
use super::{binary_search, Leaper, Relation};
416418
use crate::join::gallop;
417419

@@ -425,6 +427,7 @@ pub(crate) mod extend_anti {
425427
{
426428
relation: &'leap Relation<(Key, Val)>,
427429
key_func: Func,
430+
old_key: Option<(Key, Range<usize>)>,
428431
phantom: ::std::marker::PhantomData<Tuple>,
429432
}
430433

@@ -440,6 +443,7 @@ pub(crate) mod extend_anti {
440443
ExtendAnti {
441444
relation,
442445
key_func,
446+
old_key: None,
443447
phantom: ::std::marker::PhantomData,
444448
}
445449
}
@@ -461,10 +465,23 @@ pub(crate) mod extend_anti {
461465
}
462466
fn intersect(&mut self, prefix: &Tuple, values: &mut Vec<&'leap Val>) {
463467
let key = (self.key_func)(prefix);
464-
let start = binary_search(&self.relation.elements, |x| &x.0 < &key);
465-
let slice1 = &self.relation[start..];
466-
let slice2 = gallop(slice1, |x| &x.0 <= &key);
467-
let mut slice = &slice1[..(slice1.len() - slice2.len())];
468+
469+
let range = match self.old_key.as_ref() {
470+
Some((old, range)) if old == &key => range.clone(),
471+
472+
_ => {
473+
let start = binary_search(&self.relation.elements, |x| &x.0 < &key);
474+
let slice1 = &self.relation[start..];
475+
let slice2 = gallop(slice1, |x| &x.0 <= &key);
476+
let range = start..self.relation.len()-slice2.len();
477+
478+
self.old_key = Some((key, range.clone()));
479+
480+
range
481+
}
482+
};
483+
484+
let mut slice = &self.relation[range];
468485
if !slice.is_empty() {
469486
values.retain(|v| {
470487
slice = gallop(slice, |kv| &kv.1 < v);

0 commit comments

Comments
 (0)