package edu.ualberta.med.biobank.common.action.patient; import java.util.List; import org.hibernate.Query; import edu.ualberta.med.biobank.common.action.Action; import edu.ualberta.med.biobank.common.action.ActionContext; import edu.ualberta.med.biobank.common.action.ActionResult; import edu.ualberta.med.biobank.common.action.exception.ActionException; import edu.ualberta.med.biobank.common.action.patient.PatientGetCollectionEventInfosAction.PatientCEventInfo; import edu.ualberta.med.biobank.common.action.patient.PatientGetInfoAction.PatientInfo; import edu.ualberta.med.biobank.common.permission.patient.PatientReadPermission; import edu.ualberta.med.biobank.model.Comment; import edu.ualberta.med.biobank.model.Patient; /** * Retrieve a patient information using a patient id * * @author delphine * */ public class PatientGetInfoAction implements Action<PatientInfo> { private static final long serialVersionUID = 1L; @SuppressWarnings("nls") private static final String PATIENT_INFO_HQL = "SELECT patient,COUNT(DISTINCT sourceSpecs)," + "COUNT(DISTINCT allSpecs) - COUNT(DISTINCT sourceSpecs)" + " FROM " + Patient.class.getName() + " patient" + " INNER JOIN FETCH patient.study study" + " LEFT JOIN patient.collectionEvents cevents" + " LEFT JOIN cevents.originalSpecimens sourceSpecs" + " LEFT JOIN cevents.allSpecimens allSpecs" + " WHERE patient.id = ?" + " GROUP BY patient"; private final Integer patientId; public static class PatientInfo implements ActionResult { private static final long serialVersionUID = 1L; public Patient patient; public List<PatientCEventInfo> ceventInfos; public Long sourceSpecimenCount; public Long aliquotedSpecimenCount; } public PatientGetInfoAction(Integer patientId) { this.patientId = patientId; } @Override public boolean isAllowed(ActionContext context) { return new PatientReadPermission(patientId).isAllowed(context); } @Override public PatientInfo run(ActionContext context) throws ActionException { PatientInfo pInfo = new PatientInfo(); Query query = context.getSession().createQuery(PATIENT_INFO_HQL); query.setParameter(0, patientId); Object[] results = (Object[]) query.uniqueResult(); pInfo.patient = (Patient) results[0]; pInfo.sourceSpecimenCount = (Long) results[1]; pInfo.aliquotedSpecimenCount = (Long) results[2]; pInfo.ceventInfos = new PatientGetCollectionEventInfosAction(patientId) .run(context).getList(); // get all comments for (Comment c : pInfo.patient.getComments()) { c.getUser().getLogin(); } return pInfo; } }