Skip to content
This repository was archived by the owner on May 5, 2021. It is now read-only.

Commit 7ff2404

Browse files
SORMAS-Foundation#2564 - Calculate change dates for epi data and health conditions only for cases/contacts
1 parent 11ec0a0 commit 7ff2404

6 files changed

Lines changed: 115 additions & 35 deletions

File tree

sormas-app/app/src/main/java/de/symeda/sormas/app/backend/caze/Case.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ public class Case extends PseudonymizableAdo {
7878
public static final String PERSON = "person_id";
7979
public static final String REPORT_DATE = "reportDate";
8080
public static final String SYMPTOMS = "symptoms";
81+
public static final String EPI_DATA = "epiData";
82+
public static final String CLINICAL_COURSE = "clinicalCourse";
8183
public static final String REPORTING_USER = "reportingUser_id";
8284
public static final String HEALTH_FACILITY = "healthFacility_id";
8385
public static final String OUTCOME = "outcome";

sormas-app/app/src/main/java/de/symeda/sormas/app/backend/caze/CaseDao.java

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,20 @@
5757
import de.symeda.sormas.api.utils.jurisdiction.EventJurisdictionHelper;
5858
import de.symeda.sormas.api.utils.jurisdiction.UserJurisdiction;
5959
import de.symeda.sormas.app.R;
60+
import de.symeda.sormas.app.backend.clinicalcourse.ClinicalCourse;
6061
import de.symeda.sormas.app.backend.clinicalcourse.ClinicalVisit;
6162
import de.symeda.sormas.app.backend.clinicalcourse.ClinicalVisitCriteria;
63+
import de.symeda.sormas.app.backend.clinicalcourse.HealthConditions;
6264
import de.symeda.sormas.app.backend.common.AbstractAdoDao;
6365
import de.symeda.sormas.app.backend.common.AbstractDomainObject;
6466
import de.symeda.sormas.app.backend.common.DaoException;
6567
import de.symeda.sormas.app.backend.common.DatabaseHelper;
6668
import de.symeda.sormas.app.backend.config.ConfigProvider;
6769
import de.symeda.sormas.app.backend.contact.Contact;
70+
import de.symeda.sormas.app.backend.epidata.EpiData;
71+
import de.symeda.sormas.app.backend.epidata.EpiDataBurial;
72+
import de.symeda.sormas.app.backend.epidata.EpiDataGathering;
73+
import de.symeda.sormas.app.backend.epidata.EpiDataTravel;
6874
import de.symeda.sormas.app.backend.event.Event;
6975
import de.symeda.sormas.app.backend.event.EventCriteria;
7076
import de.symeda.sormas.app.backend.event.EventParticipant;
@@ -129,21 +135,45 @@ public Date getLatestChangeDate() {
129135
date = hospitalizationDate;
130136
}
131137

132-
Date epiDataDate = DatabaseHelper.getEpiDataDao().getLatestChangeDate();
138+
Date epiDataDate = getLatestChangeDateJoin(EpiData.TABLE_NAME, Case.EPI_DATA);
133139
if (epiDataDate != null && epiDataDate.after(date)) {
134140
date = epiDataDate;
135141
}
136142

143+
Date epiDataBurialDate = getLatestChangeDateSubJoin(EpiData.TABLE_NAME, Case.EPI_DATA, EpiDataBurial.TABLE_NAME);
144+
if (epiDataBurialDate != null && epiDataBurialDate.after(date)) {
145+
date = epiDataBurialDate;
146+
}
147+
148+
Date epiDataGatheringDate = getLatestChangeDateSubJoin(EpiData.TABLE_NAME, Case.EPI_DATA, EpiDataGathering.TABLE_NAME);
149+
if (epiDataGatheringDate != null && epiDataGatheringDate.after(date)) {
150+
date = epiDataGatheringDate;
151+
}
152+
153+
Date epiDataTravelDate = getLatestChangeDateSubJoin(EpiData.TABLE_NAME, Case.EPI_DATA, EpiDataTravel.TABLE_NAME);
154+
if (epiDataTravelDate != null && epiDataTravelDate.after(date)) {
155+
date = epiDataTravelDate;
156+
}
157+
137158
Date therapyDate = DatabaseHelper.getTherapyDao().getLatestChangeDate();
138159
if (therapyDate != null && therapyDate.after(date)) {
139160
date = therapyDate;
140161
}
141162

142-
Date clinicalCourseDate = DatabaseHelper.getClinicalCourseDao().getLatestChangeDate();
163+
Date clinicalCourseDate = getLatestChangeDateJoin(ClinicalCourse.TABLE_NAME, Case.CLINICAL_COURSE);
143164
if (clinicalCourseDate != null && clinicalCourseDate.after(date)) {
144165
date = clinicalCourseDate;
145166
}
146167

168+
Date healthConditionsDate = getLatestChangeDateSubJoinReverse(
169+
ClinicalCourse.TABLE_NAME,
170+
Case.CLINICAL_COURSE,
171+
HealthConditions.TABLE_NAME,
172+
ClinicalCourse.HEALTH_CONDITIONS);
173+
if (healthConditionsDate != null && healthConditionsDate.after(date)) {
174+
date = healthConditionsDate;
175+
}
176+
147177
Date maternalHistoryDate = DatabaseHelper.getMaternalHistoryDao().getLatestChangeDate();
148178
if (maternalHistoryDate != null && maternalHistoryDate.after(date)) {
149179
date = maternalHistoryDate;

sormas-app/app/src/main/java/de/symeda/sormas/app/backend/common/AbstractAdoDao.java

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,10 +282,36 @@ public Date getLatestChangeDate() {
282282
return null;
283283
}
284284

285+
/**
286+
* Retrieves the latest change date from a table that references this table.
287+
*/
285288
protected Date getLatestChangeDateJoin(String joinTableName, String joinColumnName) {
286-
287289
String query = "SELECT MAX(jo." + AbstractDomainObject.CHANGE_DATE + ") FROM " + getTableName() + " AS ta" + " LEFT JOIN " + joinTableName
288290
+ " AS jo ON jo." + AbstractDomainObject.ID + " = ta." + joinColumnName + "_ID";
291+
return getLatestChangeDateJoinFromQuery(query);
292+
}
293+
294+
/**
295+
* Retrieves the latest change date from a table that references another table that references this table.
296+
*/
297+
protected Date getLatestChangeDateSubJoin(String joinTableName, String joinColumnName, String subJoinTableName) {
298+
String query = "SELECT MAX(sjo." + AbstractDomainObject.CHANGE_DATE + ") FROM " + getTableName() + " AS ta" + " LEFT JOIN " + joinTableName
299+
+ " AS jo ON jo." + AbstractDomainObject.ID + " = ta." + joinColumnName + "_id" + " LEFT JOIN " + subJoinTableName + " AS sjo ON jo."
300+
+ AbstractDomainObject.ID + " = sjo." + joinColumnName + "_id";
301+
return getLatestChangeDateJoinFromQuery(query);
302+
}
303+
304+
/**
305+
* Retrieves the latest change date from a table that is referenced by another table that references this table.
306+
*/
307+
protected Date getLatestChangeDateSubJoinReverse(String joinTableName, String joinColumnName, String subJoinTableName, String subJoinColumnName) {
308+
String query = "SELECT MAX(sjo." + AbstractDomainObject.CHANGE_DATE + ") FROM " + getTableName() + " AS ta" + " LEFT JOIN " + joinTableName
309+
+ " AS jo ON jo." + AbstractDomainObject.ID + " = ta." + joinColumnName + "_id" + " LEFT JOIN " + subJoinTableName + " AS sjo ON jo."
310+
+ subJoinColumnName + "_id = sjo." + AbstractDomainObject.ID;
311+
return getLatestChangeDateJoinFromQuery(query);
312+
}
313+
314+
private Date getLatestChangeDateJoinFromQuery(String query) {
289315
GenericRawResults<Object[]> maxChangeDateResult = queryRaw(
290316
query,
291317
new DataType[] {

sormas-app/app/src/main/java/de/symeda/sormas/app/backend/contact/Contact.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ public class Contact extends PseudonymizableAdo {
8282
public static final String REPORT_LAT = "reportLat";
8383
public static final String REPORT_LON = "reportLon";
8484
public static final String REPORT_LAT_LON_ACCURACY = "reportLatLonAccuracy";
85+
public static final String EPI_DATA = "epiData";
86+
public static final String HEALTH_CONDITIONS = "healthConditions";
8587

8688
@DatabaseField(dataType = DataType.DATE_LONG, canBeNull = true)
8789
private Date reportDateTime;

sormas-app/app/src/main/java/de/symeda/sormas/app/backend/contact/ContactDao.java

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,17 @@
3636
import de.symeda.sormas.api.contact.FollowUpStatus;
3737
import de.symeda.sormas.api.utils.DateHelper;
3838
import de.symeda.sormas.app.backend.caze.Case;
39+
import de.symeda.sormas.app.backend.clinicalcourse.ClinicalCourse;
40+
import de.symeda.sormas.app.backend.clinicalcourse.HealthConditions;
3941
import de.symeda.sormas.app.backend.common.AbstractAdoDao;
4042
import de.symeda.sormas.app.backend.common.AbstractDomainObject;
4143
import de.symeda.sormas.app.backend.common.DaoException;
4244
import de.symeda.sormas.app.backend.common.DatabaseHelper;
4345
import de.symeda.sormas.app.backend.config.ConfigProvider;
46+
import de.symeda.sormas.app.backend.epidata.EpiData;
47+
import de.symeda.sormas.app.backend.epidata.EpiDataBurial;
48+
import de.symeda.sormas.app.backend.epidata.EpiDataGathering;
49+
import de.symeda.sormas.app.backend.epidata.EpiDataTravel;
4450
import de.symeda.sormas.app.backend.person.Person;
4551
import de.symeda.sormas.app.backend.task.Task;
4652
import de.symeda.sormas.app.backend.user.User;
@@ -280,12 +286,27 @@ public Date getLatestChangeDate() {
280286
return null;
281287
}
282288

283-
Date epiDataDate = DatabaseHelper.getEpiDataDao().getLatestChangeDate();
289+
Date epiDataDate = getLatestChangeDateJoin(EpiData.TABLE_NAME, Contact.EPI_DATA);
284290
if (epiDataDate != null && epiDataDate.after(date)) {
285291
date = epiDataDate;
286292
}
287293

288-
Date healthConditionsDate = DatabaseHelper.getHealthConditionsDao().getLatestChangeDate();
294+
Date epiDataBurialDate = getLatestChangeDateSubJoin(EpiData.TABLE_NAME, Contact.EPI_DATA, EpiDataBurial.TABLE_NAME);
295+
if (epiDataBurialDate != null && epiDataBurialDate.after(date)) {
296+
date = epiDataBurialDate;
297+
}
298+
299+
Date epiDataGatheringDate = getLatestChangeDateSubJoin(EpiData.TABLE_NAME, Contact.EPI_DATA, EpiDataGathering.TABLE_NAME);
300+
if (epiDataGatheringDate != null && epiDataGatheringDate.after(date)) {
301+
date = epiDataGatheringDate;
302+
}
303+
304+
Date epiDataTravelDate = getLatestChangeDateSubJoin(EpiData.TABLE_NAME, Contact.EPI_DATA, EpiDataTravel.TABLE_NAME);
305+
if (epiDataTravelDate != null && epiDataTravelDate.after(date)) {
306+
date = epiDataTravelDate;
307+
}
308+
309+
Date healthConditionsDate = getLatestChangeDateJoin(HealthConditions.TABLE_NAME, Contact.HEALTH_CONDITIONS);
289310
if (healthConditionsDate != null && healthConditionsDate.after(date)) {
290311
date = healthConditionsDate;
291312
}

sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactService.java

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -17,35 +17,6 @@
1717
*******************************************************************************/
1818
package de.symeda.sormas.backend.contact;
1919

20-
import java.sql.Timestamp;
21-
import java.time.LocalDate;
22-
import java.util.Collections;
23-
import java.util.Date;
24-
import java.util.HashSet;
25-
import java.util.List;
26-
import java.util.Map;
27-
import java.util.NoSuchElementException;
28-
import java.util.Set;
29-
import java.util.stream.Collectors;
30-
31-
import javax.ejb.EJB;
32-
import javax.ejb.LocalBean;
33-
import javax.ejb.Stateless;
34-
import javax.persistence.criteria.CriteriaBuilder;
35-
import javax.persistence.criteria.CriteriaQuery;
36-
import javax.persistence.criteria.Expression;
37-
import javax.persistence.criteria.From;
38-
import javax.persistence.criteria.Join;
39-
import javax.persistence.criteria.JoinType;
40-
import javax.persistence.criteria.Path;
41-
import javax.persistence.criteria.Predicate;
42-
import javax.persistence.criteria.Root;
43-
import javax.persistence.criteria.Subquery;
44-
import javax.validation.constraints.NotNull;
45-
46-
import de.symeda.sormas.backend.clinicalcourse.HealthConditionsService;
47-
import org.apache.commons.collections.CollectionUtils;
48-
4920
import de.symeda.sormas.api.Disease;
5021
import de.symeda.sormas.api.EntityRelevanceStatus;
5122
import de.symeda.sormas.api.contact.ContactClassification;
@@ -69,6 +40,7 @@
6940
import de.symeda.sormas.backend.caze.Case;
7041
import de.symeda.sormas.backend.caze.CaseJoins;
7142
import de.symeda.sormas.backend.caze.CaseService;
43+
import de.symeda.sormas.backend.clinicalcourse.HealthConditionsService;
7244
import de.symeda.sormas.backend.common.AbstractAdoService;
7345
import de.symeda.sormas.backend.common.AbstractCoreAdoService;
7446
import de.symeda.sormas.backend.common.AbstractDomainObject;
@@ -88,6 +60,32 @@
8860
import de.symeda.sormas.backend.util.DateHelper8;
8961
import de.symeda.sormas.backend.visit.Visit;
9062
import de.symeda.sormas.backend.visit.VisitService;
63+
import org.apache.commons.collections.CollectionUtils;
64+
65+
import javax.ejb.EJB;
66+
import javax.ejb.LocalBean;
67+
import javax.ejb.Stateless;
68+
import javax.persistence.criteria.CriteriaBuilder;
69+
import javax.persistence.criteria.CriteriaQuery;
70+
import javax.persistence.criteria.Expression;
71+
import javax.persistence.criteria.From;
72+
import javax.persistence.criteria.Join;
73+
import javax.persistence.criteria.JoinType;
74+
import javax.persistence.criteria.Path;
75+
import javax.persistence.criteria.Predicate;
76+
import javax.persistence.criteria.Root;
77+
import javax.persistence.criteria.Subquery;
78+
import javax.validation.constraints.NotNull;
79+
import java.sql.Timestamp;
80+
import java.time.LocalDate;
81+
import java.util.Collections;
82+
import java.util.Date;
83+
import java.util.HashSet;
84+
import java.util.List;
85+
import java.util.Map;
86+
import java.util.NoSuchElementException;
87+
import java.util.Set;
88+
import java.util.stream.Collectors;
9189

9290
@Stateless
9391
@LocalBean
@@ -167,7 +165,8 @@ public Predicate createChangeDateFilter(CriteriaBuilder cb, From<?, Contact> fro
167165

168166
Predicate dateFilter = greaterThanAndNotNull(cb, from.get(AbstractDomainObject.CHANGE_DATE), date);
169167
Predicate epiDataDateFilter = epiDataService.createChangeDateFilter(cb, from.join(Contact.EPI_DATA, JoinType.LEFT), date);
170-
Predicate healthConditionsDateFilter = healthConditionsService.createChangeDateFilter(cb, from.join(Contact.EPI_DATA, JoinType.LEFT), date);
168+
Predicate healthConditionsDateFilter =
169+
healthConditionsService.createChangeDateFilter(cb, from.join(Contact.HEALTH_CONDITIONS, JoinType.LEFT), date);
171170
return cb.or(dateFilter, epiDataDateFilter, healthConditionsDateFilter);
172171
}
173172

0 commit comments

Comments
 (0)