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