class LookupCollector:
""" Result collector for the simple lookup.
- Allows for lookup of multiple places simultaniously.
+ Allows for lookup of multiple places simultaneously.
"""
def __init__(self, places: Iterable[ntyp.PlaceRef],
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()]