Rev 3901: change the LeafNode iteritems() code so that it directly returns in http://bzr.arbash-meinel.com/branches/bzr/brisbane/iter_changes_fixes
John Arbash Meinel
john at arbash-meinel.com
Mon Mar 23 23:02:58 GMT 2009
At http://bzr.arbash-meinel.com/branches/bzr/brisbane/iter_changes_fixes
------------------------------------------------------------
revno: 3901
revision-id: john at arbash-meinel.com-20090323230249-s07xna9l5l7cqez3
parent: john at arbash-meinel.com-20090323225113-kvefl5nlj1uataj3
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: iter_changes_fixes
timestamp: Mon 2009-03-23 18:02:49 -0500
message:
change the LeafNode iteritems() code so that it directly returns
non-prefix matches.
-------------- next part --------------
=== modified file 'bzrlib/chk_map.py'
--- a/bzrlib/chk_map.py 2009-03-23 22:51:13 +0000
+++ b/bzrlib/chk_map.py 2009-03-23 23:02:49 +0000
@@ -654,19 +654,30 @@
list/set/dict or similar repeatedly iterable container.
"""
if key_filter is not None:
- # Adjust the filter - short elements go to a prefix filter. Would this
- # be cleaner explicitly? That would be no harder for InternalNode..
+ # Adjust the filter - short elements go to a prefix filter. All
+ # other items are looked up directly.
# XXX: perhaps defaultdict? Profiling<rinse and repeat>
filters = {}
for key in key_filter:
- length_filter = filters.setdefault(len(key), set())
- length_filter.add(key)
- filters = filters.items()
- for item in self._items.iteritems():
- for length, length_filter in filters:
- if item[0][:length] in length_filter:
- yield item
- break
+ if len(key) == self._key_width:
+ # This filter is meant to match exactly one key, yield it
+ # if we have it.
+ try:
+ yield key, self._items[key]
+ except KeyError:
+ # This key is not present in this map, continue
+ pass
+ else:
+ # Short items, we need to match based on a prefix
+ length_filter = filters.setdefault(len(key), set())
+ length_filter.add(key)
+ if filters:
+ filters = filters.items()
+ for item in self._items.iteritems():
+ for length, length_filter in filters:
+ if item[0][:length] in length_filter:
+ yield item
+ break
else:
for item in self._items.iteritems():
yield item
More information about the bazaar-commits
mailing list