mirror of
https://github.com/osm-search/Nominatim.git
synced 2026-02-16 15:47:58 +00:00
Merge pull request #3700 from lonvia/ignore-inherited-addresses
Ignore POIs with inherited addresses for the address layer
This commit is contained in:
@@ -122,15 +122,18 @@ class IsAddressPoint(sa.sql.functions.GenericFunction[Any]):
|
|||||||
|
|
||||||
def __init__(self, table: sa.Table) -> None:
|
def __init__(self, table: sa.Table) -> None:
|
||||||
super().__init__(table.c.rank_address,
|
super().__init__(table.c.rank_address,
|
||||||
table.c.housenumber, table.c.name)
|
table.c.housenumber, table.c.name, table.c.address)
|
||||||
|
|
||||||
|
|
||||||
@compiles(IsAddressPoint)
|
@compiles(IsAddressPoint)
|
||||||
def default_is_address_point(element: IsAddressPoint,
|
def default_is_address_point(element: IsAddressPoint,
|
||||||
compiler: 'sa.Compiled', **kw: Any) -> str:
|
compiler: 'sa.Compiled', **kw: Any) -> str:
|
||||||
rank, hnr, name = list(element.clauses)
|
rank, hnr, name, address = list(element.clauses)
|
||||||
return "(%s = 30 AND (%s IS NOT NULL OR %s ? 'addr:housename'))" % (
|
return "(%s = 30 AND (%s IS NULL OR NOT %s ? '_inherited')" \
|
||||||
|
" AND (%s IS NOT NULL OR %s ? 'addr:housename'))" % (
|
||||||
compiler.process(rank, **kw),
|
compiler.process(rank, **kw),
|
||||||
|
compiler.process(address, **kw),
|
||||||
|
compiler.process(address, **kw),
|
||||||
compiler.process(hnr, **kw),
|
compiler.process(hnr, **kw),
|
||||||
compiler.process(name, **kw))
|
compiler.process(name, **kw))
|
||||||
|
|
||||||
@@ -138,9 +141,11 @@ def default_is_address_point(element: IsAddressPoint,
|
|||||||
@compiles(IsAddressPoint, 'sqlite')
|
@compiles(IsAddressPoint, 'sqlite')
|
||||||
def sqlite_is_address_point(element: IsAddressPoint,
|
def sqlite_is_address_point(element: IsAddressPoint,
|
||||||
compiler: 'sa.Compiled', **kw: Any) -> str:
|
compiler: 'sa.Compiled', **kw: Any) -> str:
|
||||||
rank, hnr, name = list(element.clauses)
|
rank, hnr, name, address = list(element.clauses)
|
||||||
return "(%s = 30 AND coalesce(%s, json_extract(%s, '$.addr:housename')) IS NOT NULL)" % (
|
return "(%s = 30 AND json_extract(%s, '$._inherited') IS NULL" \
|
||||||
|
" AND coalesce(%s, json_extract(%s, '$.addr:housename')) IS NOT NULL)" % (
|
||||||
compiler.process(rank, **kw),
|
compiler.process(rank, **kw),
|
||||||
|
compiler.process(address, **kw),
|
||||||
compiler.process(hnr, **kw),
|
compiler.process(hnr, **kw),
|
||||||
compiler.process(name, **kw))
|
compiler.process(name, **kw))
|
||||||
|
|
||||||
|
|||||||
@@ -68,7 +68,8 @@ def test_reverse_ignore_unindexed(apiobj, frontend):
|
|||||||
(0.7, napi.DataLayer.NATURAL, 227),
|
(0.7, napi.DataLayer.NATURAL, 227),
|
||||||
(0.70003, napi.DataLayer.MANMADE | napi.DataLayer.RAILWAY, 225),
|
(0.70003, napi.DataLayer.MANMADE | napi.DataLayer.RAILWAY, 225),
|
||||||
(0.70003, napi.DataLayer.MANMADE | napi.DataLayer.NATURAL, 225),
|
(0.70003, napi.DataLayer.MANMADE | napi.DataLayer.NATURAL, 225),
|
||||||
(5, napi.DataLayer.ADDRESS, 229)])
|
(5, napi.DataLayer.ADDRESS, 229),
|
||||||
|
(5.0001, napi.DataLayer.ADDRESS, 229)])
|
||||||
def test_reverse_rank_30_layers(apiobj, frontend, y, layer, place_id):
|
def test_reverse_rank_30_layers(apiobj, frontend, y, layer, place_id):
|
||||||
apiobj.add_placex(place_id=223, osm_type='N', class_='place', type='house',
|
apiobj.add_placex(place_id=223, osm_type='N', class_='place', type='house',
|
||||||
housenumber='1',
|
housenumber='1',
|
||||||
@@ -96,6 +97,12 @@ def test_reverse_rank_30_layers(apiobj, frontend, y, layer, place_id):
|
|||||||
rank_address=30,
|
rank_address=30,
|
||||||
rank_search=30,
|
rank_search=30,
|
||||||
centroid=(1.3, 5))
|
centroid=(1.3, 5))
|
||||||
|
apiobj.add_placex(place_id=230, class_='place', type='house',
|
||||||
|
housenumber='2',
|
||||||
|
address={'_inherited': ''},
|
||||||
|
rank_address=30,
|
||||||
|
rank_search=30,
|
||||||
|
centroid=(1.3, 5.0001))
|
||||||
|
|
||||||
api = frontend(apiobj, options=API_OPTIONS)
|
api = frontend(apiobj, options=API_OPTIONS)
|
||||||
assert api.reverse((1.3, y), layers=layer).place_id == place_id
|
assert api.reverse((1.3, y), layers=layer).place_id == place_id
|
||||||
|
|||||||
Reference in New Issue
Block a user