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
|
@app.task
|
||||||
def update_device_stats(date=None):
|
def update_device_stats(session=None, date=None):
|
||||||
"""Add/update entries in device stats table."""
|
"""Add/update entries in device stats table."""
|
||||||
|
|
||||||
|
if session is None:
|
||||||
|
session = app.session
|
||||||
|
|
||||||
if not date:
|
if not date:
|
||||||
logger.warn("A date is needed for calculating stats. Exiting")
|
logger.warn("A date is needed for calculating stats. Exiting")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
# First kill the stats for the selected date
|
# First kill the stats for the selected date
|
||||||
deleted_counter = app.session.query(DeviceStats) \
|
deleted_counter = session.query(DeviceStats) \
|
||||||
.filter(DeviceStats.date == date) \
|
.filter(DeviceStats.date == date) \
|
||||||
.delete()
|
.delete()
|
||||||
|
|
||||||
# Calculate stats for the selected date
|
# Calculate stats for the selected date
|
||||||
device_stats = app.session.query(
|
device_stats = session.query(
|
||||||
AircraftBeacon.device_id,
|
AircraftBeacon.device_id,
|
||||||
func.date(AircraftBeacon.timestamp).label('date'),
|
func.date(AircraftBeacon.timestamp).label('date'),
|
||||||
func.count(distinct(AircraftBeacon.receiver_id)).label('receiver_count'),
|
func.count(distinct(AircraftBeacon.receiver_id)).label('receiver_count'),
|
||||||
|
@ -40,9 +43,9 @@ def update_device_stats(date=None):
|
||||||
ins = insert(DeviceStats).from_select(
|
ins = insert(DeviceStats).from_select(
|
||||||
[DeviceStats.device_id, DeviceStats.date, DeviceStats.receiver_count, DeviceStats.aircraft_beacon_count, DeviceStats.max_altitude],
|
[DeviceStats.device_id, DeviceStats.date, DeviceStats.receiver_count, DeviceStats.aircraft_beacon_count, DeviceStats.max_altitude],
|
||||||
device_stats)
|
device_stats)
|
||||||
res = app.session.execute(ins)
|
res = session.execute(ins)
|
||||||
insert_counter = res.rowcount
|
insert_counter = res.rowcount
|
||||||
app.session.commit()
|
session.commit()
|
||||||
logger.debug("DeviceStats entries for {}: {} deleted, {} inserted".format(date, deleted_counter, insert_counter))
|
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)
|
return "DeviceStats entries for {}: {} deleted, {} inserted".format(date, deleted_counter, insert_counter)
|
||||||
|
@ -57,12 +60,12 @@ def update_receiver_stats(date=None):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
# First kill the stats for the selected date
|
# First kill the stats for the selected date
|
||||||
deleted_counter = app.session.query(ReceiverStats) \
|
deleted_counter = session.query(ReceiverStats) \
|
||||||
.filter(ReceiverStats.date == date) \
|
.filter(ReceiverStats.date == date) \
|
||||||
.delete()
|
.delete()
|
||||||
|
|
||||||
# Calculate stats for the selected date
|
# Calculate stats for the selected date
|
||||||
receiver_stats = app.session.query(
|
receiver_stats = session.query(
|
||||||
AircraftBeacon.receiver_id,
|
AircraftBeacon.receiver_id,
|
||||||
literal_column("'{}'".format(date)).label('date'),
|
literal_column("'{}'".format(date)).label('date'),
|
||||||
func.count(AircraftBeacon.id).label('aircraft_beacon_count'),
|
func.count(AircraftBeacon.id).label('aircraft_beacon_count'),
|
||||||
|
@ -77,9 +80,9 @@ def update_receiver_stats(date=None):
|
||||||
ins = insert(ReceiverStats).from_select(
|
ins = insert(ReceiverStats).from_select(
|
||||||
[ReceiverStats.receiver_id, ReceiverStats.date, ReceiverStats.aircraft_beacon_count, ReceiverStats.aircraft_count, ReceiverStats.max_distance],
|
[ReceiverStats.receiver_id, ReceiverStats.date, ReceiverStats.aircraft_beacon_count, ReceiverStats.aircraft_count, ReceiverStats.max_distance],
|
||||||
receiver_stats)
|
receiver_stats)
|
||||||
res = app.session.execute(ins)
|
res = session.execute(ins)
|
||||||
insert_counter = res.rowcount
|
insert_counter = res.rowcount
|
||||||
app.session.commit()
|
session.commit()
|
||||||
logger.debug("ReceiverStats entries for {}: {} deleted, {} inserted".format(date, deleted_counter, insert_counter))
|
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)
|
return "ReceiverStats entries for {}: {} deleted, {} inserted".format(date, deleted_counter, insert_counter)
|
||||||
|
|
|
@ -17,3 +17,10 @@ class DeviceStats(Base):
|
||||||
# Relations
|
# Relations
|
||||||
device_id = Column(Integer, ForeignKey('device.id', ondelete='SET NULL'), index=True)
|
device_id = Column(Integer, ForeignKey('device.id', ondelete='SET NULL'), index=True)
|
||||||
device = relationship('Device', foreign_keys=[device_id])
|
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