Skip to content

Commit 430ef7e

Browse files
authored
Merge pull request #339 from PatrickWaweru/addManifestSearchAPI
KHP3-8045 Added ability to search for manifests using patient details
2 parents b6d944d + 0b3cd45 commit 430ef7e

File tree

6 files changed

+214
-10
lines changed

6 files changed

+214
-10
lines changed

api/src/main/java/org/openmrs/module/kenyaemrorderentry/api/db/KenyaemrOrdersDAO.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,10 +112,12 @@ public interface KenyaemrOrdersDAO {
112112
void reprocessLabManifest(Integer manifestId);
113113
void reprocessLabManifest(String manifestUuid);
114114

115-
List<LabManifest> getLabManifests(String uuid, String status, String type, String withErrors, Date createdOnOrAfterDate, Date createdOnOrBeforeDate);
115+
List<LabManifest> getLabManifests(String uuid, String status, String type, String withErrors, String query, Date createdOnOrAfterDate, Date createdOnOrBeforeDate);
116116

117117
List<LimsQueue> getLimsQueueEntriesByStatus(LimsQueueStatus status, Date createdOnOrAfterDate, Date createdOnOrBeforeDate, boolean filterOrdersOnly);
118118

119+
List<LabManifestOrder> getLabManifestOrders(String uuid, String manifestuuid, String status, String type, String withError, String query, Date createdOnOrAfterDate, Date createdOnOrBeforeDate);
120+
119121
LimsQueue saveLimsQueue(LimsQueue limsQueue);
120122
LimsQueue getLimsQueueByOrder(Order order);
121123
//End of Patient Contact dimensions methods

api/src/main/java/org/openmrs/module/kenyaemrorderentry/api/db/hibernate/HibernateKenyaemrOrdersDAO.java

Lines changed: 169 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@
2727
import org.hibernate.transform.Transformers;
2828
import org.openmrs.Cohort;
2929
import org.openmrs.Order;
30+
import org.openmrs.Patient;
31+
import org.openmrs.PatientIdentifier;
32+
import org.openmrs.PersonName;
3033
import org.openmrs.api.context.Context;
3134
import org.openmrs.api.db.DAOException;
3235
import org.openmrs.module.kenyaemrorderentry.api.db.KenyaemrOrdersDAO;
@@ -860,8 +863,8 @@ public Long countTotalErrorsOnCompleteManifests() {
860863
}
861864

862865
@Override
863-
public List<LabManifest> getLabManifests(String uuid, String status, String type, String withErrors, Date createdOnOrAfterDate, Date createdOnOrBeforeDate) {
864-
System.err.println("Searching for manifests using: " + uuid + " : " + status + " : " + type + " : " + withErrors + " : " + createdOnOrAfterDate + " : " + createdOnOrBeforeDate + " : ");
866+
public List<LabManifest> getLabManifests(String uuid, String status, String type, String withErrors, String query, Date createdOnOrAfterDate, Date createdOnOrBeforeDate) {
867+
System.err.println("Searching for manifests using: " + uuid + " : " + status + " : " + type + " : " + withErrors + " : " + query + " : " + createdOnOrAfterDate + " : " + createdOnOrBeforeDate + " : ");
865868

866869
Session session = this.sessionFactory.getCurrentSession();
867870
CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
@@ -922,6 +925,44 @@ public List<LabManifest> getLabManifests(String uuid, String status, String type
922925
}
923926
}
924927

928+
// Query
929+
if(query != null && !query.isEmpty()) {
930+
// Join LabManifest with LabManifestOrder
931+
Join<LabManifest, LabManifestOrder> LabManifestOrderJoin = root.join("labManifestOrders");
932+
933+
// Join: LabManifestOrder -> Order
934+
Join<LabManifestOrder, Order> orderJoin = LabManifestOrderJoin.join("order");
935+
936+
// Join: Order -> Patient
937+
Join<Order, Patient> patientJoin = orderJoin.join("patient");
938+
939+
// Join: Patient -> names
940+
Join<Patient, PersonName> nameJoin = patientJoin.join("names");
941+
942+
// Join: Patient -> identifiers
943+
Join<Patient, PatientIdentifier> identifierJoin = patientJoin.join("identifiers");
944+
945+
// Lowercase search input
946+
String searchTerm = query.trim().toLowerCase();
947+
searchTerm = "%" + searchTerm +"%";
948+
949+
// Predicate: match givenName, middleName, or familyName
950+
Predicate namePredicate = criteriaBuilder.or(
951+
criteriaBuilder.like(criteriaBuilder.lower(nameJoin.get("givenName")), searchTerm),
952+
criteriaBuilder.like(criteriaBuilder.lower(nameJoin.get("middleName")), searchTerm),
953+
criteriaBuilder.like(criteriaBuilder.lower(nameJoin.get("familyName")), searchTerm)
954+
);
955+
956+
// Predicate: match identifier
957+
Predicate identifierPredicate = criteriaBuilder.like(criteriaBuilder.lower(identifierJoin.get("identifier")), searchTerm);
958+
959+
// Final combined predicate: match either name or identifier
960+
Predicate finalPredicate = criteriaBuilder.or(namePredicate, identifierPredicate);
961+
962+
// Add to final query
963+
predicate = criteriaBuilder.and(predicate, finalPredicate);
964+
}
965+
925966
// createdOnOrAfterDate
926967
if(createdOnOrAfterDate != null) {
927968
Path<Date> datePath = root.get("dateCreated");
@@ -940,8 +981,8 @@ public List<LabManifest> getLabManifests(String uuid, String status, String type
940981
criteriaQuery.where(predicate).distinct(true);
941982

942983
// Print the generated SQL query
943-
Query query = session.createQuery(criteriaQuery);
944-
String sqlQuery = query.unwrap(org.hibernate.query.Query.class).getQueryString();
984+
Query corequery = session.createQuery(criteriaQuery);
985+
String sqlQuery = corequery.unwrap(org.hibernate.query.Query.class).getQueryString();
945986
System.out.println("Generated SQL Query: " + sqlQuery);
946987

947988
List<LabManifest> results = session.createQuery(criteriaQuery).getResultList();
@@ -1003,4 +1044,128 @@ public LimsQueue getLimsQueueByOrder(Order order) {
10031044
return null;
10041045
}
10051046

1047+
@Override
1048+
public List<LabManifestOrder> getLabManifestOrders(String uuid, String manifestuuid, String status, String type, String withError,
1049+
String query, Date createdOnOrAfterDate, Date createdOnOrBeforeDate) {
1050+
System.err.println("Searching for manifest orders using: " + uuid + " : " + status + " : " + type + " : " + withError + " : " + query + " : " + createdOnOrAfterDate + " : " + createdOnOrBeforeDate + " : ");
1051+
1052+
Session session = this.sessionFactory.getCurrentSession();
1053+
CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
1054+
CriteriaQuery<LabManifestOrder> criteriaQuery = criteriaBuilder.createQuery(LabManifestOrder.class);
1055+
Root<LabManifestOrder> root = criteriaQuery.from(LabManifestOrder.class);
1056+
1057+
// Create predicates for the restrictions
1058+
Predicate predicate = criteriaBuilder.conjunction();
1059+
1060+
// uuid
1061+
if(uuid != null && !uuid.isEmpty()) {
1062+
predicate = criteriaBuilder.and(predicate, criteriaBuilder.equal(root.get("uuid"), uuid));
1063+
}
1064+
1065+
// manifestuuid
1066+
if(manifestuuid != null && !manifestuuid.isEmpty()) {
1067+
// Join LabManifestOrder with LabManifest
1068+
Join<LabManifestOrder, LabManifest> orderJoin = root.join("labManifest");
1069+
1070+
// Add to final query
1071+
Predicate completePredicate = criteriaBuilder.equal(orderJoin.get("uuid"), manifestuuid);
1072+
predicate = criteriaBuilder.and(predicate, completePredicate);
1073+
}
1074+
1075+
// status
1076+
if(status != null && !status.isEmpty()) {
1077+
predicate = criteriaBuilder.and(predicate, criteriaBuilder.equal(root.get("status"), status));
1078+
}
1079+
1080+
// sample type
1081+
if(type != null && !type.isEmpty()) {
1082+
predicate = criteriaBuilder.and(predicate, criteriaBuilder.equal(root.get("sampleType"), type));
1083+
}
1084+
1085+
// withErrors
1086+
if(withError != null && !withError.isEmpty()) {
1087+
System.out.println("Got with errors query");
1088+
if(withError.trim().equalsIgnoreCase("true")) {
1089+
System.out.println("withError is true");
1090+
// Create conditions
1091+
Predicate completePredicate = criteriaBuilder.equal(root.get("status"), "Complete");
1092+
Predicate pendingPredicate = criteriaBuilder.equal(root.get("status"), "Pending");
1093+
Predicate sentPredicate = criteriaBuilder.equal(root.get("status"), "Sent");
1094+
// Combine the conditions using OR
1095+
Predicate noErrorCondition = criteriaBuilder.or(completePredicate, pendingPredicate, sentPredicate);
1096+
predicate = criteriaBuilder.and(predicate, criteriaBuilder.not(noErrorCondition));
1097+
} else if(withError.trim().equalsIgnoreCase("false")) {
1098+
System.out.println("withError is false");
1099+
// Create conditions
1100+
Predicate completePredicate = criteriaBuilder.equal(root.get("status"), "Complete");
1101+
Predicate pendingPredicate = criteriaBuilder.equal(root.get("status"), "Pending");
1102+
Predicate sentPredicate = criteriaBuilder.equal(root.get("status"), "Sent");
1103+
// Combine the conditions using OR
1104+
Predicate noErrorCondition = criteriaBuilder.or(completePredicate, pendingPredicate, sentPredicate);
1105+
predicate = criteriaBuilder.and(predicate, noErrorCondition);
1106+
}
1107+
}
1108+
1109+
// query
1110+
if(query != null && !query.isEmpty()) {
1111+
// Join: LabManifestOrder -> Order
1112+
Join<LabManifestOrder, Order> orderJoin = root.join("order");
1113+
1114+
// Join: Order -> Patient
1115+
Join<Order, Patient> patientJoin = orderJoin.join("patient");
1116+
1117+
// Join: Patient -> names
1118+
Join<Patient, PersonName> nameJoin = patientJoin.join("names");
1119+
1120+
// Join: Patient -> identifiers
1121+
Join<Patient, PatientIdentifier> identifierJoin = patientJoin.join("identifiers");
1122+
1123+
// Lowercase search input
1124+
String searchTerm = query.trim().toLowerCase();
1125+
searchTerm = "%" + searchTerm +"%";
1126+
1127+
// Predicate: match givenName, middleName, or familyName
1128+
Predicate namePredicate = criteriaBuilder.or(
1129+
criteriaBuilder.like(criteriaBuilder.lower(nameJoin.get("givenName")), searchTerm),
1130+
criteriaBuilder.like(criteriaBuilder.lower(nameJoin.get("middleName")), searchTerm),
1131+
criteriaBuilder.like(criteriaBuilder.lower(nameJoin.get("familyName")), searchTerm)
1132+
);
1133+
1134+
// Predicate: match identifier
1135+
Predicate identifierPredicate = criteriaBuilder.like(criteriaBuilder.lower(identifierJoin.get("identifier")), searchTerm);
1136+
1137+
// Final combined predicate: match either name or identifier
1138+
Predicate finalPredicate = criteriaBuilder.or(namePredicate, identifierPredicate);
1139+
1140+
// Add to final query
1141+
predicate = criteriaBuilder.and(predicate, finalPredicate);
1142+
}
1143+
1144+
// createdOnOrAfterDate
1145+
if(createdOnOrAfterDate != null) {
1146+
Path<Date> datePath = root.get("dateCreated");
1147+
1148+
predicate = criteriaBuilder.and(predicate, criteriaBuilder.greaterThanOrEqualTo(datePath, createdOnOrAfterDate));
1149+
}
1150+
1151+
// createdOnOrBeforeDate
1152+
if(createdOnOrBeforeDate != null) {
1153+
Path<Date> datePath = root.get("dateCreated");
1154+
1155+
predicate = criteriaBuilder.and(predicate, criteriaBuilder.lessThanOrEqualTo(datePath, createdOnOrBeforeDate));
1156+
}
1157+
1158+
// criteriaQuery.where(predicate);
1159+
criteriaQuery.where(predicate).distinct(true);
1160+
1161+
// Print the generated SQL query
1162+
Query corequery = session.createQuery(criteriaQuery);
1163+
String sqlQuery = corequery.unwrap(org.hibernate.query.Query.class).getQueryString();
1164+
System.out.println("Generated SQL Query: " + sqlQuery);
1165+
1166+
List<LabManifestOrder> results = session.createQuery(criteriaQuery).getResultList();
1167+
1168+
return(results);
1169+
}
1170+
10061171
}

api/src/main/java/org/openmrs/module/kenyaemrorderentry/api/service/KenyaemrOrdersService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,9 @@ public interface KenyaemrOrdersService extends OpenmrsService {
3636
List<LabManifest> getLabOrderManifestBetweenDates(Date startDate, Date endDate);
3737
void voidLabOrderManifest(Integer id);
3838

39-
List<LabManifest> getLabManifests(String uuid, String status, String type, String withErrors, Date createdOnOrAfterDate, Date createdOnOrBeforeDate);
39+
List<LabManifest> getLabManifests(String uuid, String status, String type, String withErrors, String query, Date createdOnOrAfterDate, Date createdOnOrBeforeDate);
4040
List<LimsQueue> getLimsQueueEntriesByStatus(LimsQueueStatus status, Date createdOnOrAfterDate, Date createdOnOrBeforeDate, boolean filterOrdersOnly);
41+
List<LabManifestOrder> getLabManifestOrders(String uuid, String manifestuuid, String status, String type, String withError, String query, Date createdOnOrAfterDate, Date createdOnOrBeforeDate);
4142

4243
//Methods for manifest orders
4344
LabManifestOrder saveLabManifestOrder(LabManifestOrder labManifestOrder);

api/src/main/java/org/openmrs/module/kenyaemrorderentry/api/service/impl/KenyaemrOrdersServiceImpl.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -495,13 +495,20 @@ public List<SimpleObject> getLabManifestSummaryGraphSQL() {
495495
}
496496

497497
@Override
498-
public List<LabManifest> getLabManifests(String uuid, String status, String type, String withErrors, Date createdOnOrAfterDate, Date createdOnOrBeforeDate) {
499-
return dao.getLabManifests(uuid, status, type, withErrors, createdOnOrAfterDate, createdOnOrBeforeDate);
498+
public List<LabManifest> getLabManifests(String uuid, String status, String type, String withErrors, String query, Date createdOnOrAfterDate, Date createdOnOrBeforeDate) {
499+
return dao.getLabManifests(uuid, status, type, withErrors, query, createdOnOrAfterDate, createdOnOrBeforeDate);
500500
}
501501

502502
@Override
503503
public List<LimsQueue> getLimsQueueEntriesByStatus(LimsQueueStatus status, Date createdOnOrAfterDate, Date createdOnOrBeforeDate, boolean filterOrdersOnly) {
504504
return dao.getLimsQueueEntriesByStatus(status, createdOnOrAfterDate, createdOnOrBeforeDate, filterOrdersOnly);
505505
}
506506

507+
@Override
508+
public List<LabManifestOrder> getLabManifestOrders(String uuid, String manifestuuid, String status, String type, String withError,
509+
String query, Date createdOnOrAfterDate, Date createdOnOrBeforeDate) {
510+
return dao.getLabManifestOrders(uuid, manifestuuid, status, type, withError,
511+
query, createdOnOrAfterDate, createdOnOrBeforeDate);
512+
}
513+
507514
}

omod/src/main/java/org/openmrs/module/kenyaemrorderentry/web/resource/LabManifestOrderResource.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package org.openmrs.module.kenyaemrorderentry.web.resource;
22

33
import java.util.Date;
4+
import java.util.List;
45

6+
import org.apache.commons.lang.StringUtils;
57
import org.openmrs.Order;
68
import org.openmrs.annotation.Authorized;
79
import org.openmrs.api.context.Context;
@@ -14,6 +16,7 @@
1416
import org.openmrs.module.kenyaemrorderentry.labDataExchange.LabwareSystemWebRequest;
1517
import org.openmrs.module.kenyaemrorderentry.manifest.LabManifest;
1618
import org.openmrs.module.kenyaemrorderentry.manifest.LabManifestOrder;
19+
import org.openmrs.module.webservices.rest.web.ConversionUtil;
1720
import org.openmrs.module.webservices.rest.web.RequestContext;
1821
import org.openmrs.module.webservices.rest.web.RestConstants;
1922
import org.openmrs.module.webservices.rest.web.annotation.Resource;
@@ -22,6 +25,7 @@
2225
import org.openmrs.module.webservices.rest.web.representation.RefRepresentation;
2326
import org.openmrs.module.webservices.rest.web.representation.Representation;
2427
import org.openmrs.module.webservices.rest.web.resource.api.PageableResult;
28+
import org.openmrs.module.webservices.rest.web.resource.impl.AlreadyPaged;
2529
import org.openmrs.module.webservices.rest.web.resource.impl.DataDelegatingCrudResource;
2630
import org.openmrs.module.webservices.rest.web.resource.impl.DelegatingResourceDescription;
2731
import org.openmrs.module.webservices.rest.web.resource.impl.NeedsPaging;
@@ -131,7 +135,7 @@ public DelegatingResourceDescription getRepresentationDescription(Representation
131135
description.addProperty("uuid");
132136
description.addProperty("id");
133137
description.addProperty("labManifest", Representation.REF);
134-
description.addProperty("order", Representation.REF);
138+
description.addProperty("order", Representation.FULL);
135139
description.addProperty("sampleType");
136140
description.addProperty("payload");
137141
description.addProperty("dateSent");
@@ -183,4 +187,28 @@ public DelegatingResourceDescription getCreatableProperties() {
183187
return description;
184188
}
185189

190+
/**
191+
* Search for manifest orders using uuid, sample status, sample type, with error, date created
192+
* The query (q) searches in these fields: patient names, patient identifiers,
193+
*/
194+
@Override
195+
protected AlreadyPaged<LabManifestOrder> doSearch(RequestContext context) {
196+
String uuid = context.getRequest().getParameter("uuid");
197+
String manifestuuid = context.getRequest().getParameter("manifestuuid");
198+
String status = context.getRequest().getParameter("status");
199+
String type = context.getRequest().getParameter("type");
200+
String withError = context.getRequest().getParameter("withError");
201+
String query = context.getParameter("q");
202+
String createdOnOrBeforeDateStr = context.getRequest().getParameter("createdOnOrBefore");
203+
String createdOnOrAfterDateStr = context.getRequest().getParameter("createdOnOrAfter");
204+
205+
Date createdOnOrBeforeDate = StringUtils.isNotBlank(createdOnOrBeforeDateStr) ? (Date) ConversionUtil.convert(createdOnOrBeforeDateStr, Date.class) : null;
206+
Date createdOnOrAfterDate = StringUtils.isNotBlank(createdOnOrAfterDateStr) ? (Date) ConversionUtil.convert(createdOnOrAfterDateStr, Date.class) : null;
207+
208+
KenyaemrOrdersService service = Context.getService(KenyaemrOrdersService.class);
209+
210+
List<LabManifestOrder> result = service.getLabManifestOrders(uuid, manifestuuid, status, type, withError, query, createdOnOrAfterDate, createdOnOrBeforeDate);
211+
return new AlreadyPaged<LabManifestOrder>(context, result, false);
212+
}
213+
186214
}

omod/src/main/java/org/openmrs/module/kenyaemrorderentry/web/resource/LabManifestResource.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ protected AlreadyPaged<LabManifest> doSearch(RequestContext context) {
163163
String status = context.getRequest().getParameter("status");
164164
String type = context.getRequest().getParameter("type");
165165
String withErrors = context.getRequest().getParameter("withErrors");
166+
String query = context.getParameter("q");
166167
String createdOnOrBeforeDateStr = context.getRequest().getParameter("createdOnOrBefore");
167168
String createdOnOrAfterDateStr = context.getRequest().getParameter("createdOnOrAfter");
168169

@@ -171,7 +172,7 @@ protected AlreadyPaged<LabManifest> doSearch(RequestContext context) {
171172

172173
KenyaemrOrdersService service = Context.getService(KenyaemrOrdersService.class);
173174

174-
List<LabManifest> result = service.getLabManifests(uuid, status, type, withErrors, createdOnOrAfterDate, createdOnOrBeforeDate);
175+
List<LabManifest> result = service.getLabManifests(uuid, status, type, withErrors, query, createdOnOrAfterDate, createdOnOrBeforeDate);
175176
return new AlreadyPaged<LabManifest>(context, result, false);
176177
}
177178

0 commit comments

Comments
 (0)