CRITICAL #1: houses INSERT now populates source, ext_house_id, url (NOT NULL cols) with ON CONFLICT (source, ext_house_id) upsert; source_url param added with synthetic fallback. CRITICAL #2: geom removed from INSERT col list — houses_set_geom_trg trigger auto-populates. CRITICAL #3: Tier 3 ST_DWithin/ST_Distance now cast geom::geography on both sides to avoid mixed geometry/geography function lookup failure. CRITICAL #4: normalize.py _PUNCT now keeps hyphens ([^\w\s\-]); abbreviation expansion for пр-кт/б-р/пр-д runs before hyphen collapse, eliminating leftover кт token. HIGH #5: Tier 0 cadastral queries add ORDER BY id ASC for deterministic results (houses + listings). HIGH #6: match_or_create_house docstring documents race-condition known limitation + Stage 8.x plan. Medium #7: no-op ('литер', 'литер') entry removed from _ABBREV. Medium #9: update_canonical_fields raises NotImplementedError instead of silent pass. Medium #11: price_rub bigint truncation comment added to _upsert_listing_source. Medium #14: upsert_listing_source exported from __init__.py __all__. Tests: 29/29 pass; prkT test asserts no leftover кт; update_canonical_fields test updated.
19 lines
627 B
Python
19 lines
627 B
Python
"""Cross-source matching service — public API.
|
|
|
|
Provides 3-tier deduplication for houses and listings across Avito, Cian, Yandex, etc.
|
|
Algorithm reference: decisions/Cross_Source_Matching_Strategy.md
|
|
"""
|
|
|
|
from app.services.matching.conflict_resolution import update_canonical_fields
|
|
from app.services.matching.houses import match_or_create_house
|
|
from app.services.matching.listings import (
|
|
match_or_create_listing,
|
|
upsert_listing_source, # public helper for 'new' sentinel flow
|
|
)
|
|
|
|
__all__ = [
|
|
"match_or_create_house",
|
|
"match_or_create_listing",
|
|
"update_canonical_fields",
|
|
"upsert_listing_source",
|
|
]
|