Rev 3804: Change LeafNode to also cache its unique serialized prefix. in http://bzr.arbash-meinel.com/branches/bzr/brisbane/prefix

John Arbash Meinel john at arbash-meinel.com
Thu Dec 11 22:07:08 GMT 2008


At http://bzr.arbash-meinel.com/branches/bzr/brisbane/prefix

------------------------------------------------------------
revno: 3804
revision-id: john at arbash-meinel.com-20081211220700-qdw8se3w1j6gxl58
parent: john at arbash-meinel.com-20081211215745-zri692db6y34p7re
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: prefix
timestamp: Thu 2008-12-11 16:07:00 -0600
message:
  Change LeafNode to also cache its unique serialized prefix.
-------------- next part --------------
=== modified file 'bzrlib/chk_map.py'
--- a/bzrlib/chk_map.py	2008-12-11 21:57:45 +0000
+++ b/bzrlib/chk_map.py	2008-12-11 22:07:00 +0000
@@ -482,6 +482,7 @@
         result._key = key
         result._key_width = width
         result._size = len(bytes)
+        result._serialised_prefix = result.unique_serialised_prefix()
         return result
 
     def iteritems(self, store, key_filter=None):
@@ -524,6 +525,12 @@
         self._items[key] = value
         self._size += self._key_value_len(key, value)
         self._len += 1
+        serialised_key = self._serialised_key(key)
+        if self._serialised_prefix is None:
+            self._serialised_prefix = serialised_key
+        elif not serialised_key.startswith(self._serialised_prefix):
+            self._serialised_prefix = self.common_prefix(
+                self._serialised_prefix, serialised_key)
         if (self._len > 1
             and self._maximum_size
             and self._current_size() > self._maximum_size):
@@ -538,7 +545,7 @@
 
         :return: (common_serialized_prefix, [(node_serialized_prefix, node)])
         """
-        common_prefix = self.unique_serialised_prefix()
+        common_prefix = self._serialised_prefix
         split_at = len(common_prefix) + 1
         result = {}
         for key, value in self._items.iteritems():
@@ -573,7 +580,7 @@
         if self._map_no_split(key, value):
             return self._split(store)
         else:
-            return self.unique_serialised_prefix(), [("", self)]
+            return self._serialised_prefix, [("", self)]
 
     def serialise(self, store):
         """Serialise the tree to store.
@@ -626,6 +633,8 @@
         self._len -= 1
         del self._items[key]
         self._key = None
+        # Recompute from scratch
+        self._serialised_prefix = self.unique_serialised_prefix()
         return self
 
 
@@ -810,10 +819,8 @@
                 # at this level. Or the LeafNode has shrunk in size, so we need
                 # to check that as well.
                 new_node = self._check_remap(store)
-            if new_node._serialised_prefix is None:
-                return new_node.unique_serialised_prefix(), [("", new_node)]
-            else:
-                return new_node._serialised_prefix, [('', new_node)]
+            assert new_node._serialised_prefix is not None
+            return new_node._serialised_prefix, [('', new_node)]
         # child has overflown - create a new intermediate node.
         # XXX: This is where we might want to try and expand our depth
         # to refer to more bytes of every child (which would give us

=== modified file 'bzrlib/tests/test_chk_map.py'
--- a/bzrlib/tests/test_chk_map.py	2008-12-11 21:57:45 +0000
+++ b/bzrlib/tests/test_chk_map.py	2008-12-11 22:07:00 +0000
@@ -82,12 +82,12 @@
             if node_one.__class__ != node_two.__class__:
                 self.assertEqualDiff(map_one._dump_tree(),
                                      map_two._dump_tree())
+            self.assertEqual(node_one._serialised_prefix,
+                             node_two._serialised_prefix)
             if isinstance(node_one, InternalNode):
                 # Internal nodes must have identical references
                 self.assertEqual(sorted(node_one._items.keys()),
                                  sorted(node_two._items.keys()))
-                self.assertEqual(node_one._serialised_prefix,
-                                 node_two._serialised_prefix)
                 node_one_stack.extend(node_one._iter_nodes(map_one._store))
                 node_two_stack.extend(node_two._iter_nodes(map_two._store))
             else:



More information about the bazaar-commits mailing list