ogn-python/ogn_python/collect/ognrange.py

86 wiersze
3.6 KiB
Python
Czysty Zwykły widok Historia

2019-01-30 19:29:56 +00:00
from sqlalchemy import Date
2019-01-06 20:03:29 +00:00
from sqlalchemy import and_, insert, update, exists, between
2018-01-07 13:33:04 +00:00
from sqlalchemy.sql import func, null
from ogn_python.model import AircraftBeacon, ReceiverCoverage
from ogn_python.utils import date_to_timestamps
2018-01-07 13:33:04 +00:00
2019-03-10 14:58:10 +00:00
from ogn_python import app
2018-01-07 13:33:04 +00:00
2019-03-10 14:58:10 +00:00
def create_receiver_coverage(session, date, logger=None):
2019-01-06 20:03:29 +00:00
"""Create receiver coverages."""
2018-01-07 13:33:04 +00:00
2019-03-10 14:58:10 +00:00
if logger is None:
logger = app.logger
2018-01-07 13:33:04 +00:00
2019-03-10 14:58:10 +00:00
logger.info("Compute receiver coverages.")
2018-01-07 13:33:04 +00:00
2019-03-10 14:58:10 +00:00
(start, end) = date_to_timestamps(date)
2019-01-06 20:03:29 +00:00
# Filter aircraft beacons
sq = session.query(AircraftBeacon.location_mgrs_short,
2018-01-07 13:33:04 +00:00
AircraftBeacon.receiver_id,
AircraftBeacon.signal_quality,
AircraftBeacon.altitude,
AircraftBeacon.device_id) \
2019-01-06 20:03:29 +00:00
.filter(and_(between(AircraftBeacon.timestamp, start, end),
AircraftBeacon.location_mgrs_short != null(),
2018-01-07 13:33:04 +00:00
AircraftBeacon.receiver_id != null(),
AircraftBeacon.device_id != null())) \
.subquery()
# ... and group them by reduced MGRS, receiver and date
query = session.query(sq.c.location_mgrs_short,
2018-01-07 13:33:04 +00:00
sq.c.receiver_id,
2019-01-11 21:04:14 +00:00
func.cast(date, Date).label('date'),
2018-01-07 13:33:04 +00:00
func.max(sq.c.signal_quality).label('max_signal_quality'),
func.min(sq.c.altitude).label('min_altitude'),
func.max(sq.c.altitude).label('max_altitude'),
func.count(sq.c.altitude).label('aircraft_beacon_count'),
func.count(func.distinct(sq.c.device_id)).label('device_count')) \
2019-01-26 13:13:04 +00:00
.group_by(sq.c.location_mgrs_short,
2019-01-10 20:33:52 +00:00
sq.c.receiver_id) \
2018-01-07 13:33:04 +00:00
.subquery()
# if a receiver coverage entry exist --> update it
2018-01-07 13:33:04 +00:00
upd = update(ReceiverCoverage) \
.where(and_(ReceiverCoverage.location_mgrs_short == query.c.location_mgrs_short,
2018-01-07 13:33:04 +00:00
ReceiverCoverage.receiver_id == query.c.receiver_id,
2019-01-11 21:04:14 +00:00
ReceiverCoverage.date == date)) \
2018-01-07 13:33:04 +00:00
.values({"max_signal_quality": query.c.max_signal_quality,
"min_altitude": query.c.min_altitude,
"max_altitude": query.c.max_altitude,
"aircraft_beacon_count": query.c.aircraft_beacon_count,
"device_count": query.c.device_count})
result = session.execute(upd)
update_counter = result.rowcount
session.commit()
logger.debug("Updated receiver coverage entries: {}".format(update_counter))
# if a receiver coverage entry doesnt exist --> insert it
new_coverage_entries = session.query(query) \
.filter(~exists().where(
and_(ReceiverCoverage.location_mgrs_short == query.c.location_mgrs_short,
2018-01-07 13:33:04 +00:00
ReceiverCoverage.receiver_id == query.c.receiver_id,
2019-01-11 21:04:14 +00:00
ReceiverCoverage.date == date)))
2018-01-07 13:33:04 +00:00
ins = insert(ReceiverCoverage).from_select((
ReceiverCoverage.location_mgrs_short,
2018-01-07 13:33:04 +00:00
ReceiverCoverage.receiver_id,
ReceiverCoverage.date,
ReceiverCoverage.max_signal_quality,
ReceiverCoverage.min_altitude,
ReceiverCoverage.max_altitude,
ReceiverCoverage.aircraft_beacon_count,
ReceiverCoverage.device_count),
new_coverage_entries)
result = session.execute(ins)
insert_counter = result.rowcount
session.commit()
logger.debug("New receiver coverage entries: {}".format(insert_counter))
return "Receiver coverage entries: {} inserted, {} updated".format(insert_counter, update_counter)