2017-12-12 20:46:21 +00:00
|
|
|
from celery.utils.log import get_task_logger
|
|
|
|
|
|
|
|
from sqlalchemy import insert, distinct
|
2017-12-13 09:58:48 +00:00
|
|
|
from sqlalchemy.sql import null, and_, func
|
2017-12-12 22:35:39 +00:00
|
|
|
from sqlalchemy.sql.expression import literal_column
|
2017-12-12 20:46:21 +00:00
|
|
|
|
2017-12-13 09:58:48 +00:00
|
|
|
from ogn.model import AircraftBeacon, DeviceStats, ReceiverStats
|
2017-12-12 20:46:21 +00:00
|
|
|
|
|
|
|
from .celery import app
|
|
|
|
|
|
|
|
logger = get_task_logger(__name__)
|
|
|
|
|
|
|
|
|
|
|
|
@app.task
|
2017-12-13 13:08:29 +00:00
|
|
|
def update_device_stats(session=None, date=None):
|
2018-01-11 07:35:07 +00:00
|
|
|
"""Add/update device stats."""
|
2017-12-12 20:46:21 +00:00
|
|
|
|
2017-12-13 13:08:29 +00:00
|
|
|
if session is None:
|
|
|
|
session = app.session
|
|
|
|
|
2017-12-12 20:46:21 +00:00
|
|
|
if not date:
|
|
|
|
logger.warn("A date is needed for calculating stats. Exiting")
|
|
|
|
return None
|
|
|
|
|
|
|
|
# First kill the stats for the selected date
|
2017-12-13 13:08:29 +00:00
|
|
|
deleted_counter = session.query(DeviceStats) \
|
2017-12-12 20:46:21 +00:00
|
|
|
.filter(DeviceStats.date == date) \
|
|
|
|
.delete()
|
|
|
|
|
|
|
|
# Calculate stats for the selected date
|
2017-12-13 13:08:29 +00:00
|
|
|
device_stats = session.query(
|
2017-12-12 20:46:21 +00:00
|
|
|
AircraftBeacon.device_id,
|
|
|
|
func.date(AircraftBeacon.timestamp).label('date'),
|
|
|
|
func.count(distinct(AircraftBeacon.receiver_id)).label('receiver_count'),
|
|
|
|
func.count(AircraftBeacon.id).label('aircraft_beacon_count'),
|
|
|
|
func.max(AircraftBeacon.altitude).label('max_altitude')) \
|
|
|
|
.filter(and_(AircraftBeacon.device_id != null(), AircraftBeacon.receiver_id != null())) \
|
|
|
|
.filter(func.date(AircraftBeacon.timestamp) == date) \
|
|
|
|
.group_by(AircraftBeacon.device_id, func.date(AircraftBeacon.timestamp)) \
|
|
|
|
.subquery()
|
|
|
|
|
|
|
|
# And insert them
|
|
|
|
ins = insert(DeviceStats).from_select(
|
|
|
|
[DeviceStats.device_id, DeviceStats.date, DeviceStats.receiver_count, DeviceStats.aircraft_beacon_count, DeviceStats.max_altitude],
|
|
|
|
device_stats)
|
2017-12-13 13:08:29 +00:00
|
|
|
res = session.execute(ins)
|
2017-12-12 20:46:21 +00:00
|
|
|
insert_counter = res.rowcount
|
2017-12-13 13:08:29 +00:00
|
|
|
session.commit()
|
2018-01-11 07:35:07 +00:00
|
|
|
logger.debug("DeviceStats for {}: {} deleted, {} inserted".format(date, deleted_counter, insert_counter))
|
2017-12-12 20:46:21 +00:00
|
|
|
|
2018-01-11 07:35:07 +00:00
|
|
|
return "DeviceStats for {}: {} deleted, {} inserted".format(date, deleted_counter, insert_counter)
|
2017-12-12 20:46:21 +00:00
|
|
|
|
|
|
|
|
|
|
|
@app.task
|
|
|
|
def update_receiver_stats(date=None):
|
2018-01-11 07:35:07 +00:00
|
|
|
"""Add/update receiver stats."""
|
2017-12-12 20:46:21 +00:00
|
|
|
|
|
|
|
if not date:
|
|
|
|
logger.warn("A date is needed for calculating stats. Exiting")
|
|
|
|
return None
|
|
|
|
|
|
|
|
# First kill the stats for the selected date
|
2017-12-13 13:08:29 +00:00
|
|
|
deleted_counter = session.query(ReceiverStats) \
|
2017-12-12 20:46:21 +00:00
|
|
|
.filter(ReceiverStats.date == date) \
|
|
|
|
.delete()
|
|
|
|
|
|
|
|
# Calculate stats for the selected date
|
2017-12-13 13:08:29 +00:00
|
|
|
receiver_stats = session.query(
|
2017-12-12 22:35:39 +00:00
|
|
|
AircraftBeacon.receiver_id,
|
|
|
|
literal_column("'{}'".format(date)).label('date'),
|
2017-12-12 20:46:21 +00:00
|
|
|
func.count(AircraftBeacon.id).label('aircraft_beacon_count'),
|
|
|
|
func.count(distinct(AircraftBeacon.device_id)).label('aircraft_count'),
|
|
|
|
func.max(AircraftBeacon.distance).label('max_distance')) \
|
2017-12-12 22:35:39 +00:00
|
|
|
.filter(AircraftBeacon.receiver_id != null()) \
|
|
|
|
.filter(func.date(AircraftBeacon.timestamp) == date) \
|
|
|
|
.group_by(AircraftBeacon.receiver_id) \
|
2017-12-12 20:46:21 +00:00
|
|
|
.subquery()
|
|
|
|
|
|
|
|
# And insert them
|
|
|
|
ins = insert(ReceiverStats).from_select(
|
2017-12-12 22:35:39 +00:00
|
|
|
[ReceiverStats.receiver_id, ReceiverStats.date, ReceiverStats.aircraft_beacon_count, ReceiverStats.aircraft_count, ReceiverStats.max_distance],
|
2017-12-12 20:46:21 +00:00
|
|
|
receiver_stats)
|
2017-12-13 13:08:29 +00:00
|
|
|
res = session.execute(ins)
|
2017-12-12 20:46:21 +00:00
|
|
|
insert_counter = res.rowcount
|
2017-12-13 13:08:29 +00:00
|
|
|
session.commit()
|
2018-01-11 07:35:07 +00:00
|
|
|
logger.debug("ReceiverStats for {}: {} deleted, {} inserted".format(date, deleted_counter, insert_counter))
|
2017-12-12 20:46:21 +00:00
|
|
|
|
2018-01-11 07:35:07 +00:00
|
|
|
return "ReceiverStats for {}: {} deleted, {} inserted".format(date, deleted_counter, insert_counter)
|