/**
* The contents of this file are subject to the OpenMRS Public License
* Version 1.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://license.openmrs.org
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations
* under the License.
*
* Copyright (C) OpenMRS, LLC. All Rights Reserved.
*/
package org.openmrs.api.db.hibernate;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.openmrs.Cohort;
import org.openmrs.Concept;
import org.openmrs.ConceptStateConversion;
import org.openmrs.Patient;
import org.openmrs.PatientProgram;
import org.openmrs.PatientState;
import org.openmrs.Program;
import org.openmrs.ProgramWorkflow;
import org.openmrs.ProgramWorkflowState;
import org.openmrs.api.db.DAOException;
import org.openmrs.api.db.ProgramWorkflowDAO;
/**
* Hibernate specific ProgramWorkflow related functions.<br/>
* <br/>
* This class should not be used directly. All calls should go through the
* {@link org.openmrs.api.ProgramWorkflowService} methods.
*
* @see org.openmrs.api.db.ProgramWorkflowDAO
* @see org.openmrs.api.ProgramWorkflowService
*/
public class HibernateProgramWorkflowDAO implements ProgramWorkflowDAO {
protected final Log log = LogFactory.getLog(getClass());
private SessionFactory sessionFactory;
public HibernateProgramWorkflowDAO() {
}
/**
* Hibernate Session Factory
*
* @param sessionFactory
*/
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
// **************************
// PROGRAM
// **************************
/**
* @see org.openmrs.api.db.ProgramWorkflowDAO#saveProgram(org.openmrs.Program)
*/
public Program saveProgram(Program program) throws DAOException {
sessionFactory.getCurrentSession().saveOrUpdate(program);
return program;
}
/**
* @see org.openmrs.api.db.ProgramWorkflowDAO#getProgram(java.lang.Integer)
*/
public Program getProgram(Integer programId) throws DAOException {
return (Program) sessionFactory.getCurrentSession().get(Program.class, programId);
}
/**
* @see org.openmrs.api.db.ProgramWorkflowDAO#getAllPrograms(boolean)
*/
@SuppressWarnings("unchecked")
public List<Program> getAllPrograms(boolean includeRetired) throws DAOException {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Program.class);
if (includeRetired == false) {
criteria.add(Expression.eq("retired", false));
}
return criteria.list();
}
/**
* @see org.openmrs.api.db.ProgramWorkflowDAO#findPrograms(java.lang.String)
*/
@SuppressWarnings("unchecked")
public List<Program> findPrograms(String nameFragment) throws DAOException {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Program.class, "program");
criteria.add(Expression.ilike("name", nameFragment, MatchMode.ANYWHERE));
criteria.addOrder(Order.asc("name"));
return criteria.list();
}
/**
* @see org.openmrs.api.db.ProgramWorkflowDAO#deleteProgram(org.openmrs.Program)
*/
public void deleteProgram(Program program) throws DAOException {
sessionFactory.getCurrentSession().delete(program);
}
// **************************
// PATIENT PROGRAM
// **************************
/**
* @see org.openmrs.api.db.ProgramWorkflowDAO#savePatientProgram(org.openmrs.PatientProgram)
*/
public PatientProgram savePatientProgram(PatientProgram patientProgram) throws DAOException {
if (patientProgram.getPatientProgramId() == null) {
sessionFactory.getCurrentSession().save(patientProgram);
} else {
sessionFactory.getCurrentSession().merge(patientProgram);
}
return patientProgram;
}
/**
* @see org.openmrs.api.db.ProgramWorkflowDAO#getPatientProgram(java.lang.Integer)
*/
public PatientProgram getPatientProgram(Integer patientProgramId) throws DAOException {
return (PatientProgram) sessionFactory.getCurrentSession().get(PatientProgram.class, patientProgramId);
}
/**
* @see org.openmrs.api.db.ProgramWorkflowDAO#getPatientPrograms(Patient, Program, Date, Date,
* Date, Date, boolean)
*/
@SuppressWarnings("unchecked")
public List<PatientProgram> getPatientPrograms(Patient patient, Program program, Date minEnrollmentDate,
Date maxEnrollmentDate, Date minCompletionDate, Date maxCompletionDate,
boolean includeVoided) throws DAOException {
Criteria crit = sessionFactory.getCurrentSession().createCriteria(PatientProgram.class);
if (patient != null) {
crit.add(Expression.eq("patient", patient));
}
if (program != null) {
crit.add(Expression.eq("program", program));
}
if (minEnrollmentDate != null) {
crit.add(Expression.ge("dateEnrolled", minEnrollmentDate));
}
if (maxEnrollmentDate != null) {
crit.add(Expression.le("dateEnrolled", maxEnrollmentDate));
}
if (minCompletionDate != null) {
crit.add(Expression.or(Expression.isNull("dateCompleted"), Expression.ge("dateCompleted", minCompletionDate)));
}
if (maxCompletionDate != null) {
crit.add(Expression.le("dateCompleted", maxCompletionDate));
}
if (!includeVoided) {
crit.add(Expression.eq("voided", false));
}
return crit.list();
}
/**
* TODO: refactor this
*
* @see org.openmrs.api.db.ProgramWorkflowDAO#getPatientPrograms(org.openmrs.Cohort,
* java.util.Collection)
*/
@SuppressWarnings("unchecked")
public List<PatientProgram> getPatientPrograms(Cohort cohort, Collection<Program> programs) {
String hql = "from PatientProgram ";
if (cohort != null || programs != null)
hql += "where ";
if (cohort != null)
hql += "patient.patientId in (:patientIds) ";
if (programs != null) {
if (cohort != null)
hql += "and ";
hql += " program in (:programs)";
}
hql += " order by patient.patientId, dateEnrolled";
Query query = sessionFactory.getCurrentSession().createQuery(hql);
if (cohort != null)
query.setParameterList("patientIds", cohort.getMemberIds());
if (programs != null)
query.setParameterList("programs", programs);
return query.list();
}
/**
* @see org.openmrs.api.db.ProgramWorkflowDAO#deletePatientProgram(org.openmrs.PatientProgram)
*/
public void deletePatientProgram(PatientProgram patientProgram) throws DAOException {
sessionFactory.getCurrentSession().delete(patientProgram);
}
/**
* @see org.openmrs.api.db.ProgramWorkflowDAO#saveConceptStateConversion(org.openmrs.ConceptStateConversion)
*/
public ConceptStateConversion saveConceptStateConversion(ConceptStateConversion csc) throws DAOException {
if (csc.getConceptStateConversionId() == null) {
sessionFactory.getCurrentSession().save(csc);
} else {
sessionFactory.getCurrentSession().merge(csc);
}
return csc;
}
/**
* @see org.openmrs.api.db.ProgramWorkflowDAO#getAllConceptStateConversions()
*/
@SuppressWarnings("unchecked")
public List<ConceptStateConversion> getAllConceptStateConversions() throws DAOException {
return sessionFactory.getCurrentSession().createCriteria(ConceptStateConversion.class).list();
}
/**
* @see org.openmrs.api.db.ProgramWorkflowDAO#getConceptStateConversion(java.lang.Integer)
*/
public ConceptStateConversion getConceptStateConversion(Integer conceptStateConversionId) {
return (ConceptStateConversion) sessionFactory.getCurrentSession().get(ConceptStateConversion.class,
conceptStateConversionId);
}
/**
* @see org.openmrs.api.db.ProgramWorkflowDAO#deleteConceptStateConversion(org.openmrs.ConceptStateConversion)
*/
public void deleteConceptStateConversion(ConceptStateConversion csc) {
sessionFactory.getCurrentSession().delete(csc);
}
/**
* @see org.openmrs.api.db.ProgramWorkflowDAO#getConceptStateConversion(org.openmrs.ProgramWorkflow,
* org.openmrs.Concept)
*/
public ConceptStateConversion getConceptStateConversion(ProgramWorkflow workflow, Concept trigger) {
ConceptStateConversion csc = null;
if (workflow != null && trigger != null) {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(ConceptStateConversion.class, "csc");
criteria.add(Expression.eq("csc.programWorkflow", workflow));
criteria.add(Expression.eq("csc.concept", trigger));
csc = (ConceptStateConversion) criteria.uniqueResult();
}
return csc;
}
/**
* @see org.openmrs.api.db.ProgramWorkflowDAO#getConceptStateConversionByUuid(java.lang.String)
*/
public ConceptStateConversion getConceptStateConversionByUuid(String uuid) {
return (ConceptStateConversion) sessionFactory.getCurrentSession().createQuery(
"from ConceptStateConversion csc where csc.uuid = :uuid").setString("uuid", uuid).uniqueResult();
}
/**
* @see org.openmrs.api.db.ProgramWorkflowDAO#getPatientProgramByUuid(java.lang.String)
*/
public PatientProgram getPatientProgramByUuid(String uuid) {
return (PatientProgram) sessionFactory.getCurrentSession().createQuery(
"from PatientProgram pp where pp.uuid = :uuid").setString("uuid", uuid).uniqueResult();
}
/**
* @see org.openmrs.api.db.ProgramWorkflowDAO#getProgramByUuid(java.lang.String)
*/
public Program getProgramByUuid(String uuid) {
return (Program) sessionFactory.getCurrentSession().createQuery("from Program p where p.uuid = :uuid").setString(
"uuid", uuid).uniqueResult();
}
/**
* @see org.openmrs.api.db.ProgramWorkflowDAO#getStateByUuid(java.lang.String)
*/
public ProgramWorkflowState getStateByUuid(String uuid) {
return (ProgramWorkflowState) sessionFactory.getCurrentSession().createQuery(
"from ProgramWorkflowState pws where pws.uuid = :uuid").setString("uuid", uuid).uniqueResult();
}
public PatientState getPatientStateByUuid(String uuid) {
return (PatientState) sessionFactory.getCurrentSession().createQuery("from PatientState pws where pws.uuid = :uuid")
.setString("uuid", uuid).uniqueResult();
}
/**
* @see org.openmrs.api.db.ProgramWorkflowDAO#getWorkflowByUuid(java.lang.String)
*/
public ProgramWorkflow getWorkflowByUuid(String uuid) {
return (ProgramWorkflow) sessionFactory.getCurrentSession().createQuery(
"from ProgramWorkflow pw where pw.uuid = :uuid").setString("uuid", uuid).uniqueResult();
}
}