package org.akaza.openclinica.dao.hibernate;
import org.akaza.openclinica.bean.admin.CRFBean;
import org.akaza.openclinica.bean.managestudy.StudyBean;
import org.akaza.openclinica.bean.managestudy.StudyEventDefinitionBean;
import org.akaza.openclinica.bean.submit.CRFVersionBean;
import org.akaza.openclinica.domain.Status;
import org.akaza.openclinica.domain.rule.RuleSetBean;
import org.akaza.openclinica.domain.rule.expression.ExpressionBean;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigInteger;
import java.util.ArrayList;
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class RuleSetDao extends AbstractDomainDao<RuleSetBean> {
@Override
public Class<RuleSetBean> domainClass() {
return RuleSetBean.class;
}
@SuppressWarnings("unchecked")
public RuleSetBean findById(Integer id, StudyBean study) {
String query = "from " + getDomainClassName() + " ruleSet where ruleSet.id = :id and ruleSet.studyId = :studyId ";
org.hibernate.Query q = getCurrentSession().createQuery(query);
q.setInteger("id", id);
q.setInteger("studyId", study.getId());
return (RuleSetBean) q.uniqueResult();
}
public Long count(StudyBean study) {
String query = "select count(*) from " + domainClass().getName() + " ruleSet where ruleSet.studyId = :studyId " + " AND ruleSet.status != :status ";
org.hibernate.Query q = getCurrentSession().createQuery(query);
q.setInteger("studyId", study.getId());
q.setParameter("status", Status.DELETED);
return (Long) q.uniqueResult();
}
public int getCountWithFilter(final ViewRuleAssignmentFilter filter) {
// Using a sql query because we are referencing objects not managed by hibernate
String query =
"select COUNT(DISTINCT(rs.id)) from rule_set rs "
+ " left outer join study_event_definition sed on rs.study_event_definition_id = sed.study_event_definition_id "
+ " left outer join crf_version cv on rs.crf_version_id = cv.crf_version_id " + " left outer join crf c on rs.crf_id = c.crf_id "
+ " left outer join item i on rs.item_id = i.item_id " + " left outer join item_group ig on rs.item_group_id = ig.item_group_id "
+ " join rule_expression re on rs.rule_expression_id = re.id " + " join rule_set_rule rsr on rs.id = rsr.rule_set_id "
+ " join rule r on r.id = rsr.rule_id " + " join rule_expression rer on r.rule_expression_id = rer.id " + " where ";
query += filter.execute("");
org.hibernate.Query q = getCurrentSession().createSQLQuery(query);
return ((BigInteger) q.uniqueResult()).intValue();
}
@SuppressWarnings("unchecked")
public ArrayList<RuleSetBean> getWithFilterAndSort(final ViewRuleAssignmentFilter filter, final ViewRuleAssignmentSort sort, final int rowStart,
final int rowEnd) {
String query =
"select DISTINCT(rs.*) from rule_set rs "
+ " left outer join study_event_definition sed on rs.study_event_definition_id = sed.study_event_definition_id "
+ " left outer join crf_version cv on rs.crf_version_id = cv.crf_version_id " + " left outer join crf c on rs.crf_id = c.crf_id "
+ " left outer join item i on rs.item_id = i.item_id " + " left outer join item_group ig on rs.item_group_id = ig.item_group_id "
+ " join rule_expression re on rs.rule_expression_id = re.id " + " join rule_set_rule rsr on rs.id = rsr.rule_set_id "
+ " join rule r on r.id = rsr.rule_id " + " join rule_expression rer on r.rule_expression_id = rer.id " + " where ";
query += filter.execute("");
org.hibernate.Query q = getCurrentSession().createSQLQuery(query).addEntity(domainClass());
q.setFirstResult(rowStart);
q.setMaxResults(rowEnd - rowStart);
return (ArrayList<RuleSetBean>) q.list();
}
@SuppressWarnings("unchecked")
@Transactional
public ArrayList<RuleSetBean> findByCrfVersionOrCrfAndStudyAndStudyEventDefinition(CRFVersionBean crfVersion, CRFBean crfBean, StudyBean currentStudy,
StudyEventDefinitionBean sed) {
// Using a sql query because we are referencing objects not managed by hibernate
String query =
" select rs.* from rule_set rs where rs.study_id = :studyId " + " AND (( rs.study_event_definition_id = :studyEventDefinitionId "
+ " AND (( rs.crf_version_id = :crfVersionId AND rs.crf_id = :crfId ) "
+ " OR (rs.crf_version_id is null AND rs.crf_id = :crfId ))) OR ( rs.study_event_definition_id is null "
+ " and rs.item_id in (select item_id from item_form_metadata where crf_version_id = :crfVersionId) ))";
org.hibernate.Query q = getCurrentSession().createSQLQuery(query).addEntity(domainClass());
q.setInteger("crfVersionId", crfVersion.getId());
q.setInteger("crfId", crfBean.getId());
q.setInteger("studyId", currentStudy.getParentStudyId() != 0 ? currentStudy.getParentStudyId() : currentStudy.getId());
q.setInteger("studyEventDefinitionId", sed.getId());
q.setCacheable(true);
return (ArrayList<RuleSetBean>) q.list();
}
@SuppressWarnings("unchecked")
public ArrayList<RuleSetBean> findAllByStudy(StudyBean currentStudy) {
String query = "from " + getDomainClassName() + " ruleSet where ruleSet.studyId = :studyId ";
org.hibernate.Query q = getCurrentSession().createQuery(query);
q.setInteger("studyId", currentStudy.getId());
return (ArrayList<RuleSetBean>) q.list();
}
@SuppressWarnings("unchecked")
public ArrayList<RuleSetBean> findByCrf(CRFBean crfBean, StudyBean currentStudy) {
String query =
" select rs.* from rule_set rs where rs.study_id = :studyId "
+ " AND rs.item_id in ( select distinct(item_id) from item_form_metadata ifm,crf_version cv "
+ " where ifm.crf_version_id = cv.crf_version_id and cv.crf_id = :crfId) ";
// Using a sql query because we are referencing objects not managed by hibernate
org.hibernate.Query q = getCurrentSession().createSQLQuery(query).addEntity(domainClass());
q.setInteger("crfId", crfBean.getId());
q.setInteger("studyId", currentStudy.getId());
return (ArrayList<RuleSetBean>) q.list();
}
public RuleSetBean findByExpression(RuleSetBean ruleSet) {
String query = "from " + getDomainClassName() + " ruleSet where ruleSet.originalTarget.value = :value AND ruleSet.originalTarget.context = :context ";
org.hibernate.Query q = getCurrentSession().createQuery(query);
q.setString("value", ruleSet.getTarget().getValue());
q.setParameter("context", ruleSet.getTarget().getContext());
return (RuleSetBean) q.uniqueResult();
}
public RuleSetBean findByExpressionAndStudy(RuleSetBean ruleSet, Integer studyId) {
String query = "from " + getDomainClassName() + " ruleSet where ruleSet.originalTarget.value = :value " +
"AND ruleSet.originalTarget.context = :context " +
"AND ruleSet.studyId = :studyId ";
org.hibernate.Query q = getCurrentSession().createQuery(query);
q.setString("value", ruleSet.getTarget().getValue());
q.setParameter("context", ruleSet.getTarget().getContext());
q.setInteger("studyId", studyId);
return (RuleSetBean) q.uniqueResult();
}
public Long getCountByStudy(StudyBean currentStudy) {
String query = "select count(*) from " + getDomainClassName() + " ruleSet where ruleSet.studyId = :studyId and ruleSet.status = :status ";
org.hibernate.Query q = getCurrentSession().createQuery(query);
q.setInteger("studyId", currentStudy.getId());
q.setParameter("status", org.akaza.openclinica.domain.Status.AVAILABLE);
return (Long) q.uniqueResult();
}
public ArrayList<RuleSetBean> findAllByStudyEventDef(StudyEventDefinitionBean sed){
String query = "from " + getDomainClassName() + " ruleSet where ruleSet.studyEventDefinitionId = :studyEventDefId ";
org.hibernate.Query q = getCurrentSession().createQuery(query);
q.setInteger("studyEventDefId", sed.getId());
return (ArrayList<RuleSetBean>) q.list();
}
public ArrayList<RuleSetBean> findAllEventActions(StudyBean currentStudy){
String query = "from " + getDomainClassName() + " ruleSet where ruleSet.originalTarget.value LIKE '%.STARTDATE%' or ruleSet.originalTarget.value LIKE '%.STATUS%' and ruleSet.studyId = :studyId ";
org.hibernate.Query q = getCurrentSession().createQuery(query);
q.setInteger("studyId", currentStudy.getId());
return (ArrayList<RuleSetBean>) q.list();
}
@Transactional
public ArrayList<RuleSetBean> findAllRunOnSchedules(Boolean shedule){
String query = "from " + getDomainClassName() + " ruleSet where ruleSet.runSchedule = :shedule";
org.hibernate.Query q = getCurrentSession().createQuery(query);
q.setBoolean("shedule", shedule);
return (ArrayList<RuleSetBean>) q.list();
}
@Transactional
public ArrayList<RuleSetBean> findAllByStudyEventDefIdWhereItemIsNull(Integer studyEventDefId){
String query = "from " + getDomainClassName() + " ruleSet where ruleSet.studyEventDefinitionId = :studyEventDefId and ruleSet.itemId is null";
org.hibernate.Query q = getCurrentSession().createQuery(query);
q.setInteger("studyEventDefId", studyEventDefId);
return (ArrayList<RuleSetBean>) q.list();
}
}