package edu.ualberta.med.biobank.common.action.site;
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.Site;
import edu.ualberta.med.biobank.model.Study;
public class SiteGetStudyInfoAction implements
Action<ListResult<StudyCountInfo>> {
private static final long serialVersionUID = 1L;
// @formatter:off
@SuppressWarnings("nls")
private static final String STUDY_INFO_HQL = "SELECT studies, COUNT(DISTINCT patients), COUNT(DISTINCT collectionEvents)"
+ " FROM " + Site.class.getName() + " site"
+ " INNER JOIN site.studies AS studies"
+ " LEFT JOIN studies.patients AS patients"
+ " LEFT JOIN patients.collectionEvents AS collectionEvents"
+ " WHERE site.id = ?"
+ " GROUP BY studies"
+ " ORDER BY studies.nameShort";
// @formatter:on
private final Integer siteId;
public SiteGetStudyInfoAction(Integer siteId) {
this.siteId = siteId;
}
public SiteGetStudyInfoAction(Site site) {
this(site.getId());
}
@Override
public boolean isAllowed(ActionContext context) {
return true;
}
@Override
public ListResult<StudyCountInfo> run(ActionContext context)
throws ActionException {
ArrayList<StudyCountInfo> studies = new ArrayList<StudyCountInfo>();
Query query = context.getSession().createQuery(STUDY_INFO_HQL);
query.setParameter(0, siteId);
@SuppressWarnings("unchecked")
List<Object[]> results = query.list();
for (Object[] row : results) {
StudyCountInfo studyInfo =
new StudyCountInfo((Study) row[0], (Long) row[1],
(Long) row[2]);
studies.add(studyInfo);
}
return new ListResult<StudyCountInfo>(studies);
}
}