UnitTelemetryValidation.java 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package cz.senslog.telemetry.database.validation;
  2. import cz.senslog.telemetry.database.domain.Campaign;
  3. import cz.senslog.telemetry.database.domain.Sensor;
  4. import cz.senslog.telemetry.database.domain.UnitTelemetry;
  5. import cz.senslog.telemetry.utils.ComparisonOperators;
  6. import cz.senslog.telemetry.utils.Tuple;
  7. import io.vertx.core.json.JsonObject;
  8. import java.time.OffsetDateTime;
  9. import java.util.*;
  10. import static cz.senslog.telemetry.utils.ComparisonOperators.ofBoundary;
  11. import static java.util.stream.Collectors.*;
  12. public class UnitTelemetryValidation {
  13. public static boolean isTelemetryWithinCampaign(Campaign campaign, UnitTelemetry telemetry) {
  14. return ofBoundary(campaign.getFromTime(), campaign.getToTime()).isWithinEqual(telemetry.getTimestamp());
  15. }
  16. public static List<UnitTelemetry> telemetriesWithinCampaign(Campaign campaign, List<UnitTelemetry> telemetries) {
  17. ComparisonOperators.BoundaryComparison campBound = ofBoundary(campaign.getFromTime(), campaign.getToTime());
  18. OffsetDateTime firstTelTime = telemetries.get(0).getTimestamp();
  19. OffsetDateTime lastTelTime = telemetries.get(telemetries.size() - 1).getTimestamp();
  20. if (campBound.isWithinEqual(firstTelTime) && campBound.isWithinEqual(lastTelTime)) {
  21. return telemetries;
  22. }
  23. return telemetries.stream().filter(v -> campBound.isWithinEqual(v.getTimestamp())).collect(toList());
  24. }
  25. public static List<UnitTelemetry> telemetriesAccToSensors(Map<Long, List<Sensor>> sensorsByUnitId, List<UnitTelemetry> telemetries) {
  26. List<UnitTelemetry> newTelemetries = new ArrayList<>(telemetries.size());
  27. Map<Long, Tuple<Set<String>, Map<String, String>>> sensorSetByUnitId = new HashMap<>(sensorsByUnitId.size());
  28. for (Map.Entry<Long, List<Sensor>> sensorsEntry : sensorsByUnitId.entrySet()) {
  29. int sensorsCount = sensorsEntry.getValue().size();
  30. Set<String> sensorsId = new HashSet<>(sensorsCount);
  31. Map<String, String> sensorsName = new HashMap<>(sensorsCount);
  32. for (Sensor sensor : sensorsEntry.getValue()) {
  33. String sensorId = Long.toString(sensor.getSensorId());
  34. sensorsId.add(sensorId);
  35. sensorsName.put(sensor.getName(), sensorId);
  36. }
  37. sensorSetByUnitId.put(sensorsEntry.getKey(), Tuple.of(sensorsId, sensorsName));
  38. }
  39. for (UnitTelemetry tel : telemetries) {
  40. Tuple<Set<String>, Map<String, String>> unitSensors = sensorSetByUnitId.get(tel.getUnitId());
  41. if (unitSensors == null) continue;
  42. Set<String> sensorIDs = unitSensors.item1();
  43. Map<String, String> sensorNames = unitSensors.item2();
  44. JsonObject newObservedValues = JsonObject.of();
  45. for (Map.Entry<String, Object> observedValue : tel.getObservedValues()) {
  46. String key = observedValue.getKey();
  47. if (sensorIDs.contains(key)) {
  48. newObservedValues.put(key, observedValue.getValue());
  49. } else if (sensorNames.containsKey(key)) {
  50. newObservedValues.put(sensorNames.get(key), observedValue.getValue());
  51. }
  52. }
  53. if (!newObservedValues.isEmpty()) {
  54. newTelemetries.add(UnitTelemetry.of(
  55. tel.getUnitId(),
  56. tel.getTimestamp(),
  57. tel.getLocation(),
  58. tel.getSpeed(),
  59. newObservedValues
  60. ));
  61. }
  62. }
  63. return newTelemetries;
  64. }
  65. }