package edu.ualberta.med.biobank.common.action.clinic; import java.util.ArrayList; 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.ListResult; import edu.ualberta.med.biobank.common.action.exception.ActionException; import edu.ualberta.med.biobank.common.action.info.StudyCountInfo; import edu.ualberta.med.biobank.model.Clinic; import edu.ualberta.med.biobank.model.Study; public class ClinicGetStudyInfoAction implements Action<ListResult<StudyCountInfo>> { private static final long serialVersionUID = 1L; // @formatter:off @SuppressWarnings("nls") private static final String STUDY_INFO_HQL = "SELECT clinics,studies,COUNT(DISTINCT patients)," + " COUNT(DISTINCT cevents)" + " FROM edu.ualberta.med.biobank.model.Clinic clinics" + " INNER JOIN clinics.originInfos oi" + " INNER JOIN oi.specimens spcs" + " INNER JOIN spcs.collectionEvent cevents" + " INNER JOIN cevents.patient patients" + " INNER JOIN patients.study studies" + " WHERE clinics.id=?" + " GROUP BY clinics,studies"; // @formatter:on private final Integer clinicId; public ClinicGetStudyInfoAction(Integer clinicId) { this.clinicId = clinicId; } public ClinicGetStudyInfoAction(Clinic clinic) { this(clinic.getId()); } @Override public boolean isAllowed(ActionContext context) throws ActionException { return true; } @Override public ListResult<StudyCountInfo> run(ActionContext context) throws ActionException { ArrayList<StudyCountInfo> infos = new ArrayList<StudyCountInfo>(); Query query = context.getSession().createQuery(STUDY_INFO_HQL); query.setParameter(0, clinicId); @SuppressWarnings("unchecked") List<Object[]> results = query.list(); for (Object[] row : results) { StudyCountInfo info = new StudyCountInfo((Study) row[1], (Long) row[2], (Long) row[3]); infos.add(info); } return new ListResult<StudyCountInfo>(infos); } }