gendesign/data/sql/195_tradein_osm_roads_view.sql
bot-backend b2b702dca7 feat(mera/b2c): улица сделки доезжает до витрины готовой схемой, а не геометрией
Карта в карточке игры показывала полигон района — единственную геометрию, до
которой у tradein был доступ. Улицы живут в базе gendesign, foreign table и
гранта на них не было.

Мост по образцу соседей (v_tradein_cad_buildings / v_tradein_osm_poi_ekb):
gendesign 195 — вьюха v_tradein_osm_roads_ekb (highway + water) с GRANT В ТОМ
ЖЕ ФАЙЛЕ (после #3227 грант отдельной миграцией теряется при пересоздании);
tradein 281 — foreign table gendesign_osm_roads_ekb плюс колонки street_name /
street_scheme в landing_showcase_deals.

Пересчёт витрины кладёт в строку УЖЕ СПРОЕЦИРОВАННЫЕ SVG-пути окна 840x840 м
вокруг центра улицы. Проекция — та же равнопромежуточная с cos(широты), что в
export_ekb_districts_svg.py; второй в проекте нет. Замер 2026-08-29: GeoJSON
того же окна 7-8 КБ на строку, схема — 2.8-2.9 КБ.

ЧТО ДАННЫЕ ВЫДЕРЖИВАЮТ, И НИ СЛОВОМ БОЛЬШЕ
  · Это УЛИЦА, а не дом: deals.address уровня улицы, номер дома у 2.7% сделок.
    В схеме намеренно НЕТ координат окна и констант проекции — точку дома по
    ней нельзя поставить даже случайно. Это замок, а не забывчивость.
  · Зданий нет: cad_buildings — 18 307 контуров на город, в плотном центре 51
    здание на радиус 450 м, где их в разы больше. Нарисованная застройка
    заявляла бы полноту, которой в данных нет.
  · Улицы — фильтрованная выгрузка «источников шума»: именованные покрыты
    хорошо, дворовые и служебные проезды отсутствуют.
  · Улица сматчилась у 550 названий из 654 — 31 410 сделок из 34 021 (92.3%).
    Остальным street_scheme = NULL, и это штатно: фронт показывает район,
    который для этого и оставлен.
  · Перекрёсток («Челюскинцев/Шейнкмана») берём первой улицей: таких адресов
    три на 34 021 сделку, и обе улицы одинаково верны на уровне улицы.
  · Наличие схемы НА ОТБОР СТРОК НЕ ВЛИЯЕТ — то же правило, что запрещает
    отбор по величине ошибки: иначе витрина показывала бы не работу оценщика,
    а те 92% адресов, что удобно легли на OSM.

Тесты (каждый сломан вручную и покраснел): нормализация на реальных адресах
включая ё/е и «8 Марта»; недоступная вьюха и упавший запрос дают None, а не
исключение; схема не раздувается — потолок в байтах на реальной плотности плюс
прямая проверка округления до 0.1.
2026-08-29 22:16:05 +05:00

57 lines
4.1 KiB
PL/PgSQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- 195_tradein_osm_roads_view.sql
-- Улицы ЕКБ на витрину сделок МЕРЫ: сторона gendesign (PR 1 из 2).
--
-- Карточка игры на лэндинге показывала ПОЛИГОН РАЙОНА — единственную геометрию,
-- которая у tradein была. Улицы живут здесь, в `osm_noise_sources_ekb`, а у
-- tradein нет ни foreign table, ни гранта. Эта миграция открывает вьюху ровно
-- по образцу соседей (`v_tradein_cad_buildings`, `v_tradein_osm_poi_ekb`,
-- 185_tradein_osm_poi_view.sql): плоский срез нужных колонок + GRANT SELECT
-- уже существующей роли `tradein_fdw_reader` (100_tradein_fdw_role.sql).
-- Новых ролей и user mapping здесь нет.
--
-- ГРАНТ СТОИТ РЯДОМ С CREATE, В ЭТОМ ЖЕ ФАЙЛЕ — И ЭТО НЕ СТИЛЬ. 2026-08-29
-- (#3227) объект пересоздали, а GRANT жил отдельной миграцией и потерялся:
-- пересоздание снимает права молча, и чтение с той стороны падает на
-- `permission denied`. То же было с `ekb_districts_geom` (194) и
-- `mv_quarter_price_index` (188). Кто будет менять эту вьюху — меняйте файл
-- целиком, вместе с грантом.
--
-- ЧТО В СРЕЗЕ И ЧЕГО В НЁМ НЕТ (замер на проде 2026-08-29):
-- * 10 025 линий, 1377 различных названий улиц. Выгрузка собиралась как
-- «источники шума», поэтому именованные улицы покрыты хорошо, а дворовые
-- проезды и служебные ОТСУТСТВУЮТ. Потребитель обязан это знать: схема из
-- этих данных — улицы района, а не полная уличная сеть.
-- * `source_type IN ('highway','water')` — только то, что рисуется на схеме.
-- Железные дороги, ЛЭП, трубопроводы, подстанции и промзона (ещё ~4 400
-- строк) сюда НЕ едут: на карточке 320 px они дают шум, а не смысл.
-- * ЗДАНИЙ ЗДЕСЬ НЕТ И НЕ БУДЕТ. `cad_buildings` — 18 307 контуров на весь
-- город; в плотном центре это 51 здание на радиус 450 м, где их в разы
-- больше. Нарисованная застройка заявляла бы полноту, которой в данных
-- нет, и показывала бы пустые кварталы там, где стоят дома.
--
-- Идемпотентна: CREATE OR REPLACE VIEW + повторяемый GRANT.
BEGIN;
-- Конвенция проекта (#2752). CREATE OR REPLACE VIEW и GRANT берут лок на объект;
-- ждать его выдачи за чужой сессией — значит собрать очередь перед приложением.
SET LOCAL lock_timeout = '5s';
CREATE OR REPLACE VIEW v_tradein_osm_roads_ekb AS
SELECT
name,
road_class,
geom
FROM osm_noise_sources_ekb
WHERE source_type IN ('highway', 'water');
GRANT SELECT ON v_tradein_osm_roads_ekb TO tradein_fdw_reader;
COMMENT ON VIEW v_tradein_osm_roads_ekb IS
'FDW-источник для tradein-mvp: улицы и вода ЕКБ для схемы улицы на витрине '
'сделок лэндинга МЕРЫ. Срез osm_noise_sources_ekb по source_type '
'IN (highway, water) — 10 025 линий, 1377 названий. Выгрузка фильтрованная '
'(«источники шума»): дворовых и служебных проездов в ней нет. Зданий нет '
'намеренно, см. шапку 195_tradein_osm_roads_view.sql. GRANT живёт в том же '
'файле — пересоздание вьюхи снимает права молча (#3227).';
COMMIT;