kopia lustrzana https://github.com/glidernet/ogn-python
Test DeviceStats
rodzic
df8a7346e6
commit
acc4b858a8
|
@ -12,20 +12,23 @@ logger = get_task_logger(__name__)
|
|||
|
||||
|
||||
@app.task
|
||||
def update_device_stats(date=None):
|
||||
def update_device_stats(session=None, date=None):
|
||||
"""Add/update entries in device stats table."""
|
||||
|
||||
if session is None:
|
||||
session = app.session
|
||||
|
||||
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) \
|
||||
deleted_counter = session.query(DeviceStats) \
|
||||
.filter(DeviceStats.date == date) \
|
||||
.delete()
|
||||
|
||||
# Calculate stats for the selected date
|
||||
device_stats = app.session.query(
|
||||
device_stats = session.query(
|
||||
AircraftBeacon.device_id,
|
||||
func.date(AircraftBeacon.timestamp).label('date'),
|
||||
func.count(distinct(AircraftBeacon.receiver_id)).label('receiver_count'),
|
||||
|
@ -40,9 +43,9 @@ def update_device_stats(date=None):
|
|||
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)
|
||||
res = session.execute(ins)
|
||||
insert_counter = res.rowcount
|
||||
app.session.commit()
|
||||
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)
|
||||
|
@ -57,12 +60,12 @@ def update_receiver_stats(date=None):
|
|||
return None
|
||||
|
||||
# First kill the stats for the selected date
|
||||
deleted_counter = app.session.query(ReceiverStats) \
|
||||
deleted_counter = session.query(ReceiverStats) \
|
||||
.filter(ReceiverStats.date == date) \
|
||||
.delete()
|
||||
|
||||
# Calculate stats for the selected date
|
||||
receiver_stats = app.session.query(
|
||||
receiver_stats = session.query(
|
||||
AircraftBeacon.receiver_id,
|
||||
literal_column("'{}'".format(date)).label('date'),
|
||||
func.count(AircraftBeacon.id).label('aircraft_beacon_count'),
|
||||
|
@ -77,9 +80,9 @@ def update_receiver_stats(date=None):
|
|||
ins = insert(ReceiverStats).from_select(
|
||||
[ReceiverStats.receiver_id, ReceiverStats.date, ReceiverStats.aircraft_beacon_count, ReceiverStats.aircraft_count, ReceiverStats.max_distance],
|
||||
receiver_stats)
|
||||
res = app.session.execute(ins)
|
||||
res = session.execute(ins)
|
||||
insert_counter = res.rowcount
|
||||
app.session.commit()
|
||||
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)
|
||||
|
|
|
@ -17,3 +17,10 @@ class DeviceStats(Base):
|
|||
# Relations
|
||||
device_id = Column(Integer, ForeignKey('device.id', ondelete='SET NULL'), index=True)
|
||||
device = relationship('Device', foreign_keys=[device_id])
|
||||
|
||||
def __repr__(self):
|
||||
return "<DeviceStats: %s,%s,%s,%s>" % (
|
||||
self.date,
|
||||
self.receiver_count,
|
||||
self.aircraft_beacon_count,
|
||||
self.max_altitude)
|
||||
|
|
|
@ -0,0 +1,58 @@
|
|||
import unittest
|
||||
import os
|
||||
|
||||
from ogn.model import DeviceStats
|
||||
|
||||
from ogn.collect.stats import update_device_stats
|
||||
|
||||
|
||||
class TestDB(unittest.TestCase):
|
||||
session = None
|
||||
engine = None
|
||||
app = None
|
||||
|
||||
def setUp(self):
|
||||
os.environ['OGN_CONFIG_MODULE'] = 'config.test'
|
||||
from ogn.commands.dbutils import engine, session
|
||||
self.session = session
|
||||
self.engine = engine
|
||||
|
||||
from ogn.commands.database import init
|
||||
init()
|
||||
|
||||
session.execute("INSERT INTO device(address) VALUES('DDEFF7')")
|
||||
session.execute("INSERT INTO receiver(name) VALUES('Koenigsdf')")
|
||||
session.execute("INSERT INTO receiver(name) VALUES('Ohlstadt')")
|
||||
|
||||
def tearDown(self):
|
||||
session = self.session
|
||||
session.execute("DELETE FROM aircraft_beacon")
|
||||
session.execute("DELETE FROM device")
|
||||
|
||||
session.execute("DELETE FROM device_stats")
|
||||
session.execute("DELETE FROM receiver_stats")
|
||||
|
||||
def test_update_device_stats(self):
|
||||
session = self.session
|
||||
|
||||
session.execute("INSERT INTO aircraft_beacon(address, receiver_name, altitude, timestamp) VALUES('DDEFF7','Koenigsdf',604,'2016-07-02 10:47:12')")
|
||||
session.execute("INSERT INTO aircraft_beacon(address, receiver_name, altitude, timestamp) VALUES('DDEFF7','Koenigsdf',605,'2016-07-02 10:47:32')")
|
||||
session.execute("INSERT INTO aircraft_beacon(address, receiver_name, altitude, timestamp) VALUES('DDEFF7','Koenigsdf',606,'2016-07-02 10:47:52')")
|
||||
session.execute("INSERT INTO aircraft_beacon(address, receiver_name, altitude, timestamp) VALUES('DDEFF7','Ohlstadt',606,'2016-07-02 10:48:12')")
|
||||
session.execute("INSERT INTO aircraft_beacon(address, receiver_name, altitude, timestamp) VALUES('DDEFF7','Ohlstadt',606,'2016-07-02 10:48:24')")
|
||||
|
||||
session.execute("UPDATE aircraft_beacon SET device_id = d.id, receiver_id = r.id FROM device d, receiver r WHERE aircraft_beacon.address=d.address AND aircraft_beacon.receiver_name=r.name")
|
||||
|
||||
update_device_stats(session, date='2016-07-02')
|
||||
stats = session.query(DeviceStats).all()
|
||||
|
||||
self.assertEqual(len(stats), 1)
|
||||
|
||||
stat = stats[0]
|
||||
self.assertEqual(stat.receiver_count, 2)
|
||||
self.assertEqual(stat.aircraft_beacon_count, 5)
|
||||
self.assertEqual(stat.max_altitude, 606)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
Ładowanie…
Reference in New Issue