Skip to content

Commit e52718d

Browse files
Cache result of last search in Filter leapers
1 parent 80dcbe8 commit e52718d

File tree

1 file changed

+22
-8
lines changed

1 file changed

+22
-8
lines changed

src/treefrog.rs

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,7 @@ pub(crate) mod filter_with {
506506
{
507507
relation: &'leap Relation<(Key, Val)>,
508508
key_func: Func,
509+
old_key_val: Option<((Key, Val), bool)>,
509510
phantom: ::std::marker::PhantomData<Tuple>,
510511
}
511512

@@ -521,6 +522,7 @@ pub(crate) mod filter_with {
521522
FilterWith {
522523
relation,
523524
key_func,
525+
old_key_val: None,
524526
phantom: ::std::marker::PhantomData,
525527
}
526528
}
@@ -536,11 +538,16 @@ pub(crate) mod filter_with {
536538
{
537539
fn count(&mut self, prefix: &Tuple) -> usize {
538540
let key_val = (self.key_func)(prefix);
539-
if self.relation.binary_search(&key_val).is_ok() {
540-
usize::max_value()
541-
} else {
542-
0
541+
542+
if let Some((ref old_key_val, is_present)) = self.old_key_val {
543+
if old_key_val == &key_val {
544+
return if is_present { usize::MAX } else { 0 };
545+
}
543546
}
547+
548+
let is_present = self.relation.binary_search(&key_val).is_ok();
549+
self.old_key_val = Some((key_val, is_present));
550+
if is_present { usize::MAX } else { 0 }
544551
}
545552
fn propose(&mut self, _prefix: &Tuple, _values: &mut Vec<&'leap Val2>) {
546553
panic!("FilterWith::propose(): variable apparently unbound.");
@@ -592,6 +599,7 @@ pub(crate) mod filter_anti {
592599
{
593600
relation: &'leap Relation<(Key, Val)>,
594601
key_func: Func,
602+
old_key_val: Option<((Key, Val), bool)>,
595603
phantom: ::std::marker::PhantomData<Tuple>,
596604
}
597605

@@ -607,6 +615,7 @@ pub(crate) mod filter_anti {
607615
FilterAnti {
608616
relation,
609617
key_func,
618+
old_key_val: None,
610619
phantom: ::std::marker::PhantomData,
611620
}
612621
}
@@ -622,11 +631,16 @@ pub(crate) mod filter_anti {
622631
{
623632
fn count(&mut self, prefix: &Tuple) -> usize {
624633
let key_val = (self.key_func)(prefix);
625-
if self.relation.binary_search(&key_val).is_ok() {
626-
0
627-
} else {
628-
usize::max_value()
634+
635+
if let Some((ref old_key_val, is_present)) = self.old_key_val {
636+
if old_key_val == &key_val {
637+
return if is_present { 0 } else { usize::MAX };
638+
}
629639
}
640+
641+
let is_present = self.relation.binary_search(&key_val).is_ok();
642+
self.old_key_val = Some((key_val, is_present));
643+
if is_present { 0 } else { usize::MAX }
630644
}
631645
fn propose(&mut self, _prefix: &Tuple, _values: &mut Vec<&'leap Val2>) {
632646
panic!("FilterAnti::propose(): variable apparently unbound.");

0 commit comments

Comments
 (0)