From 2818e2870811c065af7aa83b3cde1a5687c0691a Mon Sep 17 00:00:00 2001 From: Christian Quest Date: Fri, 6 May 2016 18:01:55 +0200 Subject: [PATCH] bbox(E,S,W,N) support to filter event list --- backend.py | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/backend.py b/backend.py index 1bc7884..c814107 100644 --- a/backend.py +++ b/backend.py @@ -51,18 +51,31 @@ JOIN geo ON (hash=events_geo)"""); class EventResource(object): def on_get(self, req, resp, id = None): + standard_headers(resp) db = db_connect() cur = db.cursor() if id is None: - cur.execute(""" -SELECT format('{"type": "FeatureCollection","features": [%s]}',string_agg(feature,',')) FROM - (SELECT '{"type":"Feature", "properties": '|| (events_tags::jsonb || jsonb_build_object('id',events_id,'createdate',createdate,'lastupdate',lastupdate))::text ||', "geometry":'|| st_asgeojson(st_centroid(geom)) ||' }' as feature + if req.params.has_key('bbox'): + bbox = req.params['bbox'] + cur.execute(""" +SELECT '{"type":"Feature", "properties": '|| (events_tags::jsonb || jsonb_build_object('id',events_id,'createdate',createdate,'lastupdate',lastupdate))::text ||', "geometry":'|| st_asgeojson(st_centroid(geom)) ||' }' as feature + FROM events + JOIN geo ON (hash=events_geo) and geom && ST_SetSRID(ST_MakeBox2D(ST_Point(%s,%s),ST_Point(%s,%s)),4326) + WHERE events_when @> tstzrange(now(), now(),'[]') + ORDER BY createdate DESC + LIMIT 50; +""", tuple(bbox)) + else: + cur.execute(""" +SELECT '{"type":"Feature", "properties": '|| (events_tags::jsonb || jsonb_build_object('id',events_id,'createdate',createdate,'lastupdate',lastupdate))::text ||', "geometry":'|| st_asgeojson(st_centroid(geom)) ||' }' as feature FROM events JOIN geo ON (hash=events_geo) - WHERE events_when @> format('[%s,%s]', now(), now())::tstzrange + WHERE events_when @> tstzrange(now(), now(),'[]') ORDER BY createdate DESC - LIMIT 50) as f; + LIMIT 50; """) + resp.body = '{"type": "FeatureCollection","features": ['+','.join([x[0] for x in cur.fetchall()])+']}' + resp.status = falcon.HTTP_200 else: # get event geojson Feature cur.execute(""" @@ -71,13 +84,12 @@ FROM events JOIN geo ON (hash=events_geo) WHERE events_id=%s;""", (id,)) - e = cur.fetchone() - standard_headers(resp) - if e is not None: - resp.body = e[0] - resp.status = falcon.HTTP_200 - else: - resp.status = falcon.HTTP_404 + e = cur.fetchone() + if e is not None: + resp.body = e[0] + resp.status = falcon.HTTP_200 + else: + resp.status = falcon.HTTP_404 db.close() def on_post(self, req, resp):