Skip to content

Commit

Permalink
Martina | BAH-460 | added birthdate as parameter to similar patient s…
Browse files Browse the repository at this point in the history
…earch
  • Loading branch information
mduemcke committed Aug 9, 2018
1 parent 331580d commit 46c1e58
Show file tree
Hide file tree
Showing 8 changed files with 166 additions and 55 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,18 @@
import org.apache.commons.lang.StringUtils;
import org.openmrs.module.webservices.rest.web.RequestContext;

import java.sql.Timestamp;
import java.util.Date;
import java.util.Map;

public class PatientSearchParameters {
private final String MIDNIGHT = "00:00:00";

private Boolean filterPatientsByLocation;
private String identifier;
private String name;
private String gender;
private Date birthdate;
private String addressFieldName;
private String addressFieldValue;
private Integer start;
Expand Down Expand Up @@ -45,6 +50,7 @@ public PatientSearchParameters(RequestContext context) {
this.setAddressFieldName("city_village");
}
this.setGender(context.getParameter("gender"));
this.setBirthdate(context.getParameter("birthdate"));
this.setAddressFieldValue(context.getParameter("addressFieldValue"));
Map parameterMap = context.getRequest().getParameterMap();
this.setAddressSearchResultFields((String[]) parameterMap.get("addressSearchResultsConfig"));
Expand Down Expand Up @@ -81,6 +87,24 @@ public void setGender(String gender) {
this.gender = gender;
}

public void setBirthdate(String birthdate) {
if(StringUtils.isEmpty(birthdate)) {
return;
}

this.birthdate = Timestamp.valueOf(addTimeIfMissing(birthdate));
}

private String addTimeIfMissing(String birthdate) {
if(StringUtils.isNotEmpty(birthdate) && birthdate.matches("\\d{4}-\\d{2}-\\d{2}")) {
return birthdate + " " + MIDNIGHT;
} else return birthdate;
}

public Date getBirthdate() {
return birthdate;
}

public String getAddressFieldName() {
return addressFieldName;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import org.openmrs.Patient;
import org.openmrs.RelationshipType;

import java.util.Date;
import java.util.List;

public interface PatientDao {
Expand All @@ -19,7 +20,7 @@ List<PatientResponse> getPatientsUsingLuceneSearch(String identifier, String nam
String programAttributeFieldName, String[] addressSearchResultFields,
String[] patientSearchResultFields, String loginLocationUuid, Boolean filterPatientsByLocation, Boolean filterOnAllIdentifiers);

List<PatientResponse> getSimilarPatientsUsingLuceneSearch(String name, String gender, String loginLocationUuid, Integer length);
List<PatientResponse> getSimilarPatientsUsingLuceneSearch(String name, String gender, Date birthdate, String loginLocationUuid, Integer length);

public Patient getPatient(String identifier);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -101,9 +101,9 @@ public List<PatientResponse> getPatientsUsingLuceneSearch(String identifier, Str
}

@Override
public List<PatientResponse> getSimilarPatientsUsingLuceneSearch(String name, String gender, String loginLocationUuid, Integer length) {
public List<PatientResponse> getSimilarPatientsUsingLuceneSearch(String name, String gender, Date birthdate, String loginLocationUuid, Integer length) {
PatientResponseMapper patientResponseMapper = new PatientResponseMapper(Context.getVisitService(),new BahmniVisitLocationServiceImpl(Context.getLocationService()));
List<Patient> patients = getPatientsByNameAndGender(name, gender, length);
List<Patient> patients = getPatientsByNameGenderAndBirthdate(name, gender, birthdate, length);
List<PatientResponse> patientResponses = patients.stream()
.map(patient -> {return patientResponseMapper.map(patient, loginLocationUuid, null, null,null);}).filter(Objects::nonNull)
.collect(toList());
Expand All @@ -121,7 +121,7 @@ private PatientResponse toPatientResponse(PatientResponseMapper patientResponseM
}
}

private List<Patient> getPatientsByNameAndGender(String name, String gender, Integer length) {
private List<Patient> getPatientsByNameGenderAndBirthdate(String name, String gender, Date birthdate, Integer length) {
if(isNullOrEmpty(name, gender)) {
return new ArrayList<>();
}
Expand All @@ -133,7 +133,9 @@ private List<Patient> getPatientsByNameAndGender(String name, String gender, Int
LuceneQuery<PersonName> nameQuery = personLuceneQuery.getPatientNameQueryWithOrParser(query, false);
List<Patient> patients = nameQuery.list().stream()
.filter(personName ->
personName.getPreferred() && checkGender(personName.getPerson(), gender))
personName.getPreferred() && checkGender(personName.getPerson(), gender)
&& checkBirthdate(personName.getPerson(), birthdate)
)
.limit(length)
.map(personName -> new Patient(personName.getPerson()))
.collect(toList());
Expand All @@ -153,6 +155,15 @@ private Boolean checkGender(Person person, String gender) {
}
}

private Boolean checkBirthdate(Person person, Date birthdate) {
if(birthdate != null) {
Date extractedBirthdate = person.getBirthdate();
return birthdate.equals(person.getBirthdate());
} else {
return true;
}
}

private List<PatientIdentifier> getPatientIdentifiers(String identifier, Boolean filterOnAllIdentifiers, Integer offset, Integer length) {
FullTextSession fullTextSession = Search.getFullTextSession(sessionFactory.getCurrentSession());
QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(PatientIdentifier.class).get();
Expand All @@ -161,7 +172,7 @@ private List<PatientIdentifier> getPatientIdentifiers(String identifier, Boolean
.wildcard().onField("identifierAnywhere").matching("*" + identifier.toLowerCase() + "*").createQuery();
org.apache.lucene.search.Query nonVoidedIdentifiers = queryBuilder.keyword().onField("voided").matching(false).createQuery();
org.apache.lucene.search.Query nonVoidedPatients = queryBuilder.keyword().onField("patient.voided").matching(false).createQuery();

List<String> identifierTypeNames = getIdentifierTypeNames(filterOnAllIdentifiers);

BooleanJunction identifierTypeShouldJunction = queryBuilder.bool();
Expand All @@ -185,7 +196,7 @@ private List<PatientIdentifier> getPatientIdentifiers(String identifier, Boolean
fullTextQuery.setMaxResults(length);
return (List<PatientIdentifier>) fullTextQuery.list();
}

private List<String> getIdentifierTypeNames(Boolean filterOnAllIdentifiers) {
List<String> identifierTypeNames = new ArrayList<>();
addIdentifierTypeName(identifierTypeNames,"bahmni.primaryIdentifierType");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ public List<PatientResponse> luceneSearch(PatientSearchParameters searchParamete
public List<PatientResponse> searchSimilarPatients(PatientSearchParameters searchParameters) {
return patientDao.getSimilarPatientsUsingLuceneSearch(searchParameters.getName(),
searchParameters.getGender(),
searchParameters.getBirthdate(),
searchParameters.getLoginLocationUuid(),
SIMILAR_PATIENT_RESULT_LENGTH);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package org.bahmni.module.bahmnicore.contract.patient;

import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.openmrs.module.webservices.rest.web.RequestContext;

import javax.servlet.http.HttpServletRequest;
import java.sql.Timestamp;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;


public class PatientSearchParametersTest {

@Mock
RequestContext requestContext;

@Mock
HttpServletRequest request;

@Before
public void setup() {
initMocks(this);
when(requestContext.getRequest()).thenReturn(request);
}

@Test
public void shouldParseTheBirtdateFromString () {
when(requestContext.getParameter("birthdate")).thenReturn("1983-01-30 00:00:00");
PatientSearchParameters patientSearchParameters = new PatientSearchParameters(requestContext);

assertEquals(Timestamp.valueOf("1983-01-30 00:00:00"), patientSearchParameters.getBirthdate());
}

@Test
public void shouldIgnoreEmptyBirthdate () {
when(requestContext.getParameter("birthdate")).thenReturn("");
PatientSearchParameters patientSearchParameters;
patientSearchParameters = new PatientSearchParameters(requestContext);

assertNull(patientSearchParameters.getBirthdate());
}

@Test
public void shouldSetToMidnightForBirthdateIfTimeIsMissing () {
when(requestContext.getParameter("birthdate")).thenReturn("1983-01-30");
PatientSearchParameters patientSearchParameters;
patientSearchParameters = new PatientSearchParameters(requestContext);

assertEquals(Timestamp.valueOf("1983-01-30 00:00:00"), patientSearchParameters.getBirthdate());
}
}
Loading

0 comments on commit 46c1e58

Please sign in to comment.