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

Commit 4871b8a

Browse files
authored
Merge pull request SORMAS-Foundation#4037 from hzi-braunschweig/bug-4008-MergeCasesFilterFix
SORMAS-Foundation#4008 - cases merge filter fix
2 parents 4e07b82 + 48513f3 commit 4871b8a

3 files changed

Lines changed: 60 additions & 2 deletions

File tree

sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1353,7 +1353,12 @@ public List<CaseIndexDto[]> getCasesForDuplicateMerging(CaseCriteria criteria, b
13531353
cb.function("date_part", Long.class, cb.parameter(String.class, "date_type"), symptoms2.get(Symptoms.ONSET_DATE)))),
13541354
new Long(30 * 24 * 60 * 60) // 30 days
13551355
));
1356-
Predicate creationDateFilter = cb.lessThan(root.get(Case.CREATION_DATE), root2.get(Case.CREATION_DATE));
1356+
1357+
Predicate creationDateFilter = cb.or(
1358+
cb.lessThan(root.get(Case.CREATION_DATE), root2.get(Case.CREATION_DATE)),
1359+
cb.or(
1360+
cb.lessThanOrEqualTo(root2.get(Case.CREATION_DATE), DateHelper.getStartOfDay(criteria.getCreationDateFrom())),
1361+
cb.greaterThanOrEqualTo(root2.get(Case.CREATION_DATE), DateHelper.getEndOfDay(criteria.getCreationDateTo()))));
13571362

13581363
Predicate filter = cb.and(caseService.createDefaultFilter(cb, root), caseService.createDefaultFilter(cb, root2));
13591364
if (userFilter != null) {
@@ -1379,6 +1384,7 @@ public List<CaseIndexDto[]> getCasesForDuplicateMerging(CaseCriteria criteria, b
13791384
filter = cb.and(filter, cb.or(sexFilter, birthDateFilter));
13801385
filter = cb.and(filter, onsetDateFilter);
13811386
filter = cb.and(filter, creationDateFilter);
1387+
filter = cb.and(filter, cb.notEqual(root.get(Case.ID), root2.get(Case.ID)));
13821388

13831389
cq.where(filter);
13841390
cq.multiselect(root.get(Case.ID), root2.get(Case.ID), root.get(Case.CREATION_DATE));

sormas-backend/src/test/java/de/symeda/sormas/backend/H2Function.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,12 @@ public static float similarity(String a, String b) {
1111
return a.equalsIgnoreCase(b) ? 1 : 0;
1212
}
1313

14-
public static int date_part(String part, Date date) {
14+
public static long date_part(String part, Date date) {
1515
switch (part) {
1616
case "year":
1717
return DateHelper8.toLocalDate(date).getYear();
18+
case "epoch":
19+
return date.getTime() / 1000;
1820
default:
1921
throw new IllegalArgumentException(part);
2022
}

sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEjbTest.java

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import static org.junit.Assert.assertThat;
2828
import static org.junit.Assert.assertTrue;
2929

30+
import java.sql.Timestamp;
3031
import java.time.LocalDate;
3132
import java.util.ArrayList;
3233
import java.util.Arrays;
@@ -36,6 +37,9 @@
3637
import java.util.List;
3738
import java.util.stream.Collectors;
3839

40+
import org.apache.commons.lang3.time.DateUtils;
41+
import org.hibernate.internal.SessionImpl;
42+
import org.hibernate.query.spi.QueryImplementor;
3943
import org.hamcrest.MatcherAssert;
4044
import org.junit.Assert;
4145
import org.junit.Rule;
@@ -118,6 +122,52 @@ public class CaseFacadeEjbTest extends AbstractBeanTest {
118122
@Rule
119123
public final ExpectedException exception = ExpectedException.none();
120124

125+
@Test
126+
public void testGetCasesForDuplicateMerging() {
127+
128+
final Date today = new Date();
129+
final Date threeDaysAgo = DateUtils.addDays(today, -3);
130+
131+
RDCFEntities rdcf = creator.createRDCFEntities("Region", "District", "Community", "Facility");
132+
UserDto user = creator
133+
.createUser(rdcf.region.getUuid(), rdcf.district.getUuid(), rdcf.facility.getUuid(), "Surv", "Sup", UserRole.SURVEILLANCE_SUPERVISOR);
134+
PersonDto cazePerson = creator.createPerson("Case", "Person");
135+
CaseDataDto caze = creator.createCase(
136+
user.toReference(),
137+
cazePerson.toReference(),
138+
Disease.EVD,
139+
CaseClassification.PROBABLE,
140+
InvestigationStatus.PENDING,
141+
today,
142+
rdcf);
143+
144+
SessionImpl em = (SessionImpl) getEntityManager();
145+
QueryImplementor query = em.createQuery("select c from cases c where c.uuid=:uuid");
146+
query.setParameter("uuid", caze.getUuid());
147+
Case singleResult = (Case) query.getSingleResult();
148+
149+
singleResult.setCreationDate(new Timestamp(threeDaysAgo.getTime()));
150+
singleResult.setReportDate(threeDaysAgo);
151+
em.save(singleResult);
152+
153+
PersonDto cazePerson2 = creator.createPerson("Case", "Person");
154+
CaseDataDto case2 = creator.createCase(
155+
user.toReference(),
156+
cazePerson2.toReference(),
157+
Disease.EVD,
158+
CaseClassification.PROBABLE,
159+
InvestigationStatus.PENDING,
160+
DateUtils.addMinutes(today, -3),
161+
rdcf);
162+
163+
final List<CaseIndexDto[]> casesForDuplicateMergingToday =
164+
getCaseFacade().getCasesForDuplicateMerging(new CaseCriteria().creationDateFrom(today).creationDateTo(today), true);
165+
final List<CaseIndexDto[]> casesForDuplicateMergingThreeDaysAgo =
166+
getCaseFacade().getCasesForDuplicateMerging(new CaseCriteria().creationDateFrom(threeDaysAgo).creationDateTo(threeDaysAgo), true);
167+
Assert.assertEquals(1, casesForDuplicateMergingToday.size());
168+
Assert.assertEquals(1, casesForDuplicateMergingThreeDaysAgo.size());
169+
}
170+
121171
@Test
122172
public void testDiseaseChangeUpdatesContacts() {
123173

0 commit comments

Comments
 (0)