Rev 4800: Initial implementation of iter_entries. in http://bazaar.launchpad.net/~jameinel/bzr/chk-index
John Arbash Meinel
john at arbash-meinel.com
Wed Oct 28 19:52:35 GMT 2009
At http://bazaar.launchpad.net/~jameinel/bzr/chk-index
------------------------------------------------------------
revno: 4800
revision-id: john at arbash-meinel.com-20091028195226-rf8w9cjve29ourj9
parent: john at arbash-meinel.com-20091028193322-psg0tagb5xubpq51
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: chk-index
timestamp: Wed 2009-10-28 14:52:26 -0500
message:
Initial implementation of iter_entries.
-------------- next part --------------
=== modified file 'bzrlib/chk_index.py'
--- a/bzrlib/chk_index.py 2009-10-28 19:33:22 +0000
+++ b/bzrlib/chk_index.py 2009-10-28 19:52:26 +0000
@@ -712,6 +712,43 @@
to_key = self._bit_key_to_key
return [to_key(bit_key) for bit_key in self._entries]
+ def iter_entries(self, keys):
+ """See GraphIndex.iter_entries()"""
+ self._ensure_header()
+ k_to_b = self._key_to_bit_key
+ bit_key_to_key = dict((k_to_b(k), k) for k in keys)
+ if self._entries:
+ # find out what we already have, versus what we are missing
+ missing = []
+ for bit_key in bit_key_to_key:
+ if bit_key in self._entries:
+ value = self._entries[bit_key]
+ # Note: This is the string that the btree_index stuff would
+ # return
+ # value_str = '%d %d %d %d' % (value[0][0], value[0][1],
+ # value[1], value[1]+value[2])
+ yield self, bit_key_to_key[bit_key], value
+ else:
+ missing.append(bit_key)
+ else:
+ missing = list(bit_key_to_key)
+ if missing:
+ bit_key_to_offset = _bit_key_to_offset[
+ self._header.num_mini_index_entries]
+ offsets = set([bit_key_to_offset(bit_key) for bit_key in missing])
+ # TODO: Strip out offsets that have already been read
+ # offsets = [idx for idx in offsets if not self._mini_index[idx][3]]
+ self._read_entries(offsets)
+ for bit_key in missing:
+ if bit_key in self._entries:
+ value = self._entries[bit_key]
+ # Note: This is the string that the btree_index stuff would
+ # return
+ # value_str = '%d %d %d %d' % (value[0][0], value[0][1],
+ # value[1], value[1]+value[2])
+ yield self, bit_key_to_key[bit_key], value
+ # Anything not found is genuinely missing
+
def _read_all(self):
"""Read in all the entry records and store them in self._entries"""
offsets = [idx for idx, info in enumerate(self._mini_index)
=== modified file 'bzrlib/tests/test_chk_index.py'
--- a/bzrlib/tests/test_chk_index.py 2009-10-28 19:33:22 +0000
+++ b/bzrlib/tests/test_chk_index.py 2009-10-28 19:52:26 +0000
@@ -809,3 +809,18 @@
(k3, 0, 1000, 19, 9),
])
self.assertEqual(sorted([k1, k2, k3]), sorted(index.keys()))
+
+ def test_iter_entries_tiny(self):
+ index = self.make_index([(k1, 0, 1000, 0, 10),
+ (k2, 0, 1000, 10, 9),
+ (k3, 0, 1000, 19, 9),
+ ])
+ self.assertEqual(sorted([(index, k1, ((0, 1000), 0, 10)),
+ (index, k2, ((0, 1000), 10, 9)),
+ (index, k3, ((0, 1000), 19, 9))]),
+ sorted(index.iter_entries([k1, k2, k3])))
+ # And again with everything loaded
+ self.assertEqual(sorted([(index, k1, ((0, 1000), 0, 10)),
+ (index, k2, ((0, 1000), 10, 9)),
+ (index, k3, ((0, 1000), 19, 9))]),
+ sorted(index.iter_entries([k1, k2, k3])))
More information about the bazaar-commits
mailing list