2727import org .hibernate .transform .Transformers ;
2828import org .openmrs .Cohort ;
2929import org .openmrs .Order ;
30+ import org .openmrs .Patient ;
31+ import org .openmrs .PatientIdentifier ;
32+ import org .openmrs .PersonName ;
3033import org .openmrs .api .context .Context ;
3134import org .openmrs .api .db .DAOException ;
3235import 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}
0 commit comments