diff --git a/src/calibre/gui2/search_restriction_mixin.py b/src/calibre/gui2/search_restriction_mixin.py index a90d607ea9..63094b45f0 100644 --- a/src/calibre/gui2/search_restriction_mixin.py +++ b/src/calibre/gui2/search_restriction_mixin.py @@ -332,7 +332,7 @@ class SearchRestrictionMixin(object): virt_libs = db.prefs.get('virtual_libraries', {}) virt_libs[name] = search db.prefs.set('virtual_libraries', virt_libs) - db.data.invalidate_virtual_libraries_caches(db) + db.data.invalidate_virtual_libraries_caches() def do_create_edit(self, name=None): db = self.library_view.model().db @@ -342,7 +342,7 @@ class SearchRestrictionMixin(object): if name: self._remove_vl(name, reapply=False) self.add_virtual_library(db, cd.library_name, cd.library_search) - db.data.invalidate_virtual_libraries_caches(db) + db.data.invalidate_virtual_libraries_caches() if not name or name == db.data.get_base_restriction_name(): self.apply_virtual_library(cd.library_name) else: @@ -467,7 +467,7 @@ class SearchRestrictionMixin(object): return self._remove_vl(name, reapply=True) db = self.library_view.model().db - db.data.invalidate_virtual_libraries_caches(db) + db.data.invalidate_virtual_libraries_caches() self.tags_view.recount() def _remove_vl(self, name, reapply=True): diff --git a/src/calibre/library/caches.py b/src/calibre/library/caches.py index 05d964be71..544a8e4b56 100644 --- a/src/calibre/library/caches.py +++ b/src/calibre/library/caches.py @@ -212,6 +212,8 @@ class CacheRow(list): # {{{ self[c] = None self._must_do = True + def refresh_virtual_libraries(self): + self._virt_libs = None # }}} class ResultCache(SearchQueryParser): # {{{ @@ -247,6 +249,8 @@ class ResultCache(SearchQueryParser): # {{{ pref_use_primary_find_in_search = prefs['use_primary_find_in_search'] self._uuid_column_index = self.FIELD_MAP['uuid'] self._uuid_map = {} + self._virt_libs_computed = False + self._ids_in_virt_libs = {} def break_cycles(self): self._data = self.field_metadata = self.FIELD_MAP = \ @@ -840,8 +844,14 @@ class ResultCache(SearchQueryParser): # {{{ current_candidates -= matches return matches - def invalidate_virtual_libraries_caches(self, db): - self.refresh(db) + def invalidate_virtual_libraries_caches(self): + self._virt_libs_computed = False + self._ids_in_virt_libs = {} + + for row in self._data: + if row is not None: + row.refresh_virtual_libraries() + row.refresh_composites() def search_raw(self, query): matches = self.parse(query)