~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/chk_map.py

don't check_remap on every unmap call in CHKMap.apply_delta()

Show diffs side-by-side

added added

removed removed

Lines of Context:
133
133
            into the map; if old_key is not None, then the old mapping
134
134
            of old_key is removed.
135
135
        """
 
136
        check_remap_at_end = False
136
137
        for old, new, value in delta:
137
138
            if old is not None and old != new:
138
 
                self.unmap(old)
 
139
                self.unmap(old, check_remap=False)
 
140
                check_remap_at_end = True
139
141
        for old, new, value in delta:
140
142
            if new is not None:
141
143
                self.map(new, value)
 
144
        if check_remap_at_end:
 
145
            self._check_remap()
142
146
        return self._save()
143
147
 
144
148
    def _ensure_root(self):
433
437
        else:
434
438
            return node._key
435
439
 
436
 
    def unmap(self, key):
 
440
    def unmap(self, key, check_remap=True):
437
441
        """remove key from the map."""
438
442
        self._ensure_root()
439
 
        unmapped = self._root_node.unmap(self._store, key)
 
443
        if isinstance(self._root_node, InternalNode):
 
444
            unmapped = self._root_node.unmap(self._store, key,
 
445
                check_remap=check_remap)
 
446
        else:
 
447
            unmapped = self._root_node.unmap(self._store, key)
440
448
        self._root_node = unmapped
441
449
 
 
450
    def _check_remap(self):
 
451
        """Check if nodes can be collapsed."""
 
452
        self._ensure_root()
 
453
        if isinstance(self._root_node, InternalNode):
 
454
            self._root_node._check_remap(self._store)
 
455
 
442
456
    def _save(self):
443
457
        """Save the map completely.
444
458
 
1011
1025
    def map(self, store, key, value):
1012
1026
        """Map key to value."""
1013
1027
        if not len(self._items):
1014
 
            raise AssertionError("cant map in an empty InternalNode.")
 
1028
            raise AssertionError("can't map in an empty InternalNode.")
1015
1029
        search_key = self._search_key(key)
1016
1030
        assert self._node_width == len(self._search_prefix) + 1
1017
1031
        if not search_key.startswith(self._search_prefix):
1157
1171
        self._search_prefix = self.common_prefix_for_keys(self._items)
1158
1172
        return self._search_prefix
1159
1173
 
1160
 
    def unmap(self, store, key):
 
1174
    def unmap(self, store, key, check_remap=True):
1161
1175
        """Remove key from this node and it's children."""
1162
1176
        if not len(self._items):
1163
1177
            raise AssertionError("cant unmap in an empty InternalNode.")
1182
1196
            return self._items.values()[0]
1183
1197
        if isinstance(unmapped, InternalNode):
1184
1198
            return self
1185
 
        return self._check_remap(store)
 
1199
        if check_remap:
 
1200
            return self._check_remap(store)
 
1201
        else:
 
1202
            return self
1186
1203
 
1187
1204
    def _check_remap(self, store):
1188
1205
        """Check if all keys contained by children fit in a single LeafNode.