/** * 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.ArrayList; import java.util.Collection; import java.util.Date; import java.util.List; import java.util.Map; import org.hibernate.Criteria; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.criterion.MatchMode; import org.hibernate.criterion.Order; import org.hibernate.criterion.Restrictions; import org.openmrs.Concept; import org.openmrs.Location; import org.openmrs.Patient; import org.openmrs.Visit; import org.openmrs.VisitAttribute; import org.openmrs.VisitAttributeType; import org.openmrs.VisitType; import org.openmrs.api.APIException; import org.openmrs.api.db.DAOException; import org.openmrs.api.db.VisitDAO; /** * Hibernate specific visit related functions This class should not be used directly. All calls * should go through the {@link org.openmrs.api.VisitService} methods. * * @since 1.9 */ public class HibernateVisitDAO implements VisitDAO { private SessionFactory sessionFactory; public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } private Session getCurrentSession() { return sessionFactory.getCurrentSession(); } /** * @see org.openmrs.api.db.VisitDAO#getAllVisitTypes() */ @SuppressWarnings("unchecked") public List<VisitType> getAllVisitTypes() throws APIException { return getCurrentSession().createCriteria(VisitType.class).list(); } /** * @see org.openmrs.api.db.VisitDAO#getVisitType(java.lang.Integer) */ public VisitType getVisitType(Integer visitTypeId) { return (VisitType) sessionFactory.getCurrentSession().get(VisitType.class, visitTypeId); } /** * @see org.openmrs.api.db.VisitDAO#getVisitTypeByUuid(java.lang.String) */ public VisitType getVisitTypeByUuid(String uuid) { return (VisitType) sessionFactory.getCurrentSession().createQuery("from VisitType vt where vt.uuid = :uuid") .setString("uuid", uuid).uniqueResult(); } /** * @see org.openmrs.api.db.VisitDAO#getVisitTypes(java.lang.String) */ @SuppressWarnings("unchecked") public List<VisitType> getVisitTypes(String fuzzySearchPhrase) { Criteria criteria = sessionFactory.getCurrentSession().createCriteria(VisitType.class); criteria.add(Restrictions.ilike("name", fuzzySearchPhrase, MatchMode.ANYWHERE)); criteria.addOrder(Order.asc("name")); return criteria.list(); } /** * @see org.openmrs.api.db.VisitDAO#saveVisitType(org.openmrs.VisitType) */ public VisitType saveVisitType(VisitType visitType) { sessionFactory.getCurrentSession().saveOrUpdate(visitType); return visitType; } /** * @see org.openmrs.api.db.VisitDAO#purgeVisitType(org.openmrs.VisitType) */ public void purgeVisitType(VisitType visitType) { sessionFactory.getCurrentSession().delete(visitType); } /** * @see org.openmrs.api.db.VisitDAO#getVisit(java.lang.Integer) */ @Override public Visit getVisit(Integer visitId) throws DAOException { return (Visit) getCurrentSession().get(Visit.class, visitId); } /** * @see org.openmrs.api.db.VisitDAO#getVisitByUuid(java.lang.String) */ @Override public Visit getVisitByUuid(String uuid) throws DAOException { return (Visit) getCurrentSession().createQuery("from Visit v where v.uuid = :uuid").setString("uuid", uuid) .uniqueResult(); } /** * @see org.openmrs.api.db.VisitDAO#saveVisit(org.openmrs.Visit) */ @Override public Visit saveVisit(Visit visit) throws DAOException { getCurrentSession().saveOrUpdate(visit); return visit; } /** * @see org.openmrs.api.db.VisitDAO#deleteVisit(org.openmrs.Visit) */ @Override public void deleteVisit(Visit visit) throws DAOException { getCurrentSession().delete(visit); } /** * @see org.openmrs.api.db.VisitDAO#getVisits(java.util.Collection, java.util.Collection, * java.util.Collection, java.util.Collection, java.util.Date, java.util.Date, * java.util.Date, java.util.Date, boolean) */ @SuppressWarnings("unchecked") @Override public List<Visit> getVisits(Collection<VisitType> visitTypes, Collection<Patient> patients, Collection<Location> locations, Collection<Concept> indications, Date minStartDatetime, Date maxStartDatetime, Date minEndDatetime, Date maxEndDatetime, Map<VisitAttributeType, String> serializedAttributeValues, boolean includeInactive, boolean includeVoided) throws DAOException { Criteria criteria = getCurrentSession().createCriteria(Visit.class); if (visitTypes != null) criteria.add(Restrictions.in("visitType", visitTypes)); if (patients != null) criteria.add(Restrictions.in("patient", patients)); if (locations != null) criteria.add(Restrictions.in("location", locations)); if (indications != null) criteria.add(Restrictions.in("indication", indications)); if (minStartDatetime != null) criteria.add(Restrictions.ge("startDatetime", minStartDatetime)); if (maxStartDatetime != null) criteria.add(Restrictions.le("startDatetime", maxStartDatetime)); //active visits have null end date, so it doesn't make sense to search against it if include inactive it set to false if (!includeInactive) criteria.add(Restrictions.isNull("stopDatetime")); else { if (minEndDatetime != null) criteria.add(Restrictions.ge("stopDatetime", minEndDatetime)); if (maxEndDatetime != null) criteria.add(Restrictions.le("stopDatetime", maxEndDatetime)); } if (!includeVoided) criteria.add(Restrictions.eq("voided", false)); if (serializedAttributeValues == null) return criteria.list(); List<Visit> ret = new ArrayList<Visit>(); for (Visit visit : (List<Visit>) criteria.list()) { boolean allMatch = true; for (Map.Entry<VisitAttributeType, String> e : serializedAttributeValues.entrySet()) { boolean match = false; for (VisitAttribute attr : visit.getActiveAttributes(e.getKey())) { if (attr.getSerializedValue().equals(e.getValue())) { match = true; break; } } if (!match) { allMatch = false; break; } } if (allMatch) ret.add(visit); } return ret; } /** * @see org.openmrs.api.db.VisitDAO#getAllVisitAttributeTypes() */ @SuppressWarnings("unchecked") @Override public List<VisitAttributeType> getAllVisitAttributeTypes() { return getCurrentSession().createCriteria(VisitAttributeType.class).list(); } /** * @see org.openmrs.api.db.VisitDAO#getVisitAttributeType(java.lang.Integer) */ @Override public VisitAttributeType getVisitAttributeType(Integer id) { return (VisitAttributeType) getCurrentSession().get(VisitAttributeType.class, id); } /** * @see org.openmrs.api.db.VisitDAO#getVisitAttributeTypeByUuid(java.lang.String) */ @Override public VisitAttributeType getVisitAttributeTypeByUuid(String uuid) { return (VisitAttributeType) getCurrentSession().createCriteria(VisitAttributeType.class).add( Restrictions.eq("uuid", uuid)).uniqueResult(); } /** * @see org.openmrs.api.db.VisitDAO#saveVisitAttributeType(org.openmrs.VisitAttributeType) */ @Override public VisitAttributeType saveVisitAttributeType(VisitAttributeType visitAttributeType) { getCurrentSession().saveOrUpdate(visitAttributeType); return visitAttributeType; } /** * @see org.openmrs.api.db.VisitDAO#deleteVisitAttributeType(org.openmrs.VisitAttributeType) */ @Override public void deleteVisitAttributeType(VisitAttributeType visitAttributeType) { getCurrentSession().delete(visitAttributeType); } /** * @see org.openmrs.api.db.VisitDAO#getVisitAttributeByUuid(java.lang.String) */ @Override public VisitAttribute getVisitAttributeByUuid(String uuid) { return (VisitAttribute) getCurrentSession().createCriteria(VisitAttribute.class).add(Restrictions.eq("uuid", uuid)) .uniqueResult(); } }