From dbe16c035e880ae02729fc321ef1f0e2b469e24f Mon Sep 17 00:00:00 2001 From: TradeIn Deploy Date: Thu, 21 May 2026 22:39:36 +0500 Subject: [PATCH] =?UTF-8?q?fix(tradein):=20estimate=20500=20=E2=80=94=20?= =?UTF-8?q?=D0=B0=D0=BB=D0=B8=D0=B0=D1=81=20distance=5Fm=20=D0=B2=20ORDER?= =?UTF-8?q?=20BY-=D0=B2=D1=8B=D1=80=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Регрессия #385 (#6 house-match): ORDER BY использует SELECT-алиас distance_m внутри арифметического выражения. PostgreSQL подставляет алиасы в ORDER BY только голым термом — внутри выражения имя ищется как колонка listings.distance_m, которой нет → "column does not exist" → 500 на каждый геокодящийся адрес. Инлайнили ST_Distance() вместо алиаса. Co-Authored-By: Claude Opus 4.7 (1M context) --- tradein-mvp/backend/app/services/estimator.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tradein-mvp/backend/app/services/estimator.py b/tradein-mvp/backend/app/services/estimator.py index e5aaecb1..aa6257e3 100644 --- a/tradein-mvp/backend/app/services/estimator.py +++ b/tradein-mvp/backend/app/services/estimator.py @@ -343,7 +343,10 @@ def _fetch_analogs( AND scraped_at > NOW() - (:fresh_days || ' days')::interval AND price_rub > 0 ORDER BY ( - distance_m / 1000.0 + -- distance_m — это SELECT-алиас. В ORDER BY-ВЫРАЖЕНИИ (не голым + -- термом) PostgreSQL трактует имя как входную колонку listings, + -- которой нет → "column distance_m does not exist". Инлайним ST_Distance. + ST_Distance(geom::geography, ST_MakePoint(:lon, :lat)::geography) / 1000.0 + CASE WHEN :target_year IS NOT NULL AND year_built IS NOT NULL THEN abs(year_built - :target_year) / 12.0 ELSE 0 END + CASE WHEN :target_house_type IS NOT NULL AND house_type IS NOT NULL