1 Commits

Author SHA1 Message Date
thekiwismarthome 91cbc6018c perf: reuse cached search engine instead of rebuilding on every query
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 <noreply@anthropic.com>
2026-08-11 17:45:43 +12:00
@@ -519,11 +519,7 @@ class ShoppingListStorage:
_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,
@@ -531,7 +527,6 @@ class ShoppingListStorage:
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]:
@@ -547,10 +542,7 @@ 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]: