~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/index.py

  • Committer: Robert Collins
  • Date: 2007-07-13 13:10:30 UTC
  • mto: (2592.5.3 pack-repository)
  • mto: This revision was merged to the branch mainline in revision 2624.
  • Revision ID: robertc@robertcollins.net-20070713131030-xbo7bbks9zovdya4
Build a combined graph index to use multiple indices at once.

Show diffs side-by-side

added added

removed removed

Lines of Context:
264
264
        # iter_all validates completely at the moment, so just do that.
265
265
        for node in self.iter_all_entries():
266
266
            pass
 
267
 
 
268
 
 
269
class CombinedGraphIndex(object):
 
270
    """A GraphIndex made up from smaller GraphIndices.
 
271
    
 
272
    The backing indices must implement GraphIndex, and are presumed to be
 
273
    static data.
 
274
    """
 
275
 
 
276
    def __init__(self, indices):
 
277
        """Create a CombinedGraphIndex backed by indices.
 
278
 
 
279
        :param indices: The indices to query for data.
 
280
        """
 
281
        self._indices = indices
 
282
        
 
283
    def iter_all_entries(self):
 
284
        """Iterate over all keys within the index
 
285
 
 
286
        :return: An iterable of (key, reference_lists, value). There is no
 
287
            defined order for the result iteration - it will be in the most
 
288
            efficient order for the index.
 
289
        """
 
290
        seen_keys = set()
 
291
        for index in self._indices:
 
292
            for node in index.iter_all_entries():
 
293
                if node[0] not in seen_keys:
 
294
                    yield node
 
295
                    seen_keys.add(node[0])
 
296
 
 
297
    def iter_entries(self, keys):
 
298
        """Iterate over keys within the index.
 
299
 
 
300
        :param keys: An iterable providing the keys to be retrieved.
 
301
        :return: An iterable of (key, reference_lists, value). There is no
 
302
            defined order for the result iteration - it will be in the most
 
303
            efficient order for the index.
 
304
        """
 
305
        found = set()
 
306
        keys = set(keys)
 
307
        for node in self.iter_all_entries():
 
308
            if node[0] in keys:
 
309
                yield node
 
310
                found.add(node[0])
 
311
        missing = keys.difference(found)
 
312
        if missing:
 
313
            raise errors.MissingKey(self, missing.pop())
 
314
 
 
315
    def validate(self):
 
316
        """Validate that everything in the index can be accessed."""
 
317
        for index in self._indices:
 
318
            index.validate()