Faster ogn range calculation

pull/68/head
Konstantin Gründger 2019-01-10 21:33:52 +01:00
rodzic 702cdf05ca
commit f9945770e9
2 zmienionych plików z 9 dodań i 5 usunięć

Wyświetl plik

@ -3,6 +3,7 @@ from celery.utils.log import get_task_logger
from sqlalchemy import String from sqlalchemy import String
from sqlalchemy import and_, insert, update, exists, between from sqlalchemy import and_, insert, update, exists, between
from sqlalchemy.sql import func, null from sqlalchemy.sql import func, null
from sqlalchemy.sql.expression import literal_column
from ogn.collect.celery import app from ogn.collect.celery import app
from ogn.model import AircraftBeacon, ReceiverCoverage from ogn.model import AircraftBeacon, ReceiverCoverage
@ -29,7 +30,6 @@ def create_receiver_coverage(session=None, date=None):
# Filter aircraft beacons and shrink precision of MGRS from 1m to 1km resolution: 30UXC 00061 18429 -> 30UXC 00 18 # Filter aircraft beacons and shrink precision of MGRS from 1m to 1km resolution: 30UXC 00061 18429 -> 30UXC 00 18
sq = session.query((func.left(AircraftBeacon.location_mgrs, 5, type_=String) + func.substring(AircraftBeacon.location_mgrs, 6, 2, type_=String) + func.substring(AircraftBeacon.location_mgrs, 11, 2, type_=String)).label('reduced_mgrs'), sq = session.query((func.left(AircraftBeacon.location_mgrs, 5, type_=String) + func.substring(AircraftBeacon.location_mgrs, 6, 2, type_=String) + func.substring(AircraftBeacon.location_mgrs, 11, 2, type_=String)).label('reduced_mgrs'),
AircraftBeacon.receiver_id, AircraftBeacon.receiver_id,
func.date(AircraftBeacon.timestamp).label('date'),
AircraftBeacon.signal_quality, AircraftBeacon.signal_quality,
AircraftBeacon.altitude, AircraftBeacon.altitude,
AircraftBeacon.device_id) \ AircraftBeacon.device_id) \
@ -42,15 +42,14 @@ def create_receiver_coverage(session=None, date=None):
# ... and group them by reduced MGRS, receiver and date # ... and group them by reduced MGRS, receiver and date
query = session.query(sq.c.reduced_mgrs, query = session.query(sq.c.reduced_mgrs,
sq.c.receiver_id, sq.c.receiver_id,
sq.c.date, literal_column("'{}'".format(date.strftime('%Y-%m-%d'))).label('date'),
func.max(sq.c.signal_quality).label('max_signal_quality'), func.max(sq.c.signal_quality).label('max_signal_quality'),
func.min(sq.c.altitude).label('min_altitude'), func.min(sq.c.altitude).label('min_altitude'),
func.max(sq.c.altitude).label('max_altitude'), func.max(sq.c.altitude).label('max_altitude'),
func.count(sq.c.altitude).label('aircraft_beacon_count'), func.count(sq.c.altitude).label('aircraft_beacon_count'),
func.count(func.distinct(sq.c.device_id)).label('device_count')) \ func.count(func.distinct(sq.c.device_id)).label('device_count')) \
.group_by(sq.c.reduced_mgrs, .group_by(sq.c.reduced_mgrs,
sq.c.receiver_id, sq.c.receiver_id) \
sq.c.date) \
.subquery() .subquery()
# if a receiver coverage entry exist --> update it # if a receiver coverage entry exist --> update it

Wyświetl plik

@ -1,5 +1,6 @@
from sqlalchemy import Column, String, Integer, SmallInteger, Float, Date, ForeignKey from sqlalchemy import Column, String, Integer, SmallInteger, Float, Date, ForeignKey, Index
from sqlalchemy.orm import relationship, backref from sqlalchemy.orm import relationship, backref
from sqlalchemy.sql import func
from .base import Base from .base import Base
@ -21,3 +22,7 @@ class ReceiverCoverage(Base):
# Relations # Relations
receiver_id = Column(Integer, ForeignKey('receivers.id', ondelete='SET NULL'), primary_key=True) receiver_id = Column(Integer, ForeignKey('receivers.id', ondelete='SET NULL'), primary_key=True)
receiver = relationship('Receiver', foreign_keys=[receiver_id], backref=backref('receiver_coverages', order_by='ReceiverCoverage.date.asc()')) receiver = relationship('Receiver', foreign_keys=[receiver_id], backref=backref('receiver_coverages', order_by='ReceiverCoverage.date.asc()'))
Index('ix_receiver_coverages_date_receiver_id', ReceiverCoverage.date, ReceiverCoverage.receiver_id)
Index('ix_receiver_coverages_receiver_id_date', ReceiverCoverage.receiver_id, ReceiverCoverage.date)