diff --git a/ogn/collect/logbook.py b/ogn/collect/logbook.py index 84a8759..7ae6e0b 100644 --- a/ogn/collect/logbook.py +++ b/ogn/collect/logbook.py @@ -107,23 +107,24 @@ def compute_logbook_entries(session=None): upd = update(Logbook) \ .where(and_(Logbook.device_id == complete_flights.c.device_id, or_(and_(Logbook.takeoff_airport_id == complete_flights.c.takeoff_airport_id, - Logbook.takeoff_timestamp == complete_flights.c.takeoff_timestamp), - Logbook.takeoff_airport_id == null()), - or_(and_(Logbook.landing_airport_id == complete_flights.c.landing_airport_id, - Logbook.landing_timestamp == complete_flights.c.landing_timestamp), - Logbook.landing_airport_id == null()))) \ + Logbook.takeoff_timestamp == complete_flights.c.takeoff_timestamp, + Logbook.landing_airport_id == null()), + and_(Logbook.takeoff_airport_id == null(), + Logbook.landing_airport_id == complete_flights.c.landing_airport_id, + Logbook.landing_timestamp == complete_flights.c.landing_timestamp)))) \ .values({"takeoff_timestamp": complete_flights.c.takeoff_timestamp, "takeoff_track": complete_flights.c.takeoff_track, "takeoff_airport_id": complete_flights.c.takeoff_airport_id, "landing_timestamp": complete_flights.c.landing_timestamp, "landing_track": complete_flights.c.landing_track, "landing_airport_id": complete_flights.c.landing_airport_id, - "duration": complete_flights.c.duration}) + "duration": complete_flights.c.duration, + "max_altitude": 1}) result = session.execute(upd) - counter = result.rowcount + update_counter = result.rowcount session.commit() - logger.debug("Updated logbook entries: {}".format(counter)) + logger.debug("Updated logbook entries: {}".format(update_counter)) # unite all computated flights ('incomplete' and 'complete') union_query = complete_flight_query.union( @@ -136,12 +137,13 @@ def compute_logbook_entries(session=None): # consider only if not already stored new_logbook_entries = session.query(union_query) \ .filter(~exists().where( - and_(Logbook.reftime == union_query.c.reftime, - Logbook.device_id == union_query.c.device_id, - or_(Logbook.takeoff_airport_id == union_query.c.takeoff_airport_id, + and_(Logbook.device_id == union_query.c.device_id, + or_(and_(Logbook.takeoff_airport_id == union_query.c.takeoff_airport_id, + Logbook.takeoff_timestamp == union_query.c.takeoff_timestamp), and_(Logbook.takeoff_airport_id == null(), union_query.c.takeoff_airport_id == null())), - or_(Logbook.landing_airport_id == union_query.c.landing_airport_id, + or_(and_(Logbook.landing_airport_id == union_query.c.landing_airport_id, + Logbook.landing_timestamp == union_query.c.landing_timestamp), and_(Logbook.landing_airport_id == null(), union_query.c.landing_airport_id == null()))))) @@ -158,8 +160,8 @@ def compute_logbook_entries(session=None): new_logbook_entries) result = session.execute(ins) - counter = result.rowcount + insert_counter = result.rowcount session.commit() - logger.debug("New logbook entries: {}".format(counter)) + logger.debug("New logbook entries: {}".format(insert_counter)) - return counter + return "{}/{}".format(update_counter, insert_counter) diff --git a/tests/collect/test_logbook.py b/tests/collect/test_logbook.py index 2b93a61..0795ce5 100644 --- a/tests/collect/test_logbook.py +++ b/tests/collect/test_logbook.py @@ -11,6 +11,11 @@ class TestDB(unittest.TestCase): engine = None app = None + TAKEOFF_KOENIGSDF_DD0815 = "INSERT INTO takeoff_landing(device_id, airport_id, timestamp, is_takeoff) SELECT d.id, a.id, '2016-06-01 10:00:00', TRUE FROM airport a, device d WHERE a.name='Koenigsdorf' and d.address = 'DD0815'" + LANDING_KOENIGSDF_DD0815 = "INSERT INTO takeoff_landing(device_id, airport_id, timestamp, is_takeoff) SELECT d.id, a.id, '2016-06-01 10:05:00', FALSE FROM airport a, device d WHERE a.name='Koenigsdorf' and d.address = 'DD0815'" + LANDING_KOENIGSDF_DD0815_LATER = "INSERT INTO takeoff_landing(device_id, airport_id, timestamp, is_takeoff) SELECT d.id, a.id, '2016-06-02 10:05:00', FALSE FROM airport a, device d WHERE a.name='Koenigsdorf' and d.address = 'DD0815'" + TAKEOFF_OHLSTADT_DD4711 = "INSERT INTO takeoff_landing(device_id, airport_id, timestamp, is_takeoff) SELECT d.id, a.id, '2016-06-01 10:00:00', TRUE FROM airport a, device d WHERE a.name='Ohlstadt' and d.address = 'DD4711'" + def setUp(self): os.environ['OGN_CONFIG_MODULE'] = 'config.test' from ogn.commands.dbutils import engine, session @@ -32,88 +37,89 @@ class TestDB(unittest.TestCase): session.commit() pass - def count_logbook_entries(self): - session = self.session - logbook_query = session.query(Logbook) - i = 0 - for logbook in logbook_query.all(): - i = i + 1 - print("{} {} {} {} {} {}".format(logbook.id, logbook.device_id, logbook.takeoff_airport_id, logbook.takeoff_timestamp, logbook.landing_airport_id, logbook.landing_timestamp)) - - return i - def test_single_takeoff(self): session = self.session - session.execute("INSERT INTO takeoff_landing(device_id, airport_id, timestamp, is_takeoff) SELECT d.id, a.id, '2016-06-01 10:00:00', TRUE FROM airport a, device d WHERE a.name='Koenigsdorf' and d.address = 'DD0815'") + session.execute(self.TAKEOFF_KOENIGSDF_DD0815) session.commit() - compute_logbook_entries(session) - self.assertEqual(self.count_logbook_entries(), 1) + entries_changed = compute_logbook_entries(session) + self.assertEqual(entries_changed, '0/1') def test_single_landing(self): session = self.session - session.execute("INSERT INTO takeoff_landing(device_id, airport_id, timestamp, is_takeoff) SELECT d.id, a.id, '2016-06-01 10:00:00', FALSE FROM airport a, device d WHERE a.name='Koenigsdorf' and d.address = 'DD0815'") + session.execute(self.LANDING_KOENIGSDF_DD0815) session.commit() - compute_logbook_entries(session) - self.assertEqual(self.count_logbook_entries(), 1) + entries_changed = compute_logbook_entries(session) + self.assertEqual(entries_changed, '0/1') def test_different_takeoffs(self): session = self.session - session.execute("INSERT INTO takeoff_landing(device_id, airport_id, timestamp, is_takeoff) SELECT d.id, a.id, '2016-06-01 10:00:00', TRUE FROM airport a, device d WHERE a.name='Koenigsdorf' and d.address = 'DD0815'") - session.execute("INSERT INTO takeoff_landing(device_id, airport_id, timestamp, is_takeoff) SELECT d.id, a.id, '2016-06-01 10:00:00', TRUE FROM airport a, device d WHERE a.name='Ohlstadt' and d.address = 'DD4711'") + session.execute(self.TAKEOFF_KOENIGSDF_DD0815) + session.execute(self.TAKEOFF_OHLSTADT_DD4711) session.commit() - compute_logbook_entries(session) - self.assertEqual(self.count_logbook_entries(), 2) + entries_changed = compute_logbook_entries(session) + self.assertEqual(entries_changed, '0/2') def test_takeoff_and_landing(self): session = self.session - session.execute("INSERT INTO takeoff_landing(device_id, airport_id, timestamp, is_takeoff) SELECT d.id, a.id, '2016-06-01 10:00:00', TRUE FROM airport a, device d WHERE a.name='Koenigsdorf' and d.address = 'DD0815'") - session.execute("INSERT INTO takeoff_landing(device_id, airport_id, timestamp, is_takeoff) SELECT d.id, a.id, '2016-06-01 10:05:00', FALSE FROM airport a, device d WHERE a.name='Koenigsdorf' and d.address = 'DD0815'") + session.execute(self.TAKEOFF_KOENIGSDF_DD0815) + session.execute(self.LANDING_KOENIGSDF_DD0815) session.commit() - compute_logbook_entries(session) - self.assertEqual(self.count_logbook_entries(), 1) + entries_changed = compute_logbook_entries(session) + self.assertEqual(entries_changed, '0/1') def test_takeoff_and_landing_on_different_days(self): session = self.session - session.execute("INSERT INTO takeoff_landing(device_id, airport_id, timestamp, is_takeoff) SELECT d.id, a.id, '2016-06-01 10:00:00', TRUE FROM airport a, device d WHERE a.name='Koenigsdorf' and d.address = 'DD0815'") - session.execute("INSERT INTO takeoff_landing(device_id, airport_id, timestamp, is_takeoff) SELECT d.id, a.id, '2016-06-02 10:05:00', FALSE FROM airport a, device d WHERE a.name='Koenigsdorf' and d.address = 'DD0815'") + session.execute(self.TAKEOFF_KOENIGSDF_DD0815) + session.execute(self.LANDING_KOENIGSDF_DD0815_LATER) session.commit() - compute_logbook_entries(session) - self.assertEqual(self.count_logbook_entries(), 2) + entries_changed = compute_logbook_entries(session) + self.assertEqual(entries_changed, '0/2') def test_update(self): session = self.session - session.execute("INSERT INTO takeoff_landing(device_id, airport_id, timestamp, is_takeoff) SELECT d.id, a.id, '2016-06-01 10:00:00', TRUE FROM airport a, device d WHERE a.name='Koenigsdorf' and d.address = 'DD0815'") + session.execute(self.TAKEOFF_KOENIGSDF_DD0815) session.commit() - compute_logbook_entries(session) - session.execute("INSERT INTO takeoff_landing(device_id, airport_id, timestamp, is_takeoff) SELECT d.id, a.id, '2016-06-01 10:05:00', FALSE FROM airport a, device d WHERE a.name='Koenigsdorf' and d.address = 'DD0815'") + + entries_changed = compute_logbook_entries(session) + self.assertEqual(entries_changed, '0/1') + + session.execute(self.LANDING_KOENIGSDF_DD0815) session.commit() - compute_logbook_entries(session) - self.assertEqual(self.count_logbook_entries(), 1) + entries_changed = compute_logbook_entries(session) + self.assertEqual(entries_changed, '1/0') + + session.execute(self.TAKEOFF_OHLSTADT_DD4711) + session.commit() + + entries_changed = compute_logbook_entries(session) + self.assertEqual(entries_changed, '0/1') - @unittest.skip("Doesnt work... dont know why. Fix it!") def test_update_wrong_order(self): session = self.session - session.execute("INSERT INTO takeoff_landing(device_id, airport_id, timestamp, is_takeoff) SELECT d.id, a.id, '2016-06-01 10:05:00', FALSE FROM airport a, device d WHERE a.name='Koenigsdorf' and d.address = 'DD0815'") + session.execute(self.LANDING_KOENIGSDF_DD0815) session.commit() - compute_logbook_entries(session) - session.execute("INSERT INTO takeoff_landing(device_id, airport_id, timestamp, is_takeoff) SELECT d.id, a.id, '2016-06-01 10:00:00', TRUE FROM airport a, device d WHERE a.name='Koenigsdorf' and d.address = 'DD0815'") - session.commit() - compute_logbook_entries(session) - self.assertEqual(self.count_logbook_entries(), 1) + entries_changed = compute_logbook_entries(session) + self.assertEqual(entries_changed, '0/1') + + session.execute(self.TAKEOFF_KOENIGSDF_DD0815) + session.commit() + + entries_changed = compute_logbook_entries(session) + self.assertEqual(entries_changed, '1/0') if __name__ == '__main__': unittest.main()