package edu.ualberta.med.biobank.server.reports; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import edu.ualberta.med.biobank.common.formatters.DateFormatter; import edu.ualberta.med.biobank.common.reports.BiobankReport; import edu.ualberta.med.biobank.model.ActivityStatus; import edu.ualberta.med.biobank.model.Specimen; import gov.nih.nci.system.applicationservice.ApplicationException; import gov.nih.nci.system.applicationservice.WritableApplicationService; import gov.nih.nci.system.query.hibernate.HQLCriteria; public class SpecimenReport3 extends AbstractReport { // TODO: switch to CollectionEvent.visitNumber? private static final String QUERY = "SELECT s" //$NON-NLS-1$ + (" FROM " + Specimen.class.getName() + " s ") //$NON-NLS-1$ //$NON-NLS-2$ + (" inner join fetch s.collectionEvent ce") //$NON-NLS-1$ + (" inner join fetch ce.patient p") //$NON-NLS-1$ + (" inner join fetch s.topSpecimen ts") //$NON-NLS-1$ + (" inner join fetch s.specimenType st") //$NON-NLS-1$ + (" WHERE s.specimenPosition.container.label not like '" //$NON-NLS-1$ + SENT_SAMPLES_FREEZER_NAME + "'") //$NON-NLS-1$ + " and s.collectionEvent.patient.pnumber = ?" //$NON-NLS-1$ + " and datediff(s.topSpecimen.createdAt, ?) = 0" //$NON-NLS-1$ + " and s.specimenType.nameShort like ?" //$NON-NLS-1$ + " and s.activityStatus != " + ActivityStatus.CLOSED.getId() //$NON-NLS-1$ + " ORDER BY s.activityStatus, RAND()"; //$NON-NLS-1$ public SpecimenReport3(BiobankReport report) { super(QUERY, report); } @Override public List<Object> executeQuery(WritableApplicationService appService) throws ApplicationException { List<Object> parameters = report.getParams(); List<Object> results = new ArrayList<Object>(); HQLCriteria c; for (Object o : parameters) { RequestData request = (RequestData) o; c = new HQLCriteria(queryString); c.setParameters(Arrays.asList(new Object[] { request.getPnumber(), request.getDateDrawn(), request.getSpecimenTypeNameShort() })); // need to limit query size but not possible in hql List<Object> queried = appService.query(c); long maxResults = request.getMaxAliquots(); for (int j = 0; j < maxResults; j++) { if (j < queried.size()) results.add(queried.get(j)); } if (queried.size() < maxResults) { results.add(getNotFoundRow(request.getPnumber(), request.getDateDrawn(), request.getSpecimenTypeNameShort(), maxResults, queried.size())); } } return results; } public static Object[] getNotFoundRow(String pnumber, Date dateDrawn, String typeName, long maxResults, Integer numResultsFound) { return new Object[] { pnumber, "", //$NON-NLS-1$ DateFormatter.formatAsDate(dateDrawn), typeName, "NOT FOUND (" + (maxResults - numResultsFound) + ")", "" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } // Database calls are made so can't use RowPostProcess @Override public List<Object> postProcess(WritableApplicationService appService, List<Object> results) { ArrayList<Object> modifiedResults = new ArrayList<Object>(); for (Object result : results) { if (result instanceof Specimen) { Specimen specimen = (Specimen) result; String pnumber = specimen.getCollectionEvent().getPatient() .getPnumber(); String inventoryId = specimen.getInventoryId(); Date dateDrawn = specimen.getTopSpecimen().getCreatedAt(); String specimenType = specimen.getSpecimenType().getNameShort(); String positionString = specimen.getSpecimenPosition() .getContainer().getLabel() + specimen.getSpecimenPosition().getPositionString(); String activityStatus = specimen.getActivityStatus().getName(); modifiedResults.add(new Object[] { pnumber, inventoryId, dateDrawn, specimenType, positionString, activityStatus }); } else if (result instanceof Object[]) { modifiedResults.add(result); } } return modifiedResults; } }