diff --git a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateWardDAO.java b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateWardDAO.java index 599ffa3..af76bbf 100644 --- a/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateWardDAO.java +++ b/api/src/main/java/org/openmrs/module/ipd/api/dao/impl/HibernateWardDAO.java @@ -151,23 +151,24 @@ public List searchAdmittedPatients(Location location, List searchAdmittedPatients(Location location, List searchKeys,StringBuilder additionalJoins,StringBuilder whereClause) { + + private void generateSQLSearchConditions(List searchKeys, StringBuilder additionalJoins, StringBuilder whereClause, String searchValue) { whereClause.append("where (assignment.endDatetime is null and v.stopDatetime is null and l.parentLocation = :location)"); if (searchKeys != null && !searchKeys.isEmpty()) { whereClause.append(" and ("); @@ -203,7 +205,16 @@ private void generateSQLSearchConditions(List searchKeys,StringBuilder a break; case "patientName": additionalJoins.append(" JOIN pr.names prn "); - whereClause.append(" (prn.givenName LIKE :patientName or prn.middleName LIKE :patientName or prn.familyName LIKE :patientName) "); + whereClause.append(" ("); + + String[] nameParts = searchValue.split("\\s+"); + for (int j = 0; j < nameParts.length; j++) { + if (j > 0) whereClause.append(" and "); + whereClause.append(" (prn.givenName LIKE :namePart" + j + + " or prn.middleName LIKE :namePart" + j + + " or prn.familyName LIKE :namePart" + j + ") "); + } + whereClause.append(" )"); break; } if (i < searchKeys.size() - 1) { @@ -223,7 +234,10 @@ private void setQueryParameters(Query query, List searchKeys, String sea query.setParameter("patientIdentifier", "%" + searchValue + "%"); } if (searchKeys.contains("patientName")) { - query.setParameter("patientName", "%" + searchValue + "%"); + String[] nameParts = searchValue.split("\\s+"); + for (int i = 0; i < nameParts.length; i++) { + query.setParameter("namePart" + i, "%" + nameParts[i] + "%"); + } } } } diff --git a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDWardServiceImpl.java b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDWardServiceImpl.java index 2f487dd..e09998e 100644 --- a/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDWardServiceImpl.java +++ b/omod/src/main/java/org/openmrs/module/ipd/service/impl/IPDWardServiceImpl.java @@ -1,6 +1,5 @@ package org.openmrs.module.ipd.service.impl; - import org.openmrs.module.ipd.api.model.AdmittedPatient; import org.openmrs.module.ipd.api.model.IPDPatientDetails; import org.openmrs.module.ipd.api.model.WardPatientsSummary; @@ -12,6 +11,8 @@ import java.util.ArrayList; import java.util.List; +import java.util.Objects; +import java.util.regex.Pattern; @Service @Transactional @@ -24,6 +25,7 @@ public IPDWardServiceImpl(WardService wardService) { this.wardService = wardService; } + private static final Pattern numericPattern = Pattern.compile("^\\d+$"); @Override public WardPatientsSummary getIPDWardPatientSummary(String wardUuid, String providerUuid) { @@ -38,11 +40,12 @@ public IPDPatientDetails getIPDPatientByWard(String wardUuid, Integer offset, In if (admittedPatients ==null ){ return new IPDPatientDetails(new ArrayList<>(),0); } + List admittedPatientsSortedList = Objects.equals(sortBy, "bedNumber") ? sortNumericBedNumbers(admittedPatients) : admittedPatients; - offset = Math.min(offset, admittedPatients.size()); - limit = Math.min(limit, admittedPatients.size() - offset); + offset = Math.min(offset, admittedPatientsSortedList.size()); + limit = Math.min(limit, admittedPatientsSortedList.size() - offset); - return new IPDPatientDetails(admittedPatients.subList(offset, offset + limit), admittedPatients.size()); + return new IPDPatientDetails(admittedPatientsSortedList.subList(offset, offset + limit), admittedPatientsSortedList.size()); } @Override @@ -53,11 +56,12 @@ public IPDPatientDetails getIPDPatientsByWardAndProvider(String wardUuid, String if (admittedPatients ==null ){ return new IPDPatientDetails(new ArrayList<>(),0); } + List admittedPatientsSortedList = Objects.equals(sortBy, "bedNumber") ? sortNumericBedNumbers(admittedPatients) : admittedPatients; - offset = Math.min(offset, admittedPatients.size()); - limit = Math.min(limit, admittedPatients.size() - offset); + offset = Math.min(offset, admittedPatientsSortedList.size()); + limit = Math.min(limit, admittedPatientsSortedList.size() - offset); - return new IPDPatientDetails(admittedPatients.subList(offset, offset + limit), admittedPatients.size()); + return new IPDPatientDetails(admittedPatientsSortedList.subList(offset, offset + limit), admittedPatientsSortedList.size()); } @Override @@ -65,13 +69,33 @@ public IPDPatientDetails searchIPDPatientsInWard(String wardUuid, List s Integer offset, Integer limit, String sortBy) { List admittedPatients = wardService.searchWardPatients(wardUuid,searchKeys,searchValue,sortBy); + if (admittedPatients ==null ){ return new IPDPatientDetails(new ArrayList<>(),0); } - offset = Math.min(offset, admittedPatients.size()); - limit = Math.min(limit, admittedPatients.size() - offset); + List admittedPatientsSortedList = Objects.equals(sortBy, "bedNumber") ? sortNumericBedNumbers(admittedPatients) : admittedPatients; + + offset = Math.min(offset, admittedPatientsSortedList.size()); + limit = Math.min(limit, admittedPatientsSortedList.size() - offset); + + return new IPDPatientDetails(admittedPatientsSortedList.subList(offset, offset + limit), admittedPatientsSortedList.size()); + } - return new IPDPatientDetails(admittedPatients.subList(offset, offset + limit), admittedPatients.size()); + private List sortNumericBedNumbers(List admittedPatients) { + + boolean allNumeric = admittedPatients.stream() + .map(patient -> patient.getBedPatientAssignment().getBed().getBedNumber()) + .allMatch(bedNumber -> numericPattern.matcher(bedNumber).matches()); + + if(allNumeric) { + admittedPatients.sort((patientA, patientB) -> { + String bedNumberA = patientA.getBedPatientAssignment().getBed().getBedNumber(); + String bedNumberB = patientB.getBedPatientAssignment().getBed().getBedNumber(); + + return Integer.compare(Integer.parseInt(bedNumberA), Integer.parseInt(bedNumberB)); + }); + } + return admittedPatients; } } diff --git a/omod/src/main/resources/config.xml b/omod/src/main/resources/config.xml index 6a691b1..f33032b 100644 --- a/omod/src/main/resources/config.xml +++ b/omod/src/main/resources/config.xml @@ -7,7 +7,7 @@ 1.0.0-SNAPSHOT ${MODULE_PACKAGE} Bahmni - ${project.parent.description} + Provides APIs for IPD features org.openmrs.module.webservices.rest