Repair db scheme for ognrange

pull/68/head
Konstantin Gründger 2019-01-06 21:03:29 +01:00
rodzic 7367f43dd4
commit 6fffa09e20
6 zmienionych plików z 33 dodań i 9 usunięć

Wyświetl plik

@ -132,6 +132,7 @@ available commands:
[stats]
create Create DeviceStats, ReceiverStats and RelationStats.
create_ognrange Create stats for Melissa's ognrange.
update_devices Update devices with data from stats.
update_receivers Update receivers with data from stats.
```

Wyświetl plik

@ -7,9 +7,10 @@ from ogn.model import Receiver
def alchemyencoder(obj):
"""JSON encoder function for SQLAlchemy special classes."""
import decimal
from datetime import datetime
"""JSON encoder function for SQLAlchemy special classes."""
if isinstance(obj, datetime):
return obj.strftime('%Y-%m-%d %H:%M')
elif isinstance(obj, decimal.Decimal):

Wyświetl plik

@ -1,24 +1,31 @@
from celery.utils.log import get_task_logger
from sqlalchemy import String
from sqlalchemy import and_, insert, update, exists
from sqlalchemy import and_, insert, update, exists, between
from sqlalchemy.sql import func, null
from ogn.collect.celery import app
from ogn.model import AircraftBeacon, ReceiverCoverage
from ogn.utils import date_to_timestamps
logger = get_task_logger(__name__)
@app.task
def update_receiver_coverage(session=None):
"""Add/update receiver coverages."""
def create_receiver_coverage(session=None, date=None):
"""Create receiver coverages."""
logger.info("Compute receiver coverages.")
if session is None:
session = app.session
if not date:
logger.warn("A date is needed for calculating stats. Exiting")
return None
else:
(start, end) = date_to_timestamps(date)
# 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'),
AircraftBeacon.receiver_id,
@ -26,7 +33,8 @@ def update_receiver_coverage(session=None):
AircraftBeacon.signal_quality,
AircraftBeacon.altitude,
AircraftBeacon.device_id) \
.filter(and_(AircraftBeacon.location_mgrs != null(),
.filter(and_(between(AircraftBeacon.timestamp, start, end),
AircraftBeacon.location_mgrs != null(),
AircraftBeacon.receiver_id != null(),
AircraftBeacon.device_id != null())) \
.subquery()

Wyświetl plik

@ -8,6 +8,8 @@ from ogn.collect.stats import create_device_stats, create_receiver_stats, create
update_qualities, update_receivers as update_receivers_command, update_devices as update_devices_command,\
update_device_stats_jumps
from ogn.collect.ognrange import create_receiver_coverage
manager = Manager()
@ -41,3 +43,15 @@ def update_devices():
result = update_devices_command(session=session)
print(result)
@manager.command
def create_ognrange(start=None, end=None):
"""Create stats for Melissas ognrange."""
days = get_database_days(start, end)
pbar = tqdm(days)
for single_date in pbar:
pbar.set_description(datetime.strftime(single_date, '%Y-%m-%d'))
result = create_receiver_coverage(session=session, date=single_date)

Wyświetl plik

@ -9,7 +9,6 @@ class ReceiverCoverage(Base):
__tablename__ = "receiver_coverages"
location_mgrs = Column(String(9), primary_key=True)
receiver_id = Column(Integer, ForeignKey('receivers.id', ondelete='SET NULL'), primary_key=True)
date = Column(Date, primary_key=True)
max_signal_quality = Column(Float)
@ -20,5 +19,5 @@ class ReceiverCoverage(Base):
device_count = Column(SmallInteger)
# Relations
receiver_id = Column(Integer, ForeignKey('receivers.id', ondelete='SET NULL'), index=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()'))

Wyświetl plik

@ -1,8 +1,9 @@
import unittest
import os
from datetime import date
from ogn.model import AircraftBeacon, Receiver, ReceiverCoverage, Device
from ogn.collect.ognrange import update_receiver_coverage
from ogn.collect.ognrange import create_receiver_coverage
class TestDB(unittest.TestCase):
@ -51,7 +52,7 @@ class TestDB(unittest.TestCase):
def test_update_receiver_coverage(self):
session = self.session
update_receiver_coverage(session)
create_receiver_coverage(session, date=date(2017, 12, 10))
coverages = session.query(ReceiverCoverage).all()
self.assertEqual(len(coverages), 1)