Avoiding iterating over id_map for ever item lookup

This commit is contained in:
Kovid Goyal 2023-09-23 16:39:24 +05:30
parent c56b41612b
commit b5afce1a85
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 12 additions and 1 deletions

View File

@ -940,6 +940,13 @@ class Cache:
rmap = {icu_lower(v) if isinstance(v, str) else v:k for k, v in iteritems(self.fields[field].table.id_map)} rmap = {icu_lower(v) if isinstance(v, str) else v:k for k, v in iteritems(self.fields[field].table.id_map)}
return {name:rmap.get(icu_lower(name) if isinstance(name, str) else name, None) for name in item_names} return {name:rmap.get(icu_lower(name) if isinstance(name, str) else name, None) for name in item_names}
@read_api
def get_item_name_map(self, field, normalize_func=None):
' Return mapping of item values to ids '
if normalize_func is None:
return {v:k for k, v in self.fields[field].table.id_map.items()}
return {normalize_func(v):k for k, v in self.fields[field].table.id_map.items()}
@read_api @read_api
def author_data(self, author_ids=None): def author_data(self, author_ids=None):
''' '''

View File

@ -322,10 +322,14 @@ def render_data(mi, use_roman_numbers=True, all_fields=False, pref_name='book_di
field_list = [(x, all_fields or display) for x, display in field_list] field_list = [(x, all_fields or display) for x, display in field_list]
db, _ = db_for_mi(mi) db, _ = db_for_mi(mi)
db = db.new_api db = db.new_api
field_maps = {}
def item_id_if_has_note(field, item_val): def item_id_if_has_note(field, item_val):
if db.field_supports_notes(field): if db.field_supports_notes(field):
item_id = db.get_item_id(field, item_val) nmap = field_maps.get(field)
if nmap is None:
nmap = field_maps[field] = db.get_item_name_map(field)
item_id = nmap.get(item_val)
if item_id is not None: if item_id is not None:
if db.notes_for(field, item_id): if db.notes_for(field, item_id):
return item_id return item_id