541
542
yield (self,) + node[1:]
542
543
if self._key_length == 1:
546
raise errors.BadIndexKey(key)
547
if len(key) != self._key_length:
548
raise errors.BadIndexKey(key)
545
index._sanity_check_key(self, key)
550
547
node = self._nodes[key]
556
553
yield self, key, node[1]
561
raise errors.BadIndexKey(key)
562
if len(key) != self._key_length:
563
raise errors.BadIndexKey(key)
564
# find what it refers to:
565
key_dict = self._get_nodes_by_key()
567
# find the subdict to return
569
while len(elements) and elements[0] is not None:
570
key_dict = key_dict[elements[0]]
573
# a non-existant lookup.
578
key_dict = dicts.pop(-1)
579
# can't be empty or would not exist
580
item, value = next(key_dict.iteritems())
581
if isinstance(value, dict):
583
dicts.extend(key_dict.itervalues())
586
for value in key_dict.itervalues():
587
yield (self, ) + tuple(value)
589
yield (self, ) + key_dict
555
nodes_by_key = self._get_nodes_by_key()
556
for entry in index._iter_entries_prefix(self, nodes_by_key, keys):
591
559
def _get_nodes_by_key(self):
592
560
if self._nodes_by_key is None:
593
561
nodes_by_key = {}
594
562
if self.reference_lists:
595
for key, (references, value) in self._nodes.iteritems():
563
for key, (references, value) in viewitems(self._nodes):
596
564
key_dict = nodes_by_key
597
565
for subkey in key[:-1]:
598
566
key_dict = key_dict.setdefault(subkey, {})
599
567
key_dict[key[-1]] = key, value, references
601
for key, (references, value) in self._nodes.iteritems():
569
for key, (references, value) in viewitems(self._nodes):
602
570
key_dict = nodes_by_key
603
571
for subkey in key[:-1]:
604
572
key_dict = key_dict.setdefault(subkey, {})
941
909
def _get_offsets_to_cached_pages(self):
942
910
"""Determine what nodes we already have cached."""
943
cached_offsets = set(self._internal_node_cache.keys())
911
cached_offsets = set(self._internal_node_cache)
912
# cache may be dict or LRUCache, keys() is the common method
944
913
cached_offsets.update(self._leaf_node_cache.keys())
945
914
if self._root_node is not None:
946
915
cached_offsets.add(0)
979
948
def _cache_leaf_values(self, nodes):
980
949
"""Cache directly from key => value, skipping the btree."""
981
950
if self._leaf_value_cache is not None:
982
for node in nodes.itervalues():
951
for node in viewvalues(nodes):
983
952
for key, value in node.all_items():
984
953
if key in self._leaf_value_cache:
985
954
# Don't add the rest of the keys, we've seen this node
1395
1364
key_dict[key[-1]] = key_value
1396
1365
if self._key_length == 1:
1397
1366
for key in keys:
1400
raise errors.BadIndexKey(key)
1401
if len(key) != self._key_length:
1402
raise errors.BadIndexKey(key)
1367
index._sanity_check_key(self, key)
1404
1369
if self.node_ref_lists:
1405
1370
value, node_refs = nodes[key]
1409
1374
except KeyError:
1415
raise errors.BadIndexKey(key)
1416
if len(key) != self._key_length:
1417
raise errors.BadIndexKey(key)
1418
# find what it refers to:
1419
key_dict = nodes_by_key
1420
elements = list(key)
1421
# find the subdict whose contents should be returned.
1423
while len(elements) and elements[0] is not None:
1424
key_dict = key_dict[elements[0]]
1427
# a non-existant lookup.
1432
key_dict = dicts.pop(-1)
1433
# can't be empty or would not exist
1434
item, value = next(key_dict.iteritems())
1435
if isinstance(value, dict):
1437
dicts.extend(key_dict.itervalues())
1440
for value in key_dict.itervalues():
1441
# each value is the key:value:node refs tuple
1443
yield (self, ) + value
1445
# the last thing looked up was a terminal element
1446
yield (self, ) + key_dict
1377
for entry in index._iter_entries_prefix(self, nodes_by_key, keys):
1448
1380
def key_count(self):
1449
1381
"""Return an estimate of the number of keys in this index.