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