Jelajahi Sumber

Fix SQL for updating driver actions, renamed IDs for action and driver

Lukas Cerny 1 tahun lalu
induk
melakukan
b84e13bcab

+ 4 - 20
sql/init.sql

@@ -85,36 +85,20 @@ ALTER TABLE ONLY maplog.obs_telemetry ALTER COLUMN obs_id SET DEFAULT nextval('m
 
 
 CREATE TABLE maplog.driver (
-    id INTEGER NOT NULL PRIMARY KEY,
+    driver_id INTEGER NOT NULL PRIMARY KEY,
     name VARCHAR(100) NOT NULL
 );
 
 ALTER TABLE maplog.driver OWNER TO senslog;
 
-CREATE SEQUENCE maplog.driver_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1;
-
-ALTER TABLE maplog.driver_id_seq OWNER TO senslog;
-
-ALTER SEQUENCE maplog.driver_id_seq OWNED BY maplog.driver.id;
-
-ALTER TABLE ONLY maplog.driver ALTER COLUMN id SET DEFAULT nextval('maplog.driver_id_seq'::regclass);
-
 
 CREATE TABLE maplog.action (
-    id INTEGER NOT NULL PRIMARY KEY,
+    action_id INTEGER NOT NULL PRIMARY KEY,
     name VARCHAR(100) NOT NULL
 );
 
 ALTER TABLE maplog.action OWNER TO senslog;
 
-CREATE SEQUENCE maplog.action_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1;
-
-ALTER TABLE maplog.action_id_seq OWNER TO senslog;
-
-ALTER SEQUENCE maplog.action_id_seq OWNED BY maplog.driver.id;
-
-ALTER TABLE ONLY maplog.action ALTER COLUMN id SET DEFAULT nextval('maplog.action_id_seq'::regclass);
-
 
 CREATE TABLE maplog.driver_to_action (
     id          BIGINT NOT NULL PRIMARY KEY,
@@ -280,9 +264,9 @@ ALTER TABLE ONLY maplog.unit_to_sensor ADD CONSTRAINT uts_unitid_fk FOREIGN KEY
 
 ALTER TABLE ONLY maplog.driver_to_action ADD CONSTRAINT dta_unitid_fk FOREIGN KEY (unit_id) REFERENCES maplog.unit(unit_id) ON UPDATE CASCADE ON DELETE CASCADE;
 
-ALTER TABLE ONLY maplog.driver_to_action ADD CONSTRAINT dta_driverid_fk FOREIGN KEY (driver_id) REFERENCES maplog.driver(id) ON UPDATE CASCADE ON DELETE CASCADE;
+ALTER TABLE ONLY maplog.driver_to_action ADD CONSTRAINT dta_driverid_fk FOREIGN KEY (driver_id) REFERENCES maplog.driver() ON UPDATE CASCADE ON DELETE CASCADE;
 
-ALTER TABLE ONLY maplog.driver_to_action ADD CONSTRAINT dta_actionid_fk FOREIGN KEY (action_id) REFERENCES maplog.action(id) ON UPDATE CASCADE ON DELETE CASCADE;
+ALTER TABLE ONLY maplog.driver_to_action ADD CONSTRAINT dta_actionid_fk FOREIGN KEY (action_id) REFERENCES maplog.action(action_id) ON UPDATE CASCADE ON DELETE CASCADE;
 
 REVOKE USAGE ON SCHEMA public FROM PUBLIC;
 GRANT ALL ON SCHEMA public TO PUBLIC;

+ 3 - 4
src/main/java/cz/senslog/telemetry/database/domain/DriverAction.java

@@ -1,6 +1,5 @@
 package cz.senslog.telemetry.database.domain;
 
-import java.time.Instant;
 import java.time.OffsetDateTime;
 
 public class DriverAction {
@@ -8,9 +7,9 @@ public class DriverAction {
     private final long unitId;
     private final long driverId;
     private final long actionId;
-    private final Instant timestamp;
+    private final OffsetDateTime timestamp;
 
-    public DriverAction(long unitId, long driverId, long actionId, Instant timestamp) {
+    public DriverAction(long unitId, long driverId, long actionId, OffsetDateTime timestamp) {
         this.unitId = unitId;
         this.driverId = driverId;
         this.actionId = actionId;
@@ -29,7 +28,7 @@ public class DriverAction {
         return actionId;
     }
 
-    public Instant getTimestamp() {
+    public OffsetDateTime getTimestamp() {
         return timestamp;
     }
 }

+ 44 - 42
src/main/java/cz/senslog/telemetry/database/repository/MapLogRepository.java

@@ -39,20 +39,29 @@ public class MapLogRepository implements SensLogRepository {
     }
 
     @Override
-    public Future<Integer> updateDriverAction(DriverAction data) {
+    public Future<Integer> updateActionByDriverUnit(DriverAction data) {
         Tuple params = Tuple.of(data.getTimestamp(), data.getDriverId(), data.getActionId(), data.getUnitId());
-        return client.withTransaction(client -> client
-                .preparedQuery("UPDATE maplog.driver_to_action SET to_time=$1 " +
-                        "WHERE driver_id = $2 AND action_id = $3 AND unitId = $4 AND to_time IS NULL AND from_time < $1")
+        return client.withTransaction(conn -> conn.preparedQuery("UPDATE maplog.driver_to_action SET to_time = $1 " +
+                        "WHERE driver_id = $2 AND action_id = $3 AND unit_id = $4 AND to_time IS NULL AND from_time < $1 RETURNING id")
                 .execute(params)
-                .flatMap(res -> {
-                    if (res.rowCount() <= 0) {
-                        return client.preparedQuery("INSERT INTO maplog.driver_to_action(from_time, driverId, actionId, unitId) VALUES ($1, $2, $3, $4)")
+                .flatMap(r1 -> {
+                    if (r1.rowCount() <= 0) {
+                        return conn.preparedQuery("INSERT INTO maplog.driver_to_action(from_time, driver_id, action_id, unit_id) " +
+                                        "SELECT $1, $2, $3, $4  WHERE EXISTS(SELECT action_id FROM maplog.action WHERE action_id = $3) RETURNING id")
                                 .execute(params)
-                                .map(RowSet::rowCount)
-                                .onFailure(logger::catching);
+                                .flatMap(r2 -> {
+                                    if (r2.rowCount() <= 0) {
+                                        return conn.preparedQuery("WITH rows AS (INSERT INTO maplog.action(action_id, name) VALUES ($3, 'GENERATED-ACTION') RETURNING action_id) " +
+                                                            "INSERT INTO maplog.driver_to_action(from_time, driver_id, action_id, unit_id) " +
+                                                                "SELECT $1, $2, rows.action_id, $4 FROM rows RETURNING id;")
+                                                .execute(params)
+                                                .map(RowSet::rowCount);
+                                    } else {
+                                        return Future.succeededFuture(r2.rowCount());
+                                    }
+                                });
                     }
-                    return Future.succeededFuture(res.rowCount());
+                    return Future.succeededFuture(r1.rowCount());
                 }));
     }
 
@@ -68,16 +77,9 @@ public class MapLogRepository implements SensLogRepository {
                         data.getLocation().getAltitude(),
                         data.getLocation().getAngle(),
                         data.getSpeed(),
-                        data.getObservedValues()
-                ))
-                .onComplete(res -> {
-                    if (res.succeeded()) {
-                        logger.info(res.result());
-                    } else {
-                        logger.error(res.cause());
-                    }
-                })
-                .map(rs -> rs.iterator().next().getInteger(0));
+                        data.getObservedValues()))
+                .map(RowSet::iterator)
+                .map(it -> it.hasNext() ? it.next().getInteger(0) : 0);
     }
 
     @Override
@@ -309,24 +311,24 @@ public class MapLogRepository implements SensLogRepository {
 
     @Override
     public Future<List<Driver>> allDrivers() {
-        return client.query("SELECT id, name FROM maplog.driver ORDER BY id")
+        return client.query("SELECT driver_id, name FROM maplog.driver ORDER BY driver_id")
                 .execute()
                 .map(rs -> StreamSupport.stream(rs.spliterator(), false)
                         .map(row -> Driver.of(
-                                row.getInteger("id"),
+                                row.getInteger("driver_id"),
                                 row.getString("name")
                         )).collect(toList())
                 );
     }
 
     private static final Function<Row, Driver> ROW_TO_DRIVER = (row) -> Driver.of(
-            row.getInteger("id"),
+            row.getInteger("driver_id"),
             row.getString("name")
     );
 
     @Override
     public Future<Driver> findDriverById(int driverId) {
-        return client.preparedQuery("SELECT id, name FROM maplog.driver WHERE id = $1")
+        return client.preparedQuery("SELECT driver_id, name FROM maplog.driver WHERE driver_id = $1")
                 .execute(Tuple.of(driverId))
                 .map(RowSet::iterator)
                 .map(iterator -> iterator.hasNext() ? ROW_TO_DRIVER.apply(iterator.next()) : null)
@@ -336,13 +338,13 @@ public class MapLogRepository implements SensLogRepository {
 
     @Override
     public Future<List<Driver>> findDriversByUnitId(long unitId) {
-        return client.preparedQuery("SELECT d.id, d.name FROM maplog.driver AS d " +
-                        "JOIN maplog.driver_to_action AS dta ON dta.driver_id = d.id " +
+        return client.preparedQuery("SELECT d.driver_id, d.name FROM maplog.driver AS d " +
+                        "JOIN maplog.driver_to_action AS dta ON dta.driver_id = d.driver_id " +
                         "WHERE dta.unit_id = $1")
                 .execute(Tuple.of(unitId))
                 .map(rs -> StreamSupport.stream(rs.spliterator(), false)
                         .map(row -> Driver.of(
-                                row.getInteger("id"),
+                                row.getInteger("driver_id"),
                                 row.getString("name")
                         )).collect(toList())
                 );
@@ -350,13 +352,13 @@ public class MapLogRepository implements SensLogRepository {
 
     @Override
     public Future<List<Action>> findActionsByDriverIdAndUnitId(int driverId, long unitId) {
-        return client.preparedQuery("SELECT a.id, a.name FROM maplog.action AS a " +
-                "JOIN maplog.driver_to_action AS dta ON a.id = dta.action_id " +
-                "WHERE dta.driver_id = $1 AND dta.unit_id = $2 ORDER BY a.id")
+        return client.preparedQuery("SELECT a.action_id, a.name FROM maplog.action AS a " +
+                "JOIN maplog.driver_to_action AS dta ON a.action_id = dta.action_id " +
+                "WHERE dta.driver_id = $1 AND dta.unit_id = $2 ORDER BY a.action_id")
                 .execute(Tuple.of(driverId, unitId))
                 .map(rs -> StreamSupport.stream(rs.spliterator(), false)
                         .map(row -> Action.of(
-                                row.getInteger("id"),
+                                row.getInteger("action_id"),
                                 row.getString("name")
                         )).collect(toList())
                 );
@@ -364,28 +366,28 @@ public class MapLogRepository implements SensLogRepository {
 
     @Override
     public Future<List<Action>> findActionsByDriverId(int driverId) {
-        return client.preparedQuery("SELECT a.id, a.name FROM maplog.action AS a " +
-                        "JOIN maplog.driver_to_action AS dta ON a.id = dta.action_id " +
-                        "WHERE dta.driver_id = $1 ORDER BY a.id")
+        return client.preparedQuery("SELECT a.action_id, a.name FROM maplog.action AS a " +
+                        "JOIN maplog.driver_to_action AS dta ON a.action_id = dta.action_id " +
+                        "WHERE dta.driver_id = $1 ORDER BY a.action_id")
                 .execute(Tuple.of(driverId))
                 .map(rs -> StreamSupport.stream(rs.spliterator(), false)
                         .map(row -> Action.of(
-                                row.getInteger("id"),
+                                row.getInteger("action_id"),
                                 row.getString("name")
                         )).collect(toList())
                 );
     }
 
     private static final Function<Row, Action> ROW_TO_ACTION = (row) -> Action.of(
-            row.getInteger("id"),
+            row.getInteger("action_id"),
             row.getString("name")
     );
 
     @Override
     public Future<Action> findActionByIdAndDriverId(int actionId, int driverId) {
-        return client.preparedQuery("SELECT a.id, a.name FROM maplog.action AS a " +
-                "JOIN maplog.driver_to_action AS dta ON a.id = dta.action_id " +
-                "WHERE a.id = $1 AND dta.driver_id = $2")
+        return client.preparedQuery("SELECT a.action_id, a.name FROM maplog.action AS a " +
+                "JOIN maplog.driver_to_action AS dta ON a.action_id = dta.action_id " +
+                "WHERE a.action_id = $1 AND dta.driver_id = $2")
                 .execute(Tuple.of(actionId, driverId))
                 .map(RowSet::iterator)
                 .map(iterator -> iterator.hasNext() ? ROW_TO_ACTION.apply(iterator.next()) : null)
@@ -395,9 +397,9 @@ public class MapLogRepository implements SensLogRepository {
 
     @Override
     public Future<Action> findActionByIdAndDriverIdAndUnitId(int actionId, int driverId, long unitId) {
-        return client.preparedQuery("SELECT a.id, a.name FROM maplog.action AS a " +
-                        "JOIN maplog.driver_to_action AS dta ON a.id = dta.action_id " +
-                        "WHERE a.id = $1 AND dta.driver_id = $2 AND dta.unit_id = $3")
+        return client.preparedQuery("SELECT a.action_id, a.name FROM maplog.action AS a " +
+                        "JOIN maplog.driver_to_action AS dta ON a.action_id = dta.action_id " +
+                        "WHERE a.action_id = $1 AND dta.driver_id = $2 AND dta.unit_id = $3")
                 .execute(Tuple.of(actionId, driverId, unitId))
                 .map(RowSet::iterator)
                 .map(iterator -> iterator.hasNext() ? ROW_TO_ACTION.apply(iterator.next()) : null)

+ 1 - 1
src/main/java/cz/senslog/telemetry/database/repository/MockMapLogRepository.java

@@ -18,7 +18,7 @@ public class MockMapLogRepository implements SensLogRepository {
     private static final Logger logger = LogManager.getLogger(MockMapLogRepository.class);
 
     @Override
-    public Future<Integer> updateDriverAction(DriverAction data) {
+    public Future<Integer> updateActionByDriverUnit(DriverAction data) {
         return Future.succeededFuture(1);
     }
 

+ 1 - 1
src/main/java/cz/senslog/telemetry/database/repository/SensLogRepository.java

@@ -12,7 +12,7 @@ import java.util.Map;
 
 public interface SensLogRepository {
 
-    Future<Integer> updateDriverAction(DriverAction data);
+    Future<Integer> updateActionByDriverUnit(DriverAction data);
     Future<Integer> saveTelemetry(UnitTelemetry data);
     Future<Integer> saveAllTelemetry(List<UnitTelemetry> data);
 

+ 2 - 1
src/main/java/cz/senslog/telemetry/server/Fm4exSocketHandler.java

@@ -144,7 +144,8 @@ public class Fm4exSocketHandler {
                 return Future.failedFuture(String.format("AVL Driver Activity Packet requires IO ID <%d> and <%d>.", DRIVER_IO_ID, ACTION_IO_ID));
             }
 
-            return repo.updateDriverAction(new DriverAction(contextUnit.getUnitId(), driverId, actionId, avlPacket.getTimestamp()))
+            OffsetDateTime timestamp = avlPacket.getTimestamp().atZone(UTC).toOffsetDateTime();
+            return repo.updateActionByDriverUnit(new DriverAction(contextUnit.getUnitId(), driverId, actionId, timestamp))
                     .map(res -> res > 0 ? SUCCESS : ERROR)
                     .onSuccess(res -> logger.info("[{}] AVL Driver Activity Packet was saved successfully.", socketId));
         }

+ 111 - 0
src/test/java/cz/senslog/telemetry/database/repository/MapLogRepositoryTest.java

@@ -0,0 +1,111 @@
+package cz.senslog.telemetry.database.repository;
+
+import cz.senslog.telemetry.BinaryDataSet;
+import cz.senslog.telemetry.DataSet;
+import cz.senslog.telemetry.TestPropertiesUtils;
+import cz.senslog.telemetry.app.PropertyConfig;
+import cz.senslog.telemetry.database.domain.DriverAction;
+import cz.senslog.telemetry.database.domain.Unit;
+import io.vertx.core.Vertx;
+import io.vertx.core.json.JsonObject;
+import io.vertx.junit5.VertxExtension;
+import io.vertx.junit5.VertxTestContext;
+import io.vertx.pgclient.PgPool;
+import org.junit.jupiter.api.*;
+import org.junit.jupiter.api.extension.ExtendWith;
+import uk.org.webcompere.systemstubs.environment.EnvironmentVariables;
+import uk.org.webcompere.systemstubs.jupiter.SystemStub;
+import uk.org.webcompere.systemstubs.jupiter.SystemStubsExtension;
+
+import java.time.LocalDateTime;
+import java.time.OffsetDateTime;
+import java.time.ZoneOffset;
+import java.util.Map;
+import java.util.Properties;
+
+import static cz.senslog.telemetry.database.ConnectionPool.createWithVertx;
+import static org.assertj.core.api.Assertions.assertThat;
+
+@ExtendWith({VertxExtension.class, SystemStubsExtension.class})
+class MapLogRepositoryTest {
+
+    private static final long TEST_UNIT_ID = 100001;
+    private static final BinaryDataSet<String> IMEI_DATASET = DataSet.IMEI_1();
+    private static final Unit TEST_UNIT = Unit.of(TEST_UNIT_ID, IMEI_DATASET.getObject());
+
+    @SystemStub
+    private EnvironmentVariables envVariable;
+
+    private PgPool pgPool;
+
+    private MapLogRepository repo;
+
+    @BeforeEach
+    void create_repository(Vertx vertx, VertxTestContext testContext) {
+        Properties props = TestPropertiesUtils.loadFromResources("tests.junit.env");
+        for (Map.Entry<Object, Object> propEntry : props.entrySet()) {
+            envVariable.set(propEntry.getKey(), propEntry.getValue());
+        }
+
+        pgPool = createWithVertx(vertx, JsonObject.of("db", PropertyConfig.getInstance().db()));
+        repo = MapLogRepository.create(pgPool);
+
+        testContext.completeNow();
+
+        // create sensor network
+//        pgPool.preparedQuery("INSERT INTO maplog.unit_type(unit_type_id, type_name) VALUES($1, $2) RETURNING (unit_type_id)")
+//                .execute(Tuple.of("T", "test"))
+//                .map(rs -> rs.iterator().next().getString("unit_type_id"))
+//                .onComplete(unit_type_id -> pgPool.preparedQuery("INSERT INTO  maplog.unit(unit_id, imei, unit_type_id) VALUES($1, $2, $3) RETURNING (unit_id)")
+//                        .execute(Tuple.of(TEST_UNIT.getUnitId(), TEST_UNIT.getImei(), unit_type_id.result()))
+//                        .map(rs -> rs.iterator().next().getLong("unit_id"))
+//                        .onComplete(testContext.succeeding(unit_id -> testContext.verify(() -> {
+//                            assertThat(unit_id).isEqualTo(TEST_UNIT.getUnitId());
+//                            testContext.completeNow();
+//                        })))
+//                );
+
+    }
+
+    @Test
+    void saveDriverActivity(Vertx vertx, VertxTestContext testContext) {
+
+        final int driverId = 1;
+        final int actionId = 8;
+        final OffsetDateTime timestamp = OffsetDateTime.of(LocalDateTime.of(2023, 1, 10, 5, 33), ZoneOffset.UTC);
+
+        DriverAction dr = new DriverAction(1000, driverId, actionId, timestamp);
+
+        repo.updateActionByDriverUnit(dr).onComplete(testContext.succeeding(res -> testContext.verify(() -> {
+            assertThat(res).isGreaterThan(0);
+            testContext.completeNow();
+        })));
+    }
+
+//    @Test
+//    void save(Vertx vertx, VertxTestContext testContext) {
+//
+//        Location location = Location.of(49.7384f, 13.3736f, 0, 0);
+//        UnitTelemetry obs = UnitTelemetry.of(TEST_UNIT_ID, OffsetDateTime.now(), location, 0, JsonObject.of());
+//
+//        List<UnitTelemetry> data = List.of(obs);
+//
+//        repo.saveAllTelemetry(data).onComplete(testContext.succeeding(res -> testContext.verify(() -> {
+//            assertThat(res).isEqualTo(data.size());
+//            testContext.completeNow();
+//        })));
+//    }
+
+//    @AfterEach
+//    void clean(Vertx vertx, VertxTestContext testContext) {
+//        pgPool.preparedQuery("DELETE FROM maplog.unit WHERE unit_id = $1 RETURNING (unit_type_id)")
+//                .execute(Tuple.of(TEST_UNIT_ID))
+//                .map(rs -> rs.iterator().next().getString("unit_type_id"))
+//                .onComplete(delUnit ->
+//                        pgPool.preparedQuery("DELETE FROM maplog.unit_type WHERE unit_type_id = $1")
+//                                .execute(Tuple.of(delUnit.result()))
+//                                .onComplete(testContext.succeedingThenComplete())
+//                );
+//    }
+
+}

+ 0 - 93
src/test/java/cz/senslog/telemetry/database/repository/TelemetryRepositoryTest.java

@@ -1,93 +0,0 @@
-package cz.senslog.telemetry.database.repository;
-
-import cz.senslog.telemetry.BinaryDataSet;
-import cz.senslog.telemetry.DataSet;
-import cz.senslog.telemetry.TestPropertiesUtils;
-import cz.senslog.telemetry.app.PropertyConfig;
-import cz.senslog.telemetry.database.domain.Location;
-import cz.senslog.telemetry.database.domain.UnitTelemetry;
-import cz.senslog.telemetry.database.domain.Unit;
-import io.vertx.core.Vertx;
-import io.vertx.core.json.JsonObject;
-import io.vertx.junit5.VertxExtension;
-import io.vertx.junit5.VertxTestContext;
-import io.vertx.pgclient.PgPool;
-import io.vertx.sqlclient.Tuple;
-import org.junit.jupiter.api.*;
-import org.junit.jupiter.api.extension.ExtendWith;
-import uk.org.webcompere.systemstubs.environment.EnvironmentVariables;
-import uk.org.webcompere.systemstubs.jupiter.SystemStub;
-import uk.org.webcompere.systemstubs.jupiter.SystemStubsExtension;
-
-import java.time.OffsetDateTime;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
-import static cz.senslog.telemetry.database.ConnectionPool.createWithVertx;
-import static org.assertj.core.api.Assertions.assertThat;
-
-@ExtendWith({VertxExtension.class, SystemStubsExtension.class})
-class TelemetryRepositoryTest {
-
-    private static final long TEST_UNIT_ID = 100001;
-    private static final BinaryDataSet<String> IMEI_DATASET = DataSet.IMEI_1();
-    private static final Unit TEST_UNIT = Unit.of(TEST_UNIT_ID, IMEI_DATASET.getObject());
-
-    @SystemStub
-    private EnvironmentVariables envVariable;
-
-    private PgPool pgPool;
-
-    @BeforeEach
-    void create_repository(Vertx vertx, VertxTestContext testContext) {
-        Properties props = TestPropertiesUtils.loadFromResources("tests.junit.env");
-        for (Map.Entry<Object, Object> propEntry : props.entrySet()) {
-            envVariable.set(propEntry.getKey(), propEntry.getValue());
-        }
-
-        pgPool = createWithVertx(vertx, JsonObject.of("db", PropertyConfig.getInstance().db()));
-
-        // create sensor network
-        pgPool.preparedQuery("INSERT INTO maplog.unit_type(unit_type_id, type_name) VALUES($1, $2) RETURNING (unit_type_id)")
-                .execute(Tuple.of("T", "test"))
-                .map(rs -> rs.iterator().next().getString("unit_type_id"))
-                .onComplete(unit_type_id -> pgPool.preparedQuery("INSERT INTO  maplog.unit(unit_id, imei, unit_type_id) VALUES($1, $2, $3) RETURNING (unit_id)")
-                        .execute(Tuple.of(TEST_UNIT.getUnitId(), TEST_UNIT.getImei(), unit_type_id.result()))
-                        .map(rs -> rs.iterator().next().getLong("unit_id"))
-                        .onComplete(testContext.succeeding(unit_id -> testContext.verify(() -> {
-                            assertThat(unit_id).isEqualTo(TEST_UNIT.getUnitId());
-                            testContext.completeNow();
-                        })))
-                );
-
-    }
-
-    @Test
-    void save(Vertx vertx, VertxTestContext testContext) {
-
-        Location location = Location.of(49.7384f, 13.3736f, 0, 0);
-        UnitTelemetry obs = UnitTelemetry.of(TEST_UNIT_ID, OffsetDateTime.now(), location, 0, JsonObject.of());
-
-        List<UnitTelemetry> data = List.of(obs);
-
-        MapLogRepository repo = MapLogRepository.create(pgPool);
-        repo.saveAllTelemetry(data).onComplete(testContext.succeeding(res -> testContext.verify(() -> {
-            assertThat(res).isEqualTo(data.size());
-            testContext.completeNow();
-        })));
-    }
-
-    @AfterEach
-    void clean(Vertx vertx, VertxTestContext testContext) {
-        pgPool.preparedQuery("DELETE FROM maplog.unit WHERE unit_id = $1 RETURNING (unit_type_id)")
-                .execute(Tuple.of(TEST_UNIT_ID))
-                .map(rs -> rs.iterator().next().getString("unit_type_id"))
-                .onComplete(delUnit ->
-                        pgPool.preparedQuery("DELETE FROM maplog.unit_type WHERE unit_type_id = $1")
-                                .execute(Tuple.of(delUnit.result()))
-                                .onComplete(testContext.succeedingThenComplete())
-                );
-    }
-
-}