def __init__(self, table: sa.Table) -> None:
super().__init__(table.c.rank_address,
- table.c.housenumber, table.c.name)
+ table.c.housenumber, table.c.name, table.c.address)
@compiles(IsAddressPoint)
def default_is_address_point(element: IsAddressPoint,
compiler: 'sa.Compiled', **kw: Any) -> str:
- rank, hnr, name = list(element.clauses)
- return "(%s = 30 AND (%s IS NOT NULL OR %s ? 'addr:housename'))" % (
+ rank, hnr, name, address = list(element.clauses)
+ 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(address, **kw),
+ compiler.process(address, **kw),
compiler.process(hnr, **kw),
compiler.process(name, **kw))
@compiles(IsAddressPoint, 'sqlite')
def sqlite_is_address_point(element: IsAddressPoint,
compiler: 'sa.Compiled', **kw: Any) -> str:
- rank, hnr, name = list(element.clauses)
- return "(%s = 30 AND coalesce(%s, json_extract(%s, '$.addr:housename')) IS NOT NULL)" % (
+ rank, hnr, name, address = list(element.clauses)
+ 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(address, **kw),
compiler.process(hnr, **kw),
compiler.process(name, **kw))
(0.7, napi.DataLayer.NATURAL, 227),
(0.70003, napi.DataLayer.MANMADE | napi.DataLayer.RAILWAY, 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):
apiobj.add_placex(place_id=223, osm_type='N', class_='place', type='house',
housenumber='1',
rank_address=30,
rank_search=30,
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)
assert api.reverse((1.3, y), layers=layer).place_id == place_id