From eba3750f15b15b8333aa4d00aa227e6a8dcbf104 Mon Sep 17 00:00:00 2001 From: qananasikq Date: Fri, 17 Apr 2026 23:53:54 +0300 Subject: [PATCH] speed up cars count query --- encar_scraper/api/routes/cars.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/encar_scraper/api/routes/cars.py b/encar_scraper/api/routes/cars.py index 70715c8..4954b23 100644 --- a/encar_scraper/api/routes/cars.py +++ b/encar_scraper/api/routes/cars.py @@ -26,21 +26,28 @@ def list_cars( # Список автомобилей с пагинацией и фильтрами with persistence.session_scope() as session: query = select(Car) + count_query = select(func.count(Car.id)) if brand: escaped_brand = brand.replace("%", r"\%").replace("_", r"\_") - query = query.where(Car.brand.ilike(f"%{escaped_brand}%", escape="\\")) + cond = Car.brand.ilike(f"%{escaped_brand}%", escape="\\") + query = query.where(cond) + count_query = count_query.where(cond) if model: escaped_model = model.replace("%", r"\%").replace("_", r"\_") - query = query.where(Car.model.ilike(f"%{escaped_model}%", escape="\\")) + cond = Car.model.ilike(f"%{escaped_model}%", escape="\\") + query = query.where(cond) + count_query = count_query.where(cond) if year_min is not None: query = query.where(Car.year >= year_min) + count_query = count_query.where(Car.year >= year_min) if year_max is not None: query = query.where(Car.year <= year_max) + count_query = count_query.where(Car.year <= year_max) if is_sold is not None: query = query.where(Car.is_sold == is_sold) + count_query = count_query.where(Car.is_sold == is_sold) - count_query = select(func.count()).select_from(query.subquery()) total = session.execute(count_query).scalar() or 0 offset = (page - 1) * per_page