/**
* This Source Code Form is subject to the terms of the Mozilla Public License,
* v. 2.0. If a copy of the MPL was not distributed with this file, You can
* obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under
* the terms of the Healthcare Disclaimer located at http://openmrs.org/license.
*
* Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS
* graphic logo is a trademark of OpenMRS Inc.
*/
package org.openmrs.api.db.hibernate;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.hibernate.type.StringType;
import org.openmrs.Person;
import org.openmrs.PersonAddress;
import org.openmrs.PersonAttribute;
import org.openmrs.PersonAttributeType;
import org.openmrs.PersonName;
import org.openmrs.Relationship;
import org.openmrs.RelationshipType;
import org.openmrs.api.context.Context;
import org.openmrs.api.db.DAOException;
import org.openmrs.api.db.PersonDAO;
import org.openmrs.api.db.hibernate.search.LuceneQuery;
import org.openmrs.collection.ListPart;
import org.openmrs.person.PersonMergeLog;
import org.openmrs.util.OpenmrsConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Hibernate specific Person database methods. <br>
* <br>
* This class should not be used directly. All database calls should go through the Service layer. <br>
* <br>
* Proper use: <code>
* PersonService ps = Context.getPersonService();
* ps.getPeople("name", false);
* </code>
*
* @see org.openmrs.api.db.PersonDAO
* @see org.openmrs.api.PersonService
* @see org.openmrs.api.context.Context
*/
public class HibernatePersonDAO implements PersonDAO {
protected final static Logger log = LoggerFactory.getLogger(HibernatePersonDAO.class);
/**
* Hibernate session factory
*/
private SessionFactory sessionFactory;
/**
* Set session factory
*
* @param sessionFactory
*/
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
/**
* @see org.openmrs.api.PersonService#getSimilarPeople(java.lang.String, java.lang.Integer,
* java.lang.String, java.lang.String)
* @see org.openmrs.api.db.PersonDAO#getSimilarPeople(String name, Integer birthyear, String
* gender)
*/
@Override
@SuppressWarnings("unchecked")
public Set<Person> getSimilarPeople(String name, Integer birthyear, String gender) throws DAOException {
if (birthyear == null) {
birthyear = 0;
}
Set<Person> people = new LinkedHashSet<Person>();
name = name.replaceAll(" ", " ");
name = name.replace(", ", " ");
String[] names = name.split(" ");
StringBuilder q = new StringBuilder(
"select p from Person p left join p.names as pname where p.personVoided = false and pname.voided = false and ");
if (names.length == 1) {
q.append("(").append(" soundex(pname.givenName) = soundex(:n1)").append(
" or soundex(pname.middleName) = soundex(:n1)").append(" or soundex(pname.familyName) = soundex(:n1) ")
.append(" or soundex(pname.familyName2) = soundex(:n1) ").append(")");
} else if (names.length == 2) {
q.append("(").append(" case").append(" when pname.givenName is null then 1").append(
" when pname.givenName = '' then 1").append(" when soundex(pname.givenName) = soundex(:n1) then 4")
.append(" when soundex(pname.givenName) = soundex(:n2) then 3").append(" else 0 ").append(" end")
.append(" + ").append(" case").append(" when pname.middleName is null then 1").append(
" when pname.middleName = '' then 1").append(
" when soundex(pname.middleName) = soundex(:n1) then 3").append(
" when soundex(pname.middleName) = soundex(:n2) then 4").append(" else 0 ").append(" end").append(
" + ").append(" case").append(" when pname.familyName is null then 1").append(
" when pname.familyName = '' then 1").append(
" when soundex(pname.familyName) = soundex(:n1) then 3").append(
" when soundex(pname.familyName) = soundex(:n2) then 4").append(" else 0 ").append(" end").append(
" +").append(" case").append(" when pname.familyName2 is null then 1").append(
" when pname.familyName2 = '' then 1").append(
" when soundex(pname.familyName2) = soundex(:n1) then 3").append(
" when soundex(pname.familyName2) = soundex(:n2) then 4").append(" else 0 ").append(" end")
.append(") > 6");
} else if (names.length == 3) {
q.append("(").append(" case").append(" when pname.givenName is null then 0").append(
" when soundex(pname.givenName) = soundex(:n1) then 3").append(
" when soundex(pname.givenName) = soundex(:n2) then 2").append(
" when soundex(pname.givenName) = soundex(:n3) then 1").append(" else 0 ").append(" end").append(" + ")
.append(" case").append(" when pname.middleName is null then 0").append(
" when soundex(pname.middleName) = soundex(:n1) then 2").append(
" when soundex(pname.middleName) = soundex(:n2) then 3").append(
" when soundex(pname.middleName) = soundex(:n3) then 1").append(" else 0").append(" end").append(
" + ").append(" case").append(" when pname.familyName is null then 0").append(
" when soundex(pname.familyName) = soundex(:n1) then 1").append(
" when soundex(pname.familyName) = soundex(:n2) then 2").append(
" when soundex(pname.familyName) = soundex(:n3) then 3").append(" else 0").append(" end").append(
" +").append(" case").append(" when pname.familyName2 is null then 0").append(
" when soundex(pname.familyName2) = soundex(:n1) then 1").append(
" when soundex(pname.familyName2) = soundex(:n2) then 2").append(
" when soundex(pname.familyName2) = soundex(:n3) then 3").append(" else 0").append(" end").append(
") >= 5");
} else {
// This is simply an alternative method of name matching which scales better
// for large names, although it is hard to imagine getting names with more than
// six or so tokens. This can be easily updated to attain more desirable
// results; it is just a working alternative to throwing an exception.
q.append("(").append(" case").append(" when pname.givenName is null then 0");
for (int i = 0; i < names.length; i++) {
q.append(" when soundex(pname.givenName) = soundex(:n").append(i + 1).append(") then 1");
}
q.append(" else 0").append(" end").append(")").append("+").append("(").append(" case").append(
" when pname.middleName is null then 0");
for (int i = 0; i < names.length; i++) {
q.append(" when soundex(pname.middleName) = soundex(:n").append(i + 1).append(") then 1");
}
q.append(" else 0").append(" end").append(")").append("+").append("(").append(" case").append(
" when pname.familyName is null then 0");
for (int i = 0; i < names.length; i++) {
q.append(" when soundex(pname.familyName) = soundex(:n").append(i + 1).append(") then 1");
}
q.append(" else 0").append(" end").append(")").append("+").append("(").append(" case").append(
" when pname.familyName2 is null then 0");
for (int i = 0; i < names.length; i++) {
q.append(" when soundex(pname.familyName2) = soundex(:n").append(i + 1).append(") then 1");
}
// if most of the names have at least a hit somewhere
q.append(" else 0").append(" end").append(") >= ").append((int) (names.length * .75));
}
String birthdayMatch = " (year(p.birthdate) between " + (birthyear - 1) + " and " + (birthyear + 1)
+ " or p.birthdate is null) ";
String genderMatch = " (p.gender = :gender or p.gender = '') ";
if (birthyear != 0 && gender != null) {
q.append(" and (" + birthdayMatch + "and " + genderMatch + ") ");
} else if (birthyear != 0) {
q.append(" and " + birthdayMatch);
} else if (gender != null) {
q.append(" and " + genderMatch);
}
q.append(" order by pname.givenName asc,").append(" pname.middleName asc,").append(" pname.familyName asc,").append(
" pname.familyName2 asc");
String qStr = q.toString();
Query query = sessionFactory.getCurrentSession().createQuery(qStr);
for (int nameIndex = 0; nameIndex < names.length; nameIndex++) {
query.setString("n" + (nameIndex + 1), names[nameIndex]);
}
if (qStr.contains(":gender")) {
query.setString("gender", gender);
}
people.addAll(query.list());
return people;
}
/**
* @see org.openmrs.api.db.PersonDAO#getPeople(java.lang.String, java.lang.Boolean)
* @should get no one by null
* @should get every one by empty string
* @should get no one by non-existing attribute
* @should get no one by non-searchable attribute
* @should get no one by voided attribute
* @should get one person by attribute
* @should get one person by random case attribute
* @should get one person by searching for a mix of attribute and voided attribute
* @should get multiple people by single attribute
* @should get multiple people by multiple attributes
* @should get no one by non-existing name
* @should get one person by name
* @should get one person by random case name
* @should get multiple people by single name
* @should get multiple people by multiple names
* @should get no one by non-existing name and non-existing attribute
* @should get no one by non-existing name and non-searchable attribute
* @should get no one by non-existing name and voided attribute
* @should get one person by name and attribute
* @should get one person by name and voided attribute
* @should get multiple people by name and attribute
* @should get one person by given name
* @should get multiple people by given name
* @should get one person by middle name
* @should get multiple people by middle name
* @should get one person by family name
* @should get multiple people by family name
* @should get one person by family name2
* @should get multiple people by family name2
* @should get one person by multiple name parts
* @should get multiple people by multiple name parts
* @should get no one by voided name
* @should not get voided person
* @should not get dead person
* @should get single dead person
* @should get multiple dead people
*/
@Override
@SuppressWarnings("unchecked")
public List<Person> getPeople(String searchString, Boolean dead, Boolean voided) {
if (searchString == null) {
return new ArrayList<>();
}
int maxResults = HibernatePersonDAO.getMaximumSearchResults();
boolean includeVoided = (voided != null) ? voided : false;
if (StringUtils.isBlank(searchString)) {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Person.class);
if (dead != null) {
criteria.add(Restrictions.eq("dead", dead));
}
if (!includeVoided) {
criteria.add(Restrictions.eq("personVoided", false));
}
criteria.setMaxResults(maxResults);
return criteria.list();
}
String query = LuceneQuery.escapeQuery(searchString);
PersonLuceneQuery personLuceneQuery = new PersonLuceneQuery(sessionFactory);
LuceneQuery<PersonName> nameQuery = personLuceneQuery.getPersonNameQueryWithOrParser(query, includeVoided);
if (dead != null) {
nameQuery.include("person.dead", dead);
}
List<Person> people = new ArrayList<>();
ListPart<Object[]> names = nameQuery.listPartProjection(0, maxResults, "person.personId");
names.getList().stream().forEach(name -> people.add(getPerson((Integer) name[0])));
LuceneQuery<PersonAttribute> attributeQuery = personLuceneQuery.getPersonAttributeQueryWithOrParser(query, includeVoided, nameQuery);
ListPart<Object[]> attributes = attributeQuery.listPartProjection(0, maxResults, "person.personId");
attributes.getList().stream().forEach(attribute -> people.add(getPerson((Integer) attribute[0])));
return people;
}
@Override
public List<Person> getPeople(String searchString, Boolean dead) {
return getPeople(searchString, dead, null);
}
/**
* Fetch the max results value from the global properties table
*
* @return Integer value for the person search max results global property
*/
public static Integer getMaximumSearchResults() {
try {
return Integer.valueOf(Context.getAdministrationService().getGlobalProperty(
OpenmrsConstants.GLOBAL_PROPERTY_PERSON_SEARCH_MAX_RESULTS,
String.valueOf(OpenmrsConstants.GLOBAL_PROPERTY_PERSON_SEARCH_MAX_RESULTS_DEFAULT_VALUE)));
}
catch (Exception e) {
log.warn("Unable to convert the global property " + OpenmrsConstants.GLOBAL_PROPERTY_PERSON_SEARCH_MAX_RESULTS
+ "to a valid integer. Returning the default "
+ OpenmrsConstants.GLOBAL_PROPERTY_PERSON_SEARCH_MAX_RESULTS_DEFAULT_VALUE);
}
return OpenmrsConstants.GLOBAL_PROPERTY_PERSON_SEARCH_MAX_RESULTS_DEFAULT_VALUE;
}
/**
* @see org.openmrs.api.PersonService#getPerson(java.lang.Integer)
* @see org.openmrs.api.db.PersonDAO#getPerson(java.lang.Integer)
*/
@Override
public Person getPerson(Integer personId) {
return (Person) sessionFactory.getCurrentSession().get(Person.class, personId);
}
/**
* @see org.openmrs.api.PersonService#deletePersonAttributeType(org.openmrs.PersonAttributeType)
* @see org.openmrs.api.db.PersonDAO#deletePersonAttributeType(org.openmrs.PersonAttributeType)
*/
@Override
public void deletePersonAttributeType(PersonAttributeType type) {
sessionFactory.getCurrentSession().delete(type);
}
/**
* @see org.openmrs.api.PersonService#savePersonAttributeType(org.openmrs.PersonAttributeType)
* @see org.openmrs.api.db.PersonDAO#savePersonAttributeType(org.openmrs.PersonAttributeType)
*/
@Override
public PersonAttributeType savePersonAttributeType(PersonAttributeType type) {
sessionFactory.getCurrentSession().saveOrUpdate(type);
return type;
}
/**
* @see org.openmrs.api.PersonService#getPersonAttributeType(java.lang.Integer)
* @see org.openmrs.api.db.PersonDAO#getPersonAttributeType(java.lang.Integer)
*/
@Override
public PersonAttributeType getPersonAttributeType(Integer typeId) {
return (PersonAttributeType) sessionFactory.getCurrentSession().get(PersonAttributeType.class, typeId);
}
/**
* @see org.openmrs.api.PersonService#getPersonAttribute(java.lang.Integer)
* @see org.openmrs.api.db.PersonDAO#getPersonAttribute(java.lang.Integer)
*/
@Override
public PersonAttribute getPersonAttribute(Integer id) {
return (PersonAttribute) sessionFactory.getCurrentSession().get(PersonAttribute.class, id);
}
/**
* @see org.openmrs.api.PersonService#getAllPersonAttributeTypes(boolean)
* @see org.openmrs.api.db.PersonDAO#getAllPersonAttributeTypes(boolean)
*/
@Override
@SuppressWarnings("unchecked")
public List<PersonAttributeType> getAllPersonAttributeTypes(boolean includeRetired) throws DAOException {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(PersonAttributeType.class, "r");
if (!includeRetired) {
criteria.add(Restrictions.eq("retired", false));
}
criteria.addOrder(Order.asc("sortWeight"));
return criteria.list();
}
/**
* @see org.openmrs.api.db.PersonDAO#getPersonAttributeTypes(java.lang.String, java.lang.String,
* java.lang.Integer, java.lang.Boolean)
*/
@Override
// TODO - PersonServiceTest fails here
@SuppressWarnings("unchecked")
public List<PersonAttributeType> getPersonAttributeTypes(String exactName, String format, Integer foreignKey,
Boolean searchable) throws DAOException {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(PersonAttributeType.class, "r");
if (exactName != null) {
criteria.add(Restrictions.eq("name", exactName));
}
if (format != null) {
criteria.add(Restrictions.eq("format", format));
}
if (foreignKey != null) {
criteria.add(Restrictions.eq("foreignKey", foreignKey));
}
if (searchable != null) {
criteria.add(Restrictions.eq("searchable", searchable));
}
return criteria.list();
}
/**
* @see org.openmrs.api.PersonService#getRelationship(java.lang.Integer)
* @see org.openmrs.api.db.PersonDAO#getRelationship(java.lang.Integer)
*/
@Override
public Relationship getRelationship(Integer relationshipId) throws DAOException {
Relationship relationship = (Relationship) sessionFactory.getCurrentSession()
.get(Relationship.class, relationshipId);
return relationship;
}
/**
* @see org.openmrs.api.PersonService#getAllRelationships(boolean)
* @see org.openmrs.api.db.PersonDAO#getAllRelationships(boolean)
*/
@Override
@SuppressWarnings("unchecked")
public List<Relationship> getAllRelationships(boolean includeVoided) throws DAOException {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Relationship.class, "r");
if (!includeVoided) {
criteria.add(Restrictions.eq("voided", false));
}
return criteria.list();
}
/**
* @see org.openmrs.api.PersonService#getRelationships(org.openmrs.Person, org.openmrs.Person,
* org.openmrs.RelationshipType)
* @see org.openmrs.api.db.PersonDAO#getRelationships(org.openmrs.Person, org.openmrs.Person,
* org.openmrs.RelationshipType)
*/
@Override
@SuppressWarnings("unchecked")
public List<Relationship> getRelationships(Person fromPerson, Person toPerson, RelationshipType relType) {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Relationship.class, "r");
if (fromPerson != null) {
criteria.add(Restrictions.eq("personA", fromPerson));
}
if (toPerson != null) {
criteria.add(Restrictions.eq("personB", toPerson));
}
if (relType != null) {
criteria.add(Restrictions.eq("relationshipType", relType));
}
criteria.add(Restrictions.eq("voided", false));
return criteria.list();
}
/**
* @see org.openmrs.api.PersonService#getRelationships(org.openmrs.Person, org.openmrs.Person,
* org.openmrs.RelationshipType, java.util.Date, java.util.Date)
* @see org.openmrs.api.db.PersonDAO#getRelationships(org.openmrs.Person, org.openmrs.Person,
* org.openmrs.RelationshipType, java.util.Date, java.util.Date)
*/
@Override
@SuppressWarnings("unchecked")
public List<Relationship> getRelationships(Person fromPerson, Person toPerson, RelationshipType relType,
Date startEffectiveDate, Date endEffectiveDate) {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Relationship.class, "r");
if (fromPerson != null) {
criteria.add(Restrictions.eq("personA", fromPerson));
}
if (toPerson != null) {
criteria.add(Restrictions.eq("personB", toPerson));
}
if (relType != null) {
criteria.add(Restrictions.eq("relationshipType", relType));
}
if (startEffectiveDate != null) {
criteria.add(Restrictions.disjunction().add(
Restrictions.and(Restrictions.le("startDate", startEffectiveDate), Restrictions.ge("endDate",
startEffectiveDate))).add(
Restrictions.and(Restrictions.le("startDate", startEffectiveDate), Restrictions.isNull("endDate"))).add(
Restrictions.and(Restrictions.isNull("startDate"), Restrictions.ge("endDate", startEffectiveDate))).add(
Restrictions.and(Restrictions.isNull("startDate"), Restrictions.isNull("endDate"))));
}
if (endEffectiveDate != null) {
criteria.add(Restrictions.disjunction().add(
Restrictions.and(Restrictions.le("startDate", endEffectiveDate), Restrictions
.ge("endDate", endEffectiveDate))).add(
Restrictions.and(Restrictions.le("startDate", endEffectiveDate), Restrictions.isNull("endDate"))).add(
Restrictions.and(Restrictions.isNull("startDate"), Restrictions.ge("endDate", endEffectiveDate))).add(
Restrictions.and(Restrictions.isNull("startDate"), Restrictions.isNull("endDate"))));
}
criteria.add(Restrictions.eq("voided", false));
return criteria.list();
}
/**
* @see org.openmrs.api.PersonService#getRelationshipType(java.lang.Integer)
* @see org.openmrs.api.db.PersonDAO#getRelationshipType(java.lang.Integer)
*/
@Override
public RelationshipType getRelationshipType(Integer relationshipTypeId) throws DAOException {
RelationshipType relationshipType = (RelationshipType) sessionFactory.getCurrentSession().get(
RelationshipType.class, relationshipTypeId);
return relationshipType;
}
/**
* @see org.openmrs.api.PersonService#getRelationshipTypes(java.lang.String, java.lang.Boolean)
* @see org.openmrs.api.db.PersonDAO#getRelationshipTypes(java.lang.String, java.lang.Boolean)
*/
@Override
@SuppressWarnings("unchecked")
public List<RelationshipType> getRelationshipTypes(String relationshipTypeName, Boolean preferred) throws DAOException {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(RelationshipType.class);
criteria.add(Restrictions.sqlRestriction("CONCAT(a_Is_To_B, CONCAT('/', b_Is_To_A)) like (?)", relationshipTypeName,
new StringType()));
if (preferred != null) {
criteria.add(Restrictions.eq("preferred", preferred));
}
return criteria.list();
}
/**
* @see org.openmrs.api.PersonService#saveRelationshipType(org.openmrs.RelationshipType)
* @see org.openmrs.api.db.PersonDAO#saveRelationshipType(org.openmrs.RelationshipType)
*/
@Override
public RelationshipType saveRelationshipType(RelationshipType relationshipType) throws DAOException {
sessionFactory.getCurrentSession().saveOrUpdate(relationshipType);
return relationshipType;
}
/**
* @see org.openmrs.api.PersonService#deleteRelationshipType(org.openmrs.RelationshipType)
* @see org.openmrs.api.db.PersonDAO#deleteRelationshipType(org.openmrs.RelationshipType)
*/
@Override
public void deleteRelationshipType(RelationshipType relationshipType) throws DAOException {
sessionFactory.getCurrentSession().delete(relationshipType);
}
/**
* @see org.openmrs.api.PersonService#purgePerson(org.openmrs.Person)
* @see org.openmrs.api.db.PersonDAO#deletePerson(org.openmrs.Person)
*/
@Override
public void deletePerson(Person person) throws DAOException {
HibernatePersonDAO.deletePersonAndAttributes(sessionFactory, person);
}
/**
* @see org.openmrs.api.PersonService#savePerson(org.openmrs.Person)
* @see org.openmrs.api.db.PersonDAO#savePerson(org.openmrs.Person)
*/
@Override
public Person savePerson(Person person) throws DAOException {
sessionFactory.getCurrentSession().saveOrUpdate(person);
return person;
}
/**
* @see org.openmrs.api.PersonService#saveRelationship(org.openmrs.Relationship)
* @see org.openmrs.api.db.PersonDAO#saveRelationship(org.openmrs.Relationship)
*/
@Override
public Relationship saveRelationship(Relationship relationship) throws DAOException {
sessionFactory.getCurrentSession().saveOrUpdate(relationship);
return relationship;
}
/**
* @see org.openmrs.api.PersonService#purgeRelationship(org.openmrs.Relationship)
* @see org.openmrs.api.db.PersonDAO#deleteRelationship(org.openmrs.Relationship)
*/
@Override
public void deleteRelationship(Relationship relationship) throws DAOException {
sessionFactory.getCurrentSession().delete(relationship);
}
/**
* Used by deletePerson, deletePatient, and deleteUser to remove all properties of a person
* before deleting them.
*
* @param sessionFactory the session factory from which to pull the current session
* @param person the person to delete
*/
public static void deletePersonAndAttributes(SessionFactory sessionFactory, Person person) {
// delete properties and fields so hibernate can't complain
for (PersonAddress address : person.getAddresses()) {
if (address.getDateCreated() == null) {
sessionFactory.getCurrentSession().evict(address);
} else {
sessionFactory.getCurrentSession().delete(address);
}
}
person.setAddresses(null);
for (PersonAttribute attribute : person.getAttributes()) {
if (attribute.getDateCreated() == null) {
sessionFactory.getCurrentSession().evict(attribute);
} else {
sessionFactory.getCurrentSession().delete(attribute);
}
}
person.setAttributes(null);
for (PersonName name : person.getNames()) {
if (name.getDateCreated() == null) {
sessionFactory.getCurrentSession().evict(name);
} else {
sessionFactory.getCurrentSession().delete(name);
}
}
person.setNames(null);
// finally, just tell hibernate to delete our object
sessionFactory.getCurrentSession().delete(person);
}
/**
* @see org.openmrs.api.db.PersonDAO#getPersonAttributeTypeByUuid(java.lang.String)
*/
@Override
public PersonAttributeType getPersonAttributeTypeByUuid(String uuid) {
return (PersonAttributeType) sessionFactory.getCurrentSession().createQuery(
"from PersonAttributeType pat where pat.uuid = :uuid").setString("uuid", uuid).uniqueResult();
}
/**
* @see org.openmrs.api.db.PersonDAO#getSavedPersonAttributeTypeName(org.openmrs.PersonAttributeType)
*/
@Override
public String getSavedPersonAttributeTypeName(PersonAttributeType personAttributeType) {
SQLQuery sql = sessionFactory.getCurrentSession().createSQLQuery(
"select name from person_attribute_type where person_attribute_type_id = :personAttributeTypeId");
sql.setInteger("personAttributeTypeId", personAttributeType.getId());
return (String) sql.uniqueResult();
}
/**
* @see org.openmrs.api.db.PersonDAO#getPersonByUuid(java.lang.String)
*/
@Override
public Person getPersonByUuid(String uuid) {
return (Person) sessionFactory.getCurrentSession().createQuery("from Person p where p.uuid = :uuid").setString(
"uuid", uuid).uniqueResult();
}
@Override
public PersonAddress getPersonAddressByUuid(String uuid) {
return (PersonAddress) sessionFactory.getCurrentSession().createQuery("from PersonAddress p where p.uuid = :uuid")
.setString("uuid", uuid).uniqueResult();
}
/**
* @see org.openmrs.api.db.PersonDAO#savePersonMergeLog(PersonMergeLog)
*/
@Override
public PersonMergeLog savePersonMergeLog(PersonMergeLog personMergeLog) throws DAOException {
sessionFactory.getCurrentSession().saveOrUpdate(personMergeLog);
return personMergeLog;
}
/**
* @see org.openmrs.api.db.PersonDAO#getPersonMergeLog(java.lang.Integer)
*/
@Override
public PersonMergeLog getPersonMergeLog(Integer id) throws DAOException {
return (PersonMergeLog) sessionFactory.getCurrentSession().get(PersonMergeLog.class, id);
}
/**
* @see org.openmrs.api.db.PersonDAO#getPersonMergeLogByUuid(String)
*/
@Override
public PersonMergeLog getPersonMergeLogByUuid(String uuid) throws DAOException {
return (PersonMergeLog) sessionFactory.getCurrentSession().createQuery("from PersonMergeLog p where p.uuid = :uuid")
.setString("uuid", uuid).uniqueResult();
}
/**
* @see org.openmrs.api.db.PersonDAO#getWinningPersonMergeLogs(org.openmrs.Person)
*/
@Override
@SuppressWarnings("unchecked")
public List<PersonMergeLog> getWinningPersonMergeLogs(Person person) throws DAOException {
return (List<PersonMergeLog>) sessionFactory.getCurrentSession().createQuery(
"from PersonMergeLog p where p.winner.id = :winnerId").setInteger("winnerId", person.getId()).list();
}
/**
* @see org.openmrs.api.db.PersonDAO#getLosingPersonMergeLogs(org.openmrs.Person)
*/
@Override
public PersonMergeLog getLosingPersonMergeLogs(Person person) throws DAOException {
return (PersonMergeLog) sessionFactory.getCurrentSession().createQuery(
"from PersonMergeLog p where p.loser.id = :loserId").setInteger("loserId", person.getId()).uniqueResult();
}
/**
* @see org.openmrs.api.db.PersonDAO#getAllPersonMergeLogs()
*/
@Override
@SuppressWarnings("unchecked")
public List<PersonMergeLog> getAllPersonMergeLogs() throws DAOException {
return (List<PersonMergeLog>) sessionFactory.getCurrentSession().createQuery("from PersonMergeLog p").list();
}
@Override
public PersonAttribute getPersonAttributeByUuid(String uuid) {
return (PersonAttribute) sessionFactory.getCurrentSession().createQuery(
"from PersonAttribute p where p.uuid = :uuid").setString("uuid", uuid).uniqueResult();
}
/**
* @see org.openmrs.api.db.PersonDAO#getPersonName(Integer)
*/
@Override
public PersonName getPersonName(Integer personNameId) {
return (PersonName) sessionFactory.getCurrentSession().get(PersonName.class, personNameId);
}
/**
* @see org.openmrs.api.db.PersonDAO#getPersonNameByUuid(String)
*/
@Override
public PersonName getPersonNameByUuid(String uuid) {
return (PersonName) sessionFactory.getCurrentSession().createQuery("from PersonName p where p.uuid = :uuid")
.setString("uuid", uuid).uniqueResult();
}
/**
* @see org.openmrs.api.db.PersonDAO#getRelationshipByUuid(java.lang.String)
*/
@Override
public Relationship getRelationshipByUuid(String uuid) {
return (Relationship) sessionFactory.getCurrentSession().createQuery("from Relationship r where r.uuid = :uuid")
.setString("uuid", uuid).uniqueResult();
}
/**
* @see org.openmrs.api.db.PersonDAO#getRelationshipTypeByUuid(java.lang.String)
*/
@Override
public RelationshipType getRelationshipTypeByUuid(String uuid) {
return (RelationshipType) sessionFactory.getCurrentSession().createQuery(
"from RelationshipType rt where rt.uuid = :uuid").setString("uuid", uuid).uniqueResult();
}
/**
* @see org.openmrs.api.db.PersonDAO#getAllRelationshipTypes(boolean)
*/
@Override
@SuppressWarnings("unchecked")
public List<RelationshipType> getAllRelationshipTypes(boolean includeRetired) {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(RelationshipType.class);
criteria.addOrder(Order.asc("weight"));
if (!includeRetired) {
criteria.add(Restrictions.eq("retired", false));
}
return criteria.list();
}
/**
* @see org.openmrs.api.PersonService#savePersonName(org.openmrs.PersonName)
* @see org.openmrs.api.db.PersonDAO#savePersonName(org.openmrs.PersonName)
*/
@Override
public PersonName savePersonName(PersonName personName) {
sessionFactory.getCurrentSession().saveOrUpdate(personName);
return personName;
}
/**
* @see org.openmrs.api.PersonService#savePersonAddress(org.openmrs.PersonAddress)
* @see org.openmrs.api.db.PersonDAO#savePersonAddress(org.openmrs.PersonAddress)
*/
@Override
public PersonAddress savePersonAddress(PersonAddress personAddress) {
sessionFactory.getCurrentSession().saveOrUpdate(personAddress);
return personAddress;
}
}