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