Rev 4473: Have _record_annotation start to remove texts when they are no longer needed. in http://bazaar.launchpad.net/~jameinel/bzr/1.17-rework-annotate
John Arbash Meinel
john at arbash-meinel.com
Thu Jun 18 21:35:52 BST 2009
At http://bazaar.launchpad.net/~jameinel/bzr/1.17-rework-annotate
------------------------------------------------------------
revno: 4473
revision-id: john at arbash-meinel.com-20090618203531-ak0yojd30oskp07r
parent: john at arbash-meinel.com-20090618201759-0ik06w0f4pxf5qqt
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: 1.17-rework-annotate
timestamp: Thu 2009-06-18 15:35:31 -0500
message:
Have _record_annotation start to remove texts when they are no longer needed.
-------------- next part --------------
=== modified file 'bzrlib/_annotator_py.py'
--- a/bzrlib/_annotator_py.py 2009-06-18 20:17:59 +0000
+++ b/bzrlib/_annotator_py.py 2009-06-18 20:35:31 +0000
@@ -160,8 +160,16 @@
annotations = [this_annotation] * num_lines
return this_annotation, annotations
- def _cache_annotations(self, key, parent_keys, annotations):
+ def _record_annotation(self, key, parent_keys, annotations):
self._annotations_cache[key] = annotations
+ for parent_key in parent_keys:
+ num = self._num_needed_children[parent_key]
+ num -= 1
+ if num == 0:
+ del self._text_cache[parent_key]
+ # Do we want to clean up _num_needed_children at this point as
+ # well?
+ self._num_needed_children[parent_key] = num
def annotate(self, key):
"""Return annotated fulltext for the given key."""
@@ -176,7 +184,7 @@
for parent in parent_keys[1:]:
self._update_from_other_parents(annotations, text,
this_annotation, parent)
- self._cache_annotations(text_key, parent_keys, annotations)
+ self._record_annotation(text_key, parent_keys, annotations)
try:
annotations = self._annotations_cache[key]
except KeyError:
=== modified file 'bzrlib/tests/test__annotator.py'
--- a/bzrlib/tests/test__annotator.py 2009-06-18 20:17:59 +0000
+++ b/bzrlib/tests/test__annotator.py 2009-06-18 20:35:31 +0000
@@ -223,9 +223,59 @@
self.ann.annotate_flat(self.ff_key))
- def test_needed_keys(self):
+ def test_needed_keys_simple(self):
self.make_simple_text()
keys = self.ann._get_needed_keys(self.fb_key)
self.assertEqual([self.fa_key, self.fb_key], sorted(keys))
self.assertEqual({self.fa_key: 1, self.fb_key: 1},
self.ann._num_needed_children)
+
+ def test_needed_keys_many(self):
+ self.make_many_way_common_merge_text()
+ keys = self.ann._get_needed_keys(self.ff_key)
+ self.assertEqual([self.fa_key, self.fb_key, self.fc_key,
+ self.fd_key, self.fe_key, self.ff_key,
+ ], sorted(keys))
+ self.assertEqual({self.fa_key: 3,
+ self.fb_key: 1,
+ self.fc_key: 1,
+ self.fd_key: 1,
+ self.fe_key: 1,
+ self.ff_key: 1,
+ }, self.ann._num_needed_children)
+
+ def test_record_annotation_removes_texts(self):
+ self.make_many_way_common_merge_text()
+ # Populate the caches
+ for x in self.ann._get_needed_texts(self.ff_key):
+ continue
+ self.assertEqual({self.fa_key: 3,
+ self.fb_key: 1,
+ self.fc_key: 1,
+ self.fd_key: 1,
+ self.fe_key: 1,
+ self.ff_key: 1,
+ }, self.ann._num_needed_children)
+ self.assertEqual([self.fa_key, self.fb_key, self.fc_key,
+ self.fd_key, self.fe_key, self.ff_key,
+ ], sorted(self.ann._text_cache.keys()))
+ self.ann._record_annotation(self.fb_key, [self.fa_key], [])
+ self.assertEqual({self.fa_key: 2,
+ self.fb_key: 1,
+ self.fc_key: 1,
+ self.fd_key: 1,
+ self.fe_key: 1,
+ self.ff_key: 1,
+ }, self.ann._num_needed_children)
+ self.assertTrue(self.fa_key in self.ann._text_cache)
+ self.ann._record_annotation(self.fd_key, [self.fb_key, self.fc_key], [])
+ self.assertEqual({self.fa_key: 2,
+ self.fb_key: 0,
+ self.fc_key: 0,
+ self.fd_key: 1,
+ self.fe_key: 1,
+ self.ff_key: 1,
+ }, self.ann._num_needed_children)
+ self.assertTrue(self.fa_key in self.ann._text_cache)
+ self.assertFalse(self.fb_key in self.ann._text_cache)
+ self.assertFalse(self.fc_key in self.ann._text_cache)
More information about the bazaar-commits
mailing list