diff --git a/persistence/src/main/java/de/starwit/persistence/analytics/entity/MetadataEntity.java b/persistence/src/main/java/de/starwit/persistence/analytics/entity/MetadataEntity.java index fe696ba..1175d21 100644 --- a/persistence/src/main/java/de/starwit/persistence/analytics/entity/MetadataEntity.java +++ b/persistence/src/main/java/de/starwit/persistence/analytics/entity/MetadataEntity.java @@ -35,6 +35,9 @@ public class MetadataEntity extends AbstractEntity { @Column(name = "observation_area_id") private Long observationAreaId; + @Column(name = "direction") + private String direction; + @OneToMany(mappedBy = "metadata", cascade = CascadeType.ALL, fetch = FetchType.EAGER) private List geometryCoordinates; @@ -93,5 +96,13 @@ public Long getObservationAreaId() { public void setObservationAreaId(Long observationAreaId) { this.observationAreaId = observationAreaId; } + + public String getDirection() { + return direction; + } + + public void setDirection(String direction) { + this.direction = direction; + } } \ No newline at end of file diff --git a/persistence/src/main/java/de/starwit/persistence/analytics/repository/MetadataRepository.java b/persistence/src/main/java/de/starwit/persistence/analytics/repository/MetadataRepository.java index 9905713..bf38c87 100644 --- a/persistence/src/main/java/de/starwit/persistence/analytics/repository/MetadataRepository.java +++ b/persistence/src/main/java/de/starwit/persistence/analytics/repository/MetadataRepository.java @@ -12,4 +12,6 @@ public interface MetadataRepository extends JpaRepository public MetadataEntity findFirstByNameAndClassification(String name, String classification); + public MetadataEntity findFirstByNameAndClassificationOrderByIdDesc(String name, String classification); + } diff --git a/persistence/src/main/java/de/starwit/persistence/observatory/entity/ObservationJobEntity.java b/persistence/src/main/java/de/starwit/persistence/observatory/entity/ObservationJobEntity.java index 3e7b27f..665e749 100644 --- a/persistence/src/main/java/de/starwit/persistence/observatory/entity/ObservationJobEntity.java +++ b/persistence/src/main/java/de/starwit/persistence/observatory/entity/ObservationJobEntity.java @@ -56,7 +56,10 @@ public class ObservationJobEntity extends AbstractEntity { @Column(name = "center_latitude") private BigDecimal centerLatitude; - + + @Column(name = "direction") + private String direction; + @NotNull @OneToMany(mappedBy = "observationJob", cascade = CascadeType.ALL, fetch = FetchType.EAGER) private List geometryPoints; @@ -148,5 +151,13 @@ public BigDecimal getCenterLatitude() { public void setCenterLatitude(BigDecimal centerLatitude) { this.centerLatitude = centerLatitude; } + + public String getDirection() { + return direction; + } + + public void setDirection(String direction) { + this.direction = direction; + } } diff --git a/persistence/src/main/resources/db/migration/analytics/V3_0__add_direction.sql b/persistence/src/main/resources/db/migration/analytics/V3_0__add_direction.sql new file mode 100644 index 0000000..b7a2d14 --- /dev/null +++ b/persistence/src/main/resources/db/migration/analytics/V3_0__add_direction.sql @@ -0,0 +1,2 @@ +ALTER TABLE "metadata" + ADD COLUMN "direction" VARCHAR(255) DEFAULT NULL; \ No newline at end of file diff --git a/persistence/src/main/resources/db/migration/analytics/V4_0__remove_unique_metadata_constraint.sql b/persistence/src/main/resources/db/migration/analytics/V4_0__remove_unique_metadata_constraint.sql new file mode 100644 index 0000000..b545e43 --- /dev/null +++ b/persistence/src/main/resources/db/migration/analytics/V4_0__remove_unique_metadata_constraint.sql @@ -0,0 +1 @@ +ALTER TABLE "metadata" DROP CONSTRAINT "unique_name_classification"; \ No newline at end of file diff --git a/persistence/src/main/resources/db/migration/observatory/V4_0__add_direction.sql b/persistence/src/main/resources/db/migration/observatory/V4_0__add_direction.sql new file mode 100644 index 0000000..b9ed63b --- /dev/null +++ b/persistence/src/main/resources/db/migration/observatory/V4_0__add_direction.sql @@ -0,0 +1,2 @@ +ALTER TABLE "observation_job" + ADD COLUMN "direction" VARCHAR(255) DEFAULT NULL; \ No newline at end of file diff --git a/service/src/main/java/de/starwit/service/analytics/MetadataService.java b/service/src/main/java/de/starwit/service/analytics/MetadataService.java index 73f0584..2415f90 100644 --- a/service/src/main/java/de/starwit/service/analytics/MetadataService.java +++ b/service/src/main/java/de/starwit/service/analytics/MetadataService.java @@ -10,6 +10,7 @@ import de.starwit.persistence.analytics.entity.MetadataEntity; import de.starwit.persistence.analytics.repository.MetadataRepository; import de.starwit.persistence.observatory.entity.ObservationJobEntity; +import de.starwit.persistence.observatory.entity.PointEntity; import de.starwit.service.impl.ServiceInterface; @Service @@ -27,8 +28,8 @@ public MetadataRepository getRepository() { } public MetadataEntity saveMetadataForJob(ObservationJobEntity jobEntity) { - - MetadataEntity metadata = metadataRepository.findFirstByNameAndClassification(jobEntity.getName(), jobEntity.getClassification()); + + MetadataEntity metadata = findCurrentMetadata(jobEntity); if (metadata == null) { metadata = new MetadataEntity(); @@ -38,6 +39,7 @@ public MetadataEntity saveMetadataForJob(ObservationJobEntity jobEntity) { metadata.setCenterLatitude(jobEntity.getCenterLatitude()); metadata.setCenterLongitude(jobEntity.getCenterLongitude()); metadata.setObservationAreaId(jobEntity.getObservationAreaId()); + metadata.setDirection(jobEntity.getDirection()); List coordinates = new ArrayList<>(); if (jobEntity.getGeoReferenced()) { @@ -47,7 +49,7 @@ public MetadataEntity saveMetadataForJob(ObservationJobEntity jobEntity) { } } metadata.setGeometryCoordinates(coordinates); - + metadata = metadataRepository.saveAndFlush(metadata); } @@ -68,5 +70,58 @@ public MetadataEntity findFirstByNameAndClassification(String name, String class MetadataEntity metadata = metadataRepository.findFirstByNameAndClassification(name, classification); return metadata; } - + + public MetadataEntity findCurrentMetadata(ObservationJobEntity jobEntity) { + MetadataEntity latestMetadata = metadataRepository + .findFirstByNameAndClassificationOrderByIdDesc(jobEntity.getName(), jobEntity.getClassification()); + if (latestMetadata != null && metadataMatchesJob(latestMetadata, jobEntity)) { + return latestMetadata; + } else { + return null; + } + } + + /** + * Checks if all metadata fields equal the corresponding job fields (i.e. + * whether given metadata entity belongs to the given job) + */ + private boolean metadataMatchesJob(MetadataEntity metadata, ObservationJobEntity job) { + boolean matches = true; + + matches = matches && metadata.getName().equals(job.getName()); + matches = matches && (metadata.getClassification() == null && job.getClassification() == null + || job.getClassification() != null && job.getClassification().equals(metadata.getClassification())); + + matches = matches && (metadata.getGeoReferenced() == null && job.getGeoReferenced() == null + || job.getGeoReferenced() != null && job.getGeoReferenced().equals(metadata.getGeoReferenced())); + + matches = matches && (metadata.getCenterLatitude() == null && job.getCenterLatitude() == null + || job.getCenterLatitude() != null && job.getCenterLatitude().equals(metadata.getCenterLatitude())); + + matches = matches && (metadata.getCenterLongitude() == null && job.getCenterLongitude() == null + || job.getCenterLongitude() != null && job.getCenterLongitude().equals(metadata.getCenterLongitude())); + + matches = matches && (metadata.getObservationAreaId() == null && job.getObservationAreaId() == null + || job.getObservationAreaId() != null + && job.getObservationAreaId().equals(metadata.getObservationAreaId())); + + matches = matches && (metadata.getDirection() == null && job.getDirection() == null + || job.getDirection() != null && job.getDirection().equals(metadata.getDirection())); + + // Check if geometry matches (only if geoReferenced is true, otherwise geometry + // is not relevant and can be ignored) + if (matches && job.getGeoReferenced()) { + for (int i = 0; i < metadata.getGeometryCoordinates().size(); i++) { + CoordinateEntity c1 = metadata.getGeometryCoordinates().get(i); + PointEntity c2 = job.getGeometryPoints().get(i); + if (c1.getLatitude() != null && !c1.getLatitude().equals(c2.getLatitude())) + return false; + if (c1.getLongitude() != null && !c1.getLongitude().equals(c2.getLongitude())) + return false; + } + } + + return matches; + } + } diff --git a/service/src/main/java/de/starwit/service/observatory/ObservationJobService.java b/service/src/main/java/de/starwit/service/observatory/ObservationJobService.java index 81537d8..7f7760a 100644 --- a/service/src/main/java/de/starwit/service/observatory/ObservationJobService.java +++ b/service/src/main/java/de/starwit/service/observatory/ObservationJobService.java @@ -96,6 +96,7 @@ public ObservationJobEntity update(Long id, ObservationJobEntity jobUpdate) { existingJob.setGeometryPoints(jobUpdate.getGeometryPoints()); existingJob.setCenterLatitude(jobUpdate.getCenterLatitude()); existingJob.setCenterLongitude(jobUpdate.getCenterLongitude()); + existingJob.setDirection(jobUpdate.getDirection()); ObservationJobEntity updatedJob = observationJobRepository.save(existingJob);