From f498117c7b1f340bde0d707f0deb5d644b79a165 Mon Sep 17 00:00:00 2001 From: lewa <lene.wasskog@nibio.no> Date: Fri, 21 Jun 2024 13:38:00 +0200 Subject: [PATCH] feat(observations): Add timeseries label to observations in list --- .../controller/session/ObservationBean.java | 43 +++++++++++++------ .../session/ObservationTimeSeriesBean.java | 24 ++++++++--- .../nibio/vips/logic/entity/Observation.java | 1 + .../logic/entity/ObservationTimeSeries.java | 16 +++++++ .../entity/rest/ObservationListItem.java | 11 +++++ 5 files changed, 75 insertions(+), 20 deletions(-) diff --git a/src/main/java/no/nibio/vips/logic/controller/session/ObservationBean.java b/src/main/java/no/nibio/vips/logic/controller/session/ObservationBean.java index 62642472..e205348f 100755 --- a/src/main/java/no/nibio/vips/logic/controller/session/ObservationBean.java +++ b/src/main/java/no/nibio/vips/logic/controller/session/ObservationBean.java @@ -29,18 +29,9 @@ import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.Path; import java.nio.file.StandardOpenOption; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; -import java.util.ResourceBundle; -import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; import javax.ejb.EJB; import javax.ejb.Stateless; @@ -78,6 +69,9 @@ public class ObservationBean { @EJB UserBean userBean; + @EJB + ObservationTimeSeriesBean observationTimeSeriesBean; + public List<Observation> getObservations(Integer organizationId) { Organization organization = em.find(Organization.class, organizationId); List<Observation> observations = em.createNamedQuery("Observation.findByOrganizationId") @@ -508,6 +502,30 @@ public class ObservationBean { return observations; } + public List<Observation> getObservationsWithTimeSeries(List<Observation> observations) { + Set<Integer> observationTimeSeriesIds = observations.stream() + .map(Observation::getObservationTimeSeriesId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + + if (observationTimeSeriesIds.isEmpty()) { + return observations; + } + + List<ObservationTimeSeries> timeSeriesList = observationTimeSeriesBean.getObservationTimeSeriesList(observationTimeSeriesIds); + Map<Integer, ObservationTimeSeries> timeSeriesMap = timeSeriesList.stream() + .collect(Collectors.toMap(ObservationTimeSeries::getObservationTimeSeriesId, Function.identity())); + + observations.stream() + .filter(o -> o.getObservationTimeSeriesId() != null) + .forEach(o -> o.setObservationTimeSeries(timeSeriesMap.get(o.getObservationTimeSeriesId()))); + + for (Observation o : observations) { + LOGGER.info("{}", o); + } + + return observations; + } private List<Observation> getObservationsWithObservers(List<Observation> observations) { Set<Integer> userIds = new HashSet<>(); observations.stream().filter((o) -> (o.getUserId() != null)).forEach((o) -> { @@ -642,11 +660,10 @@ public class ObservationBean { //start = new Date(); retVal = this.getObservationsWithLocations(retVal); //System.out.println("Finding locations took " + (new Date().getTime() - start.getTime()) + " milliseconds"); + retVal = this.getObservationsWithTimeSeries(retVal); } - return retVal; - } public List<Organism> getObservedPests(Integer organizationId) { diff --git a/src/main/java/no/nibio/vips/logic/controller/session/ObservationTimeSeriesBean.java b/src/main/java/no/nibio/vips/logic/controller/session/ObservationTimeSeriesBean.java index eb1ff575..9f115807 100644 --- a/src/main/java/no/nibio/vips/logic/controller/session/ObservationTimeSeriesBean.java +++ b/src/main/java/no/nibio/vips/logic/controller/session/ObservationTimeSeriesBean.java @@ -18,15 +18,14 @@ package no.nibio.vips.logic.controller.session; -import no.nibio.vips.logic.entity.ObservationTimeSeries; -import no.nibio.vips.logic.entity.PointOfInterest; -import no.nibio.vips.logic.entity.VipsLogicUser; - +import java.util.*; import javax.ejb.EJB; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; -import java.util.*; +import no.nibio.vips.logic.entity.ObservationTimeSeries; +import no.nibio.vips.logic.entity.PointOfInterest; +import no.nibio.vips.logic.entity.VipsLogicUser; @Stateless public class ObservationTimeSeriesBean { @@ -49,8 +48,13 @@ public class ObservationTimeSeriesBean { return resultList; } - public ObservationTimeSeries getObservationTimeSeries(Integer id) { - ObservationTimeSeries ots = em.find(ObservationTimeSeries.class, id); + /** + * Get observation time series with given id. Enrich object with user information before returning. + * @param observationTimeSeriesId the id of the observation time series to retrieve + * @return the observation time series with the given id + */ + public ObservationTimeSeries getObservationTimeSeries(Integer observationTimeSeriesId) { + ObservationTimeSeries ots = em.find(ObservationTimeSeries.class, observationTimeSeriesId); if (ots != null) { ots.setUser(em.find(VipsLogicUser.class, ots.getUserId())); if (ots.getLastModifiedBy() != null) { @@ -60,6 +64,12 @@ public class ObservationTimeSeriesBean { return ots; } + public List<ObservationTimeSeries> getObservationTimeSeriesList(Set<Integer> observationTimeSeriesIds) { + return em.createNamedQuery("ObservationTimeSeries.findByObservationTimeSeriesIds") + .setParameter("observationTimeSeriesIds", observationTimeSeriesIds) + .getResultList(); + } + /** * @param ots the observation time series * @return The merged object diff --git a/src/main/java/no/nibio/vips/logic/entity/Observation.java b/src/main/java/no/nibio/vips/logic/entity/Observation.java index 190d52e6..241e0c14 100755 --- a/src/main/java/no/nibio/vips/logic/entity/Observation.java +++ b/src/main/java/no/nibio/vips/logic/entity/Observation.java @@ -697,6 +697,7 @@ public class Observation implements Serializable, no.nibio.vips.observation.Obse ! this.getOrganism().getLocalName(locale).trim().isBlank() ? this.getOrganism().getLocalName(locale) : this.getOrganism().getLatinName(), this.getCropOrganismId(), ! this.getCropOrganism().getLocalName(locale).trim().isBlank() ? this.getCropOrganism().getLocalName(locale) : this.getCropOrganism().getLatinName(), + this.observationTimeSeries != null ? this.observationTimeSeries.getLabel() : null, // Specific geoInfo trumps location. This is to be interpreted // as that the observation has been geographically masked by // choice of the observer diff --git a/src/main/java/no/nibio/vips/logic/entity/ObservationTimeSeries.java b/src/main/java/no/nibio/vips/logic/entity/ObservationTimeSeries.java index b2227321..d7adac27 100644 --- a/src/main/java/no/nibio/vips/logic/entity/ObservationTimeSeries.java +++ b/src/main/java/no/nibio/vips/logic/entity/ObservationTimeSeries.java @@ -35,6 +35,7 @@ import java.util.Date; @NamedQueries({ @NamedQuery(name = "ObservationTimeSeries.findAll", query = "SELECT ots FROM ObservationTimeSeries ots"), @NamedQuery(name = "ObservationTimeSeries.findByObservationTimeSeriesId", query = "SELECT ots FROM ObservationTimeSeries ots WHERE ots.observationTimeSeriesId = :id"), + @NamedQuery(name = "ObservationTimeSeries.findByObservationTimeSeriesIds", query = "SELECT ots FROM ObservationTimeSeries ots WHERE ots.observationTimeSeriesId IN :observationTimeSeriesIds"), @NamedQuery(name = "ObservationTimeSeries.findByOrganizationId", query = "SELECT ots FROM ObservationTimeSeries ots WHERE ots.userId IN(SELECT v.userId FROM VipsLogicUser v WHERE v.organizationId = :organizationId OR v.organizationId IN(SELECT o.organizationId FROM Organization o WHERE o.parentOrganizationId = :organizationId))"), @NamedQuery(name = "ObservationTimeSeries.findByUserId", query = "SELECT ots FROM ObservationTimeSeries ots WHERE ots.userId IN(:userId)") }) @@ -163,6 +164,21 @@ public class ObservationTimeSeries implements Serializable { this.name = name; } + /** + * This logic if also implemented in the observation app, see the function timeSeriesLabel in CommonUtil.vue + * @return the first eight letters of the given name, in uppercase with spaces removed + */ + @Transient + public String getLabel() { + if (this.name == null) { + return null; + } + String timeSeriesName = this.name; + timeSeriesName = timeSeriesName.replaceAll("\\s", ""); + timeSeriesName = timeSeriesName.substring(0, Math.min(timeSeriesName.length(), 8)); + return timeSeriesName.toUpperCase(); + } + /** * @return the description of the observation time series */ diff --git a/src/main/java/no/nibio/vips/logic/entity/rest/ObservationListItem.java b/src/main/java/no/nibio/vips/logic/entity/rest/ObservationListItem.java index ddbc67e3..a4dd12f9 100644 --- a/src/main/java/no/nibio/vips/logic/entity/rest/ObservationListItem.java +++ b/src/main/java/no/nibio/vips/logic/entity/rest/ObservationListItem.java @@ -30,6 +30,7 @@ public class ObservationListItem implements Comparable{ private Integer observationId, observationTimeSeriesId, organismId, cropOrganismId; private Date timeOfObservation; private String organismName, cropOrganismName; + private String observationTimeSeriesLabel; private String geoInfo; private String observationHeading; private String observationData; @@ -46,6 +47,7 @@ public class ObservationListItem implements Comparable{ String organismName, Integer cropOrganismId, String cropOrganismName, + String observationTimeSeriesLabel, String geoinfo, String observationHeading, Boolean broadcastMessage, @@ -61,6 +63,7 @@ public class ObservationListItem implements Comparable{ this.organismName = organismName; this.cropOrganismId = cropOrganismId; this.cropOrganismName = cropOrganismName; + this.observationTimeSeriesLabel = observationTimeSeriesLabel; this.geoInfo = geoinfo; this.observationHeading = observationHeading; this.broadcastMessage = broadcastMessage; @@ -151,6 +154,14 @@ public class ObservationListItem implements Comparable{ this.cropOrganismName = cropOrganismName; } + public String getObservationTimeSeriesLabel() { + return observationTimeSeriesLabel; + } + + public void setObservationTimeSeriesLabel(String observationTimeSeriesLabel) { + this.observationTimeSeriesLabel = observationTimeSeriesLabel; + } + /** * @return the geoInfo */ -- GitLab