package edu.ualberta.med.biobank.common.action.site; 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.exception.ActionException; import edu.ualberta.med.biobank.common.action.info.SiteInfo; import edu.ualberta.med.biobank.common.permission.site.SiteReadPermission; import edu.ualberta.med.biobank.model.ActivityStatus; import edu.ualberta.med.biobank.model.Site; public class SiteGetInfoAction implements Action<SiteInfo> { private static final long serialVersionUID = 1L; @SuppressWarnings("nls") private static final String SITE_INFO_HQL = "SELECT site" + " FROM " + Site.class.getName() + " site" + " INNER JOIN FETCH site.address address" + " LEFT JOIN FETCH site.studies studies" + " LEFT JOIN FETCH site.comments comments" + " LEFT JOIN FETCH comments.user" + " WHERE site.id = ?"; @SuppressWarnings("nls") private static final String SITE_COUNT_INFO_HQL = "SELECT COUNT(DISTINCT patients), COUNT(DISTINCT pevents)," + "COUNT(DISTINCT specimens)" + " FROM " + Site.class.getName() + " site" + " LEFT JOIN site.processingEvents pevents" + " LEFT JOIN pevents.specimens specimens" + " WITH specimens.activityStatus=?" + " LEFT JOIN specimens.currentCenter currentCenter" + " WITH currentCenter=site" + " LEFT JOIN specimens.collectionEvent cevent" + " LEFT JOIN cevent.patient patients" + " WHERE site.id=?"; private final Integer siteId; public SiteGetInfoAction(Site site) { this(site.getId()); } public SiteGetInfoAction(Integer siteId) { this.siteId = siteId; } @Override public boolean isAllowed(ActionContext context) { return new SiteReadPermission(siteId).isAllowed(context); } @Override public SiteInfo run(ActionContext context) throws ActionException { Query query = context.getSession().createQuery(SITE_INFO_HQL); query.setParameter(0, siteId); Site site = (Site) query.uniqueResult(); SiteInfo.Builder builder = new SiteInfo.Builder(); builder.setSite(site); query = context.getSession().createQuery(SITE_COUNT_INFO_HQL); query.setParameter(1, siteId); query.setParameter(0, ActivityStatus.ACTIVE); Object[] items = (Object[]) query.uniqueResult(); builder.setPatientCount((Long) items[0]); builder.setProcessingEventCount((Long) items[1]); builder.setSpecimenCount((Long) items[2]); builder.setTopContainers( new SiteGetTopContainersAction(siteId).run(context).getList()); builder.setContainerTypes( new SiteGetContainerTypeInfoAction(siteId).run(context).getList()); builder .setStudies( new SiteGetStudyInfoAction(siteId).run(context).getList()); return builder.build(); } }