Merge pull request #3350 from lonvia/improve-postcode-handling

Improve handling of postcode areas
This commit is contained in:
Sarah Hoffmann 2024-02-28 18:45:31 +01:00 committed by GitHub
commit dd2c794de5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 19 additions and 12 deletions

View File

@ -1265,6 +1265,8 @@ BEGIN
END IF; END IF;
ELSEIF NEW.rank_address > 25 THEN ELSEIF NEW.rank_address > 25 THEN
max_rank := 25; max_rank := 25;
ELSEIF NEW.class in ('place','boundary') and NEW.type in ('postcode','postal_code') THEN
max_rank := NEW.rank_search;
ELSE ELSE
max_rank := NEW.rank_address; max_rank := NEW.rank_address;
END IF; END IF;

View File

@ -11,7 +11,7 @@ Data classes are part of the public API while the functions are for
internal use only. That's why they are implemented as free-standing functions internal use only. That's why they are implemented as free-standing functions
instead of member functions. instead of member functions.
""" """
from typing import Optional, Tuple, Dict, Sequence, TypeVar, Type, List, cast from typing import Optional, Tuple, Dict, Sequence, TypeVar, Type, List, cast, Callable
import enum import enum
import dataclasses import dataclasses
import datetime as dt import datetime as dt
@ -501,15 +501,17 @@ def _get_address_lookup_id(result: BaseResultT) -> int:
async def _finalize_entry(conn: SearchConnection, result: BaseResultT) -> None: async def _finalize_entry(conn: SearchConnection, result: BaseResultT) -> None:
assert result.address_rows is not None assert result.address_rows is not None
postcode = result.postcode if result.category[0] not in ('boundary', 'place')\
if not postcode and result.address: or result.category[1] not in ('postal_code', 'postcode'):
postcode = result.address.get('postcode') postcode = result.postcode
if postcode and ',' not in postcode and ';' not in postcode: if not postcode and result.address:
result.address_rows.append(AddressLine( postcode = result.address.get('postcode')
category=('place', 'postcode'), if postcode and ',' not in postcode and ';' not in postcode:
names={'ref': postcode}, result.address_rows.append(AddressLine(
fromarea=False, isaddress=True, rank_address=5, category=('place', 'postcode'),
distance=0.0)) names={'ref': postcode},
fromarea=False, isaddress=True, rank_address=5,
distance=0.0))
if result.country_code: if result.country_code:
async def _get_country_names() -> Optional[Dict[str, str]]: async def _get_country_names() -> Optional[Dict[str, str]]:
t = conn.t.country_name t = conn.t.country_name
@ -551,7 +553,7 @@ def _setup_address_details(result: BaseResultT) -> None:
extratags=result.extratags or {}, extratags=result.extratags or {},
admin_level=result.admin_level, admin_level=result.admin_level,
fromarea=True, isaddress=True, fromarea=True, isaddress=True,
rank_address=result.rank_address or 100, distance=0.0)) rank_address=result.rank_address, distance=0.0))
if result.source_table == SourceTable.PLACEX and result.address: if result.source_table == SourceTable.PLACEX and result.address:
housenumber = result.address.get('housenumber')\ housenumber = result.address.get('housenumber')\
or result.address.get('streetnumber')\ or result.address.get('streetnumber')\
@ -676,9 +678,12 @@ async def complete_address_details(conn: SearchConnection, results: List[BaseRes
rank_address=row.rank_address, distance=0.0)) rank_address=row.rank_address, distance=0.0))
### Now sort everything ### Now sort everything
def mk_sort_key(place_id: Optional[int]) -> Callable[[AddressLine], Tuple[bool, int, bool]]:
return lambda a: (a.place_id != place_id, -a.rank_address, a.isaddress)
for result in results: for result in results:
assert result.address_rows is not None assert result.address_rows is not None
result.address_rows.sort(key=lambda a: (-a.rank_address, a.isaddress)) result.address_rows.sort(key=mk_sort_key(result.place_id))
def _placex_select_address_row(conn: SearchConnection, def _placex_select_address_row(conn: SearchConnection,