kopia lustrzana https://github.com/glidernet/ogn-python
Added DeviceStats and ReceiverStats
rodzic
b87510b9b7
commit
3847db4abd
|
@ -27,6 +27,7 @@ def close_db(signal, sender):
|
|||
app = Celery('ogn.collect',
|
||||
include=["ogn.collect.database",
|
||||
"ogn.collect.logbook",
|
||||
"ogn.collect.stats",
|
||||
"ogn.collect.takeoff_landing",
|
||||
])
|
||||
|
||||
|
|
|
@ -0,0 +1,90 @@
|
|||
from celery.utils.log import get_task_logger
|
||||
|
||||
from sqlalchemy import insert, distinct
|
||||
from sqlalchemy.sql import null, and_, or_, func, not_
|
||||
|
||||
from ogn.model import AircraftBeacon, ReceiverBeacon, Device, Receiver, DeviceStats, ReceiverStats
|
||||
|
||||
from .celery import app
|
||||
|
||||
logger = get_task_logger(__name__)
|
||||
|
||||
|
||||
@app.task
|
||||
def update_device_stats(date=None):
|
||||
"""Add/update entries in device stats table."""
|
||||
|
||||
if not date:
|
||||
logger.warn("A date is needed for calculating stats. Exiting")
|
||||
return None
|
||||
|
||||
# First kill the stats for the selected date
|
||||
deleted_counter = app.session.query(DeviceStats) \
|
||||
.filter(DeviceStats.date == date) \
|
||||
.delete()
|
||||
|
||||
# Calculate stats for the selected date
|
||||
device_stats = app.session.query(
|
||||
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)
|
||||
res = app.session.execute(ins)
|
||||
insert_counter = res.rowcount
|
||||
app.session.commit()
|
||||
logger.debug("DeviceStats entries for {}: {} deleted, {} inserted".format(date, deleted_counter, insert_counter))
|
||||
|
||||
return "DeviceStats entries for {}: {} deleted, {} inserted".format(date, deleted_counter, insert_counter)
|
||||
|
||||
|
||||
@app.task
|
||||
def update_receiver_stats(date=None):
|
||||
"""Add/update entries in receiver stats table."""
|
||||
|
||||
if not date:
|
||||
logger.warn("A date is needed for calculating stats. Exiting")
|
||||
return None
|
||||
|
||||
return "Not usable. Need indices."
|
||||
|
||||
# First kill the stats for the selected date
|
||||
deleted_counter = app.session.query(ReceiverStats) \
|
||||
.filter(ReceiverStats.date == date) \
|
||||
.delete()
|
||||
|
||||
# Calculate stats for the selected date
|
||||
receiver_stats = app.session.query(
|
||||
ReceiverBeacon.receiver_id,
|
||||
func.date(ReceiverBeacon.timestamp).label('date'),
|
||||
func.count(AircraftBeacon.id).label('aircraft_beacon_count'),
|
||||
func.count(ReceiverBeacon.id).label('receiver_beacon_count'),
|
||||
func.count(distinct(AircraftBeacon.device_id)).label('aircraft_count'),
|
||||
func.max(AircraftBeacon.distance).label('max_distance')) \
|
||||
.filter(and_(ReceiverBeacon.receiver_id == AircraftBeacon.receiver_id, ReceiverBeacon.receiver_id != null(), AircraftBeacon.receiver_id != null())) \
|
||||
.filter(and_(func.date(ReceiverBeacon.timestamp) == date, func.date(AircraftBeacon.timestamp) == date)) \
|
||||
.group_by(ReceiverBeacon.receiver_id, func.date(ReceiverBeacon.timestamp)) \
|
||||
.subquery()
|
||||
|
||||
print(receiver_stats)
|
||||
return
|
||||
|
||||
# And insert them
|
||||
ins = insert(ReceiverStats).from_select(
|
||||
[ReceiverStats.receiver_id, ReceiverStats.date, ReceiverStats.aircraft_beacon_count, ReceiverStats.receiver_beacon_count, ReceiverStats.aircraft_count, ReceiverStats.max_distance],
|
||||
receiver_stats)
|
||||
res = app.session.execute(ins)
|
||||
insert_counter = res.rowcount
|
||||
app.session.commit()
|
||||
logger.debug("ReceiverStats entries for {}: {} deleted, {} inserted".format(date, deleted_counter, insert_counter))
|
||||
|
||||
return "ReceiverStats entries for {}: {} deleted, {} inserted".format(date, deleted_counter, insert_counter)
|
|
@ -5,9 +5,11 @@ from .beacon import Beacon
|
|||
from .device import Device
|
||||
from .device_info import DeviceInfo
|
||||
from .device_info_origin import DeviceInfoOrigin
|
||||
from .device_stats import DeviceStats
|
||||
from .aircraft_beacon import AircraftBeacon
|
||||
from .receiver_beacon import ReceiverBeacon
|
||||
from .receiver import Receiver
|
||||
from .receiver_stats import ReceiverStats
|
||||
from .takeoff_landing import TakeoffLanding
|
||||
from .airport import Airport
|
||||
from .logbook import Logbook
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
from geoalchemy2.shape import to_shape
|
||||
from geoalchemy2.types import Geometry
|
||||
from sqlalchemy import Column, String, Integer, Date, Float, ForeignKey
|
||||
from sqlalchemy.orm import relationship
|
||||
|
||||
from .base import Base
|
||||
|
||||
|
||||
class DeviceStats(Base):
|
||||
__tablename__ = "device_stats"
|
||||
|
||||
id = Column(Integer, primary_key=True)
|
||||
|
||||
date = Column(Date)
|
||||
receiver_count = Column(Integer)
|
||||
aircraft_beacon_count = Column(Integer)
|
||||
max_altitude = Column(Float)
|
||||
|
||||
# Relations
|
||||
device_id = Column(Integer, ForeignKey('device.id', ondelete='SET NULL'), index=True)
|
||||
device = relationship('Device', foreign_keys=[device_id])
|
|
@ -0,0 +1,22 @@
|
|||
from geoalchemy2.shape import to_shape
|
||||
from geoalchemy2.types import Geometry
|
||||
from sqlalchemy import Column, String, Integer, Date, Float, ForeignKey
|
||||
from sqlalchemy.orm import relationship
|
||||
|
||||
from .base import Base
|
||||
|
||||
|
||||
class ReceiverStats(Base):
|
||||
__tablename__ = "receiver_stats"
|
||||
|
||||
id = Column(Integer, primary_key=True)
|
||||
|
||||
date = Column(Date)
|
||||
aircraft_beacon_count = Column(Integer)
|
||||
receiver_beacon_count = Column(Integer)
|
||||
aircraft_count = Column(Integer)
|
||||
max_distance = Column(Float)
|
||||
|
||||
# Relations
|
||||
receiver_id = Column(Integer, ForeignKey('receiver.id', ondelete='SET NULL'), index=True)
|
||||
receiver = relationship('Receiver', foreign_keys=[receiver_id])
|
Ładowanie…
Reference in New Issue