package info.ozkan.vipera.dao.doctorpatient;
import info.ozkan.vipera.business.doctorpatient.DoctorPatientManagerResult;
import info.ozkan.vipera.business.doctorpatient.DoctorPatientManagerStatus;
import info.ozkan.vipera.entities.Doctor;
import info.ozkan.vipera.entities.Patient;
import java.util.List;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
/**
* Hekim hasta ilişkileri için veritabanı işlemi yapan dao sınıfı
*
* @author Ömer Özkan
*
*/
@Named("doctorPatientDao")
public class DoctorPatientDaoImpl implements DoctorPatientDao {
/**
* hastaya göre hekim dönderen jql sorgusu
*/
private static final String JQL_GET_DOCTORS_BY_PATIENT =
"from Doctor d join fetch d.patients p WHERE p.id = :id";
/**
* Hekime göre hasta dönderen jql sorgusu
*/
private static final String JQL_GET_PATIENTS_BY_DOCTOR =
"from Patient p join fetch p.doctors d WHERE d.id = :id";
/**
* EntityManager
*/
private EntityManager em;
public DoctorPatientManagerResult addPatientToDoctor(final Doctor doctor,
final Patient patient) {
assignPatientToDoctor(patient, doctor);
return createSuccessAssignResult(doctor, patient);
}
/**
* Hekime hasta atar
*
* @param patient
* Hekim
* @param doctor
* Hasta
*/
private void assignPatientToDoctor(final Patient patient,
final Doctor doctor) {
final List<Patient> patients = getPatientsByDoctorId(doctor.getId());
patients.add(patient);
doctor.setPatients(patients);
em.merge(doctor);
}
/**
* Başarılı atama sonuç nesnesi oluşturur
*
* @param doctor
* Hekim
* @param patient
* Hasta
* @return
*/
private DoctorPatientManagerResult createSuccessAssignResult(
final Doctor doctor, final Patient patient) {
final DoctorPatientManagerResult result =
new DoctorPatientManagerResult();
result.setStatus(DoctorPatientManagerStatus.SUCCESS);
result.setDoctor(doctor);
result.setPatient(patient);
return result;
}
/**
* Hekime atanan hasta listesini dönderir
*
* @param doctorId
* @return
*/
private List<Patient> getPatientsByDoctorId(final Long doctorId) {
final Query query = em.createQuery(JQL_GET_PATIENTS_BY_DOCTOR);
query.setParameter("id", doctorId);
return query.getResultList();
}
public void loadPatientsByDoctor(final Doctor doctor) {
final List<Patient> patientList = getPatientsByDoctorId(doctor.getId());
doctor.setPatients(patientList);
}
/**
* @param em
* the em to set
*/
@PersistenceContext
public void setEntityManager(final EntityManager entityManager) {
em = entityManager;
}
public void loadDoctorsByPatient(final Patient patient) {
final List<Doctor> doctorList = getDoctorsByPatientId(patient.getId());
patient.setDoctors(doctorList);
}
private List<Doctor> getDoctorsByPatientId(final Long id) {
final Query query = em.createQuery(JQL_GET_DOCTORS_BY_PATIENT);
query.setParameter("id", id);
return query.getResultList();
}
}