package info.ozkan.vipera.dao.healthdata;
import info.ozkan.vipera.business.healthdata.HealthDataManagerStatus;
import info.ozkan.vipera.business.healthdata.HealthDataResult;
import info.ozkan.vipera.business.healthdata.HealthDataSearchFilter;
import info.ozkan.vipera.entities.HealthData;
import info.ozkan.vipera.entities.Patient;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
/**
* {@link HealthDataDao} arayüzünün implementasyonu
*
* @author Ömer Özkan
*
*/
public class HealthDataDaoImpl implements HealthDataDao {
/**
* Id ye göre sağlık verisi sorgusu
*/
private static final String JQL_GET_BY_ID =
"from HealthData d join fetch d.patient WHERE d.id = :id";
/**
* Persisence context
*/
private EntityManager em;
public HealthDataResult add(final HealthData healthData) {
em.persist(healthData);
return createSuccessResult();
}
/**
* Başarılı değeri içeren bir sonuç nesnesi üretir
*
* @return
*/
private HealthDataResult createSuccessResult() {
final HealthDataResult result = new HealthDataResult();
result.setStatus(HealthDataManagerStatus.SUCCESS);
return result;
}
/**
* @param entityManager
* the entityManager to set
*/
@PersistenceContext
public void setEntityManager(final EntityManager entityManager) {
em = entityManager;
}
public HealthDataResult find(final HealthDataSearchFilter filter) {
final HealthDataResult result;
final Query query = createQueryFromFilter(filter);
final List<HealthData> list = query.getResultList();
result = createSuccessResult();
result.setHealthDatas(list);
return result;
}
/**
* filtre nesnesinden jpa sorgusu oluşturur
*
* @param filter
* @return
*/
private Query createQueryFromFilter(final HealthDataSearchFilter filter) {
final CriteriaBuilder cb = em.getCriteriaBuilder();
final CriteriaQuery<HealthData> cq = cb.createQuery(HealthData.class);
final Root<HealthData> root = cq.from(HealthData.class);
final List<Predicate> predicates = new ArrayList<Predicate>();
final Patient patient = filter.getPatient();
final Date startDate = filter.getStartDate();
final Date endDate = filter.getEndDate();
if (patient != null) {
predicates.add(cb.equal(root.get("patient"), patient));
}
if (startDate != null && endDate != null) {
predicates.add(cb.between(root.<Date> get("date"), startDate,
endDate));
}
final Predicate[] array = predicates.toArray(new Predicate[0]);
cq.select(root).where(array);
return em.createQuery(cq);
}
public HealthDataResult getById(final Long id) {
HealthDataResult result;
final Query query = em.createQuery(JQL_GET_BY_ID);
query.setParameter("id", id);
final List<HealthData> resultList = query.getResultList();
if (resultList.size() != 0) {
final HealthData data = resultList.get(0);
result = createSuccessResult();
result.setHealthData(data);
} else {
result = new HealthDataResult();
result.setStatus(HealthDataManagerStatus.NOT_FOUND);
}
return result;
}
}