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

Commit ee9b425

Browse files
author
Stefan Kock
committed
SORMAS-Foundation#3612: Count eventSummaries instead of subquery (now for getExportList)
1 parent afcc93b commit ee9b425

3 files changed

Lines changed: 35 additions & 36 deletions

File tree

sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactExportDto.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ public class ContactExportDto implements Serializable {
136136

137137
private ContactJurisdictionDto jurisdiction;
138138

139-
private final Long eventCount;
139+
private Long eventCount;
140140
private String latestEventId;
141141
private String latestEventTitle;
142142
private String externalID;
@@ -156,7 +156,7 @@ public ContactExportDto(long id, long personId, String uuid, String sourceCaseUu
156156
String facility, String facilityUuid, String facilityDetails,
157157
String phone, String phoneOwner, String emailAddress, OccupationType occupationType, String occupationDetails,
158158
String region, String district, String community,
159-
long epiDataId, YesNoUnknown contactWithSourceCaseKnown, YesNoUnknown returningTraveler, long eventCount, String externalID,
159+
long epiDataId, YesNoUnknown contactWithSourceCaseKnown, YesNoUnknown returningTraveler, String externalID,
160160
String reportingUserUuid, String regionUuid, String districtUuid, String communityUuid,
161161
String caseReportingUserUuid, String caseRegionUuid, String caseDistrictUuid, String caseCommunityUuid, String caseHealthFacilityUuid, String casePointOfEntryUuid
162162
) {
@@ -218,7 +218,6 @@ public ContactExportDto(long id, long personId, String uuid, String sourceCaseUu
218218
this.epiDataId = epiDataId;
219219
this.contactWithSourceCaseKnown = contactWithSourceCaseKnown;
220220
this.returningTraveler = returningTraveler;
221-
this.eventCount = eventCount;
222221
this.externalID = externalID;
223222

224223
CaseJurisdictionDto caseJurisdiction = caseReportingUserUuid != null
@@ -614,6 +613,10 @@ public long getEventCount() {
614613
return this.eventCount;
615614
}
616615

616+
public void setEventCount(Long eventCount) {
617+
this.eventCount = eventCount;
618+
}
619+
617620
public void setId(long id) {
618621
this.id = id;
619622
}

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

Lines changed: 10 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@
5555
import javax.persistence.criteria.Order;
5656
import javax.persistence.criteria.Predicate;
5757
import javax.persistence.criteria.Root;
58-
import javax.persistence.criteria.Subquery;
5958
import javax.validation.constraints.NotNull;
6059

6160
import org.apache.commons.collections.CollectionUtils;
@@ -126,8 +125,6 @@
126125
import de.symeda.sormas.backend.epidata.EpiDataFacadeEjb;
127126
import de.symeda.sormas.backend.epidata.EpiDataFacadeEjb.EpiDataFacadeEjbLocal;
128127
import de.symeda.sormas.backend.event.ContactEventSummaryDetails;
129-
import de.symeda.sormas.backend.event.Event;
130-
import de.symeda.sormas.backend.event.EventParticipant;
131128
import de.symeda.sormas.backend.event.EventService;
132129
import de.symeda.sormas.backend.exposure.Exposure;
133130
import de.symeda.sormas.backend.externaljournal.ExternalJournalService;
@@ -411,20 +408,6 @@ public List<ContactExportDto> getExportList(ContactCriteria contactCriteria, int
411408

412409
ContactJoins joins = new ContactJoins(contact);
413410

414-
// Events count subquery
415-
Subquery<Long> eventCountSq = cq.subquery(Long.class);
416-
Root<EventParticipant> eventCountRoot = eventCountSq.from(EventParticipant.class);
417-
Join<EventParticipant, Event> eventJoin = eventCountRoot.join(EventParticipant.EVENT, JoinType.INNER);
418-
Join<Person, Contact> contactJoin = eventCountRoot.join(EventParticipant.PERSON, JoinType.INNER).join(Person.CONTACTS, JoinType.INNER);
419-
420-
eventCountSq.where(
421-
cb.and(
422-
cb.equal(contactJoin.get(Contact.UUID), contact.get(Contact.UUID)),
423-
cb.isFalse(eventJoin.get(Event.DELETED)),
424-
cb.isFalse(eventJoin.get(Event.ARCHIVED)),
425-
cb.isFalse(eventCountRoot.get(EventParticipant.DELETED))));
426-
eventCountSq.select(cb.countDistinct(eventJoin.get(Event.ID)));
427-
428411
cq.multiselect(
429412
Stream.concat(
430413
Stream.of(
@@ -491,7 +474,6 @@ public List<ContactExportDto> getExportList(ContactCriteria contactCriteria, int
491474
joins.getEpiData().get(EpiData.ID),
492475
joins.getEpiData().get(EpiData.CONTACT_WITH_SOURCE_CASE_KNOWN),
493476
contact.get(Contact.RETURNING_TRAVELER),
494-
eventCountSq,
495477
contact.get(Contact.EXTERNAL_ID)),
496478
listCriteriaBuilder.getJurisdictionSelections(joins)).collect(Collectors.toList()));
497479

@@ -544,10 +526,10 @@ public List<ContactExportDto> getExportList(ContactCriteria contactCriteria, int
544526
List<Exposure> exposureList = em.createQuery(exposuresCq).setHint(ModelConstants.HINT_HIBERNATE_READ_ONLY, true).getResultList();
545527
Map<Long, List<Exposure>> exposures = exposureList.stream().collect(Collectors.groupingBy(e -> e.getEpiData().getId()));
546528

547-
// Load latest events info
548-
// Adding a second query here is not perfect, but selecting the last event with a criteria query
549-
// doesn't seem to be possible and using a native query is not an option because of user filters
550-
List<ContactEventSummaryDetails> eventSummaries = eventService.getEventSummaryDetailsByContacts(resultContactsUuids);
529+
// Load event count and latest events info per contact
530+
Map<String, List<ContactEventSummaryDetails>> eventSummaries = eventService.getEventSummaryDetailsByContacts(resultContactsUuids)
531+
.stream()
532+
.collect(Collectors.groupingBy(ContactEventSummaryDetails::getContactUuid, Collectors.toList()));
551533

552534
// Adding a second query here is not perfect, but selecting the last cooperative visit with a criteria query
553535
// doesn't seem to be possible and using a native query is not an option because of user filters
@@ -597,22 +579,18 @@ public List<ContactExportDto> getExportList(ContactCriteria contactCriteria, int
597579
});
598580
}
599581

600-
if (eventSummaries != null && exportContact.getEventCount() != 0) {
601-
eventSummaries.stream()
602-
.filter(v -> v.getContactUuid().equals(exportContact.getUuid()))
603-
.max(Comparator.comparing(ContactEventSummaryDetails::getEventDate))
604-
.ifPresent(eventSummary -> {
605-
exportContact.setLatestEventId(eventSummary.getEventUuid());
606-
exportContact.setLatestEventTitle(eventSummary.getEventTitle());
607-
});
608-
}
582+
List<ContactEventSummaryDetails> contactEvents = eventSummaries.getOrDefault(exportContact.getUuid(), Collections.emptyList());
583+
exportContact.setEventCount((long) contactEvents.size());
584+
contactEvents.stream().max(Comparator.comparing(ContactEventSummaryDetails::getEventDate)).ifPresent(eventSummary -> {
585+
exportContact.setLatestEventId(eventSummary.getEventUuid());
586+
exportContact.setLatestEventTitle(eventSummary.getEventTitle());
587+
});
609588

610589
pseudonymizer.pseudonymizeDto(ContactExportDto.class, exportContact, inJurisdiction, null);
611590
}
612591
}
613592

614593
return exportContacts;
615-
616594
}
617595

618596
@Override

sormas-backend/src/test/java/de/symeda/sormas/backend/contact/ContactFacadeEjbTest.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -736,7 +736,8 @@ public void testGetExportList() {
736736
visit.getSymptoms().setAbdominalPain(SymptomState.YES);
737737
getVisitFacade().saveVisit(visit);
738738

739-
List<ContactExportDto> results = getContactFacade().getExportList(null, 0, 100, Language.EN);
739+
List<ContactExportDto> results;
740+
results = getContactFacade().getExportList(null, 0, 100, Language.EN);
740741

741742
// Database should contain one contact, associated visit and task
742743
assertEquals(1, results.size());
@@ -766,6 +767,23 @@ public void testGetExportList() {
766767
exposure.getEndDate(),
767768
Language.EN),
768769
exportDto.getTravelHistory());
770+
assertThat(exportDto.getEventCount(), equalTo(0L));
771+
772+
// one Contact with 2 Events
773+
UserReferenceDto reportingUser = new UserReferenceDto(user.getUuid());
774+
EventDto event1 = creator.createEvent(reportingUser, DateHelper.subtractDays(new Date(), 1));
775+
EventDto event2 = creator.createEvent(reportingUser, new Date());
776+
creator.createEventParticipant(new EventReferenceDto(event2.getUuid()), contactPerson, reportingUser);
777+
creator.createEventParticipant(new EventReferenceDto(event1.getUuid()), contactPerson, reportingUser);
778+
779+
results = getContactFacade().getExportList(null, 0, 100, Language.EN);
780+
assertThat(results, hasSize(1));
781+
{
782+
ContactExportDto dto = results.get(0);
783+
assertThat(dto.getLatestEventId(), equalTo(event2.getUuid()));
784+
assertThat(dto.getLatestEventTitle(), equalTo(event2.getEventTitle()));
785+
assertThat(dto.getEventCount(), equalTo(2L));
786+
}
769787
}
770788

771789
@Test

0 commit comments

Comments
 (0)