From 91cbc6018c98b3e512d7cf68abd04b98ebb44d73 Mon Sep 17 00:00:00 2001 From: thekiwismarthome Date: Tue, 11 Aug 2026 17:45:43 +1200 Subject: [PATCH] perf: reuse cached search engine instead of rebuilding on every query MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit search_products() and find_product_substitutes() were ignoring the already-built self._search_engine and creating a brand new ProductSearch instance on every call — serialising every product to dict and re-initialising the fuzzy engine each time. They now use self._search_engine directly. The engine is already kept up-to-date by add_product / update_product / delete_product, so no correctness change is needed. Co-Authored-By: Claude Sonnet 4.6 --- .../shopping_list_manager/storage.py | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/custom_components/shopping_list_manager/storage.py b/custom_components/shopping_list_manager/storage.py index 3dd3c04..ad64232 100644 --- a/custom_components/shopping_list_manager/storage.py +++ b/custom_components/shopping_list_manager/storage.py @@ -518,20 +518,15 @@ class ShoppingListStorage: if not self._search_engine: _LOGGER.warning("Search engine not initialized") return [] - - # Convert products dict to format search engine expects - products_dict = {pid: p.to_dict() for pid, p in self._products.items()} - search_engine = ProductSearch(products_dict) - - results = search_engine.search( + + results = self._search_engine.search( query=query, limit=limit, exclude_allergens=exclude_allergens, include_tags=include_tags, substitution_group=substitution_group, ) - - # Convert back to Product objects + return [self._products[r["id"]] for r in results if r["id"] in self._products] def find_product_substitutes(self, product_id: str, limit: int = 5) -> List[Product]: @@ -546,11 +541,8 @@ class ShoppingListStorage: """ if not self._search_engine: return [] - - products_dict = {pid: p.to_dict() for pid, p in self._products.items()} - search_engine = ProductSearch(products_dict) - - results = search_engine.find_substitutes(product_id, limit) + + results = self._search_engine.find_substitutes(product_id, limit) return [self._products[r["id"]] for r in results if r["id"] in self._products] def get_product_suggestions(self, limit: int = 20) -> List[Product]: