Skip to content

Commit

Permalink
look up different OSM types in placex separately
Browse files Browse the repository at this point in the history
There are separate indexes on placex for the different OSM types.
PostgreSQL can only use these indexes if the type is fixed per query.
  • Loading branch information
lonvia committed Nov 14, 2024
1 parent 04d5f67 commit 7d418da
Showing 1 changed file with 18 additions and 16 deletions.
34 changes: 18 additions & 16 deletions src/nominatim_api/lookup.py
Original file line number Diff line number Diff line change
Expand Up @@ -201,22 +201,24 @@ async def find_in_placex(conn: SearchConnection, collector: Collector) -> bool:
t.c.geometry.ST_Expand(0).label('bbox'),
t.c.centroid)

osm_ids = [{'i': i, 'ot': p.osm_type, 'oi': p.osm_id, 'oc': p.osm_class or ''}
for i, p in collector.enumerate_free_osm_ids()]

if osm_ids:
oid_tab = sa.func.JsonArrayEach(sa.type_coerce(osm_ids, sa.JSON))\
.table_valued(sa.column('value', type_=sa.JSON))
psql = sql.add_columns(oid_tab.c.value['i'].as_integer().label('_idx'))\
.where(t.c.osm_type == oid_tab.c.value['ot'].as_string())\
.where(t.c.osm_id == oid_tab.c.value['oi'].as_string().cast(sa.BigInteger))\
.where(sa.or_(oid_tab.c.value['oc'].as_string() == '',
oid_tab.c.value['oc'].as_string() == t.c.class_))\
.order_by(t.c.class_)

if await collector.add_rows_from_sql(conn, psql, t.c.geometry,
nres.create_from_placex_row):
return True
for osm_type in ('N', 'W', 'R'):
osm_ids = [{'i': i, 'oi': p.osm_id, 'oc': p.osm_class or ''}
for i, p in collector.enumerate_free_osm_ids()
if p.osm_type == osm_type]

if osm_ids:
oid_tab = sa.func.JsonArrayEach(sa.type_coerce(osm_ids, sa.JSON))\
.table_valued(sa.column('value', type_=sa.JSON))
psql = sql.add_columns(oid_tab.c.value['i'].as_integer().label('_idx'))\
.where(t.c.osm_type == osm_type)\
.where(t.c.osm_id == oid_tab.c.value['oi'].as_string().cast(sa.BigInteger))\
.where(sa.or_(oid_tab.c.value['oc'].as_string() == '',
oid_tab.c.value['oc'].as_string() == t.c.class_))\
.order_by(t.c.class_)

if await collector.add_rows_from_sql(conn, psql, t.c.geometry,
nres.create_from_placex_row):
return True

place_ids = [{'i': i, 'id': p.place_id}
for i, p in collector.enumerate_free_place_ids()]
Expand Down

0 comments on commit 7d418da

Please sign in to comment.