Rev 4600: Basic implementation of a conforming interface for GraphIndex. in http://bazaar.launchpad.net/~jameinel/bzr/1.18-faster-iter-ancestry
John Arbash Meinel
john at arbash-meinel.com
Fri Aug 7 20:37:38 BST 2009
At http://bazaar.launchpad.net/~jameinel/bzr/1.18-faster-iter-ancestry
------------------------------------------------------------
revno: 4600
revision-id: john at arbash-meinel.com-20090807193730-b4ib7013ei79rfdy
parent: john at arbash-meinel.com-20090807191937-41ev37kaytvszydt
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: 1.18-faster-iter-ancestry
timestamp: Fri 2009-08-07 14:37:30 -0500
message:
Basic implementation of a conforming interface for GraphIndex.
Add some simple tests, for now we won't try to do anything fancier.
Time to start working on CombinedGraphIndex's interface.
-------------- next part --------------
=== modified file 'bzrlib/index.py'
--- a/bzrlib/index.py 2009-07-01 10:53:08 +0000
+++ b/bzrlib/index.py 2009-08-07 19:37:30 +0000
@@ -702,6 +702,23 @@
# the last thing looked up was a terminal element
yield (self, ) + key_dict
+ def get_ancestry(self, keys, ref_list_num, parent_map, missing_keys):
+ """See BTreeIndex.get_ancestry."""
+ # The api can be implemented as a trivial overlay on top of
+ # iter_entries, it is not an efficient implementation, but it at least
+ # gets the job done.
+ found_keys = set()
+ search_keys = set()
+ for index, key, value, refs in self.iter_entries(keys):
+ parent_keys = refs[ref_list_num]
+ found_keys.add(key)
+ parent_map[key] = parent_keys
+ search_keys.update(parent_keys)
+ # Figure out what, if anything, was missing
+ missing_keys.update(set(keys).difference(found_keys))
+ search_keys = search_keys.difference(parent_map)
+ return search_keys
+
def key_count(self):
"""Return an estimate of the number of keys in this index.
=== modified file 'bzrlib/tests/test_btree_index.py'
--- a/bzrlib/tests/test_btree_index.py 2009-08-07 19:19:37 +0000
+++ b/bzrlib/tests/test_btree_index.py 2009-08-07 19:37:30 +0000
@@ -993,6 +993,7 @@
search_keys = index.get_ancestry([key1], 0, parent_map, missing_keys)
self.assertEqual({key1: (key2,), key2: ()}, parent_map)
self.assertEqual(set(), missing_keys)
+ self.assertEqual(set(), search_keys)
def test_get_ancestry_one_page_w_missing(self):
key1 = ('key-1',)
@@ -1037,6 +1038,24 @@
self.assertEqual(set([key3]), missing_keys)
self.assertEqual(set([]), search_keys)
+ def test_get_ancestry_dont_search_known(self):
+ key1 = ('key-1',)
+ key2 = ('key-2',)
+ key3 = ('key-3',)
+ index = self.make_index(ref_lists=1, key_elements=1, nodes=[
+ (key1, 'value', ([key2],)),
+ (key2, 'value', ([key3],)),
+ (key3, 'value', ([],)),
+ ])
+ # We already know about key2, so we won't try to search for key3
+ parent_map = {key2: (key3,)}
+ missing_keys = set()
+ search_keys = index.get_ancestry([key1], 0, parent_map,
+ missing_keys)
+ self.assertEqual({key1: (key2,), key2: (key3,)}, parent_map)
+ self.assertEqual(set(), missing_keys)
+ self.assertEqual(set(), search_keys)
+
def test_get_ancestry_multiple_pages(self):
# We need to use enough keys that we actually cause a split
start_time = 1249671539
=== modified file 'bzrlib/tests/test_index.py'
--- a/bzrlib/tests/test_index.py 2009-03-23 14:59:43 +0000
+++ b/bzrlib/tests/test_index.py 2009-08-07 19:37:30 +0000
@@ -953,6 +953,59 @@
])
self.assertEqual(set([]), index.external_references(0))
+ def test_get_ancestry(self):
+ key1 = ('key-1',)
+ key2 = ('key-2',)
+ index = self.make_index(ref_lists=1, key_elements=1, nodes=[
+ (key1, 'value', ([key2],)),
+ (key2, 'value', ([],)),
+ ])
+ parent_map = {}
+ missing_keys = set()
+ search_keys = index.get_ancestry([key1], 0, parent_map, missing_keys)
+ self.assertEqual({key1: (key2,)}, parent_map)
+ self.assertEqual(set(), missing_keys)
+ self.assertEqual(set([key2]), search_keys)
+ search_keys = index.get_ancestry(search_keys, 0, parent_map,
+ missing_keys)
+ self.assertEqual({key1: (key2,), key2: ()}, parent_map)
+ self.assertEqual(set(), missing_keys)
+ self.assertEqual(set(), search_keys)
+
+ def test_get_ancestry_w_missing(self):
+ key1 = ('key-1',)
+ key2 = ('key-2',)
+ key3 = ('key-3',)
+ index = self.make_index(ref_lists=1, key_elements=1, nodes=[
+ (key1, 'value', ([key2],)),
+ (key2, 'value', ([],)),
+ ])
+ parent_map = {}
+ missing_keys = set()
+ search_keys = index.get_ancestry([key2, key3], 0, parent_map,
+ missing_keys)
+ self.assertEqual({key2: ()}, parent_map)
+ self.assertEqual(set([key3]), missing_keys)
+ self.assertEqual(set(), search_keys)
+
+ def test_get_ancestry_dont_search_known(self):
+ key1 = ('key-1',)
+ key2 = ('key-2',)
+ key3 = ('key-3',)
+ index = self.make_index(ref_lists=1, key_elements=1, nodes=[
+ (key1, 'value', ([key2],)),
+ (key2, 'value', ([key3],)),
+ (key3, 'value', ([],)),
+ ])
+ # We already know about key2, so we won't try to search for key3
+ parent_map = {key2: (key3,)}
+ missing_keys = set()
+ search_keys = index.get_ancestry([key1], 0, parent_map,
+ missing_keys)
+ self.assertEqual({key1: (key2,), key2: (key3,)}, parent_map)
+ self.assertEqual(set(), missing_keys)
+ self.assertEqual(set(), search_keys)
+
class TestCombinedGraphIndex(TestCaseWithMemoryTransport):
More information about the bazaar-commits
mailing list