From 41bbecd8aa3b9c7126f309a2dd003218098bab7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Gru=CC=88ndger?= Date: Sun, 17 Jul 2016 10:25:56 +0200 Subject: [PATCH] Insert takeoff/landings only if they not already exist --- ogn/collect/takeoff_landing.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/ogn/collect/takeoff_landing.py b/ogn/collect/takeoff_landing.py index 54e720a..8cc65a6 100644 --- a/ogn/collect/takeoff_landing.py +++ b/ogn/collect/takeoff_landing.py @@ -2,7 +2,7 @@ from datetime import timedelta from celery.utils.log import get_task_logger -from sqlalchemy import and_, or_, insert, between +from sqlalchemy import and_, or_, insert, between, exists from sqlalchemy.sql import func from sqlalchemy.sql.expression import case @@ -111,16 +111,24 @@ def compute_takeoff_and_landing(session=None): .subquery() # consider them if they are near a airport - takeoff_landing_query = session.query( + sq3 = session.query( sq2.c.timestamp, sq2.c.track, sq2.c.is_takeoff, sq2.c.device_id, - Airport.id) \ + Airport.id.label('airport_id')) \ .filter(and_(func.ST_DFullyWithin(sq2.c.location, Airport.location_wkt, airport_radius), between(sq2.c.altitude, Airport.altitude - airport_delta, Airport.altitude + airport_delta))) \ .filter(between(Airport.style, 2, 5)) \ - .order_by(sq2.c.id) + .order_by(sq2.c.id) \ + .subquery() + + # consider them only if they are not already existing in db + takeoff_landing_query = session.query(sq3) \ + .filter(~exists().where( + and_(TakeoffLanding.timestamp == sq3.c.timestamp, + TakeoffLanding.device_id == sq3.c.device_id, + TakeoffLanding.airport_id == sq3.c.airport_id))) # ... and save them ins = insert(TakeoffLanding).from_select((TakeoffLanding.timestamp,