package fi.otavanopisto.pyramus.dao.grading;
import java.util.Date;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.Root;
import fi.otavanopisto.pyramus.dao.PyramusEntityDAO;
import fi.otavanopisto.pyramus.domainmodel.courses.Course;
import fi.otavanopisto.pyramus.domainmodel.courses.CourseStudent;
import fi.otavanopisto.pyramus.domainmodel.grading.CourseAssessmentRequest;
import fi.otavanopisto.pyramus.domainmodel.students.Student;
import fi.otavanopisto.pyramus.domainmodel.courses.CourseStudent_;
import fi.otavanopisto.pyramus.domainmodel.grading.CourseAssessmentRequest_;
@Stateless
public class CourseAssessmentRequestDAO extends PyramusEntityDAO<CourseAssessmentRequest> {
public CourseAssessmentRequest create(CourseStudent courseStudent, Date created, String requestText) {
EntityManager entityManager = getEntityManager();
CourseAssessmentRequest courseAssessmentRequest = new CourseAssessmentRequest();
courseAssessmentRequest.setCourseStudent(courseStudent);
courseAssessmentRequest.setCreated(created);
courseAssessmentRequest.setRequestText(requestText);
courseAssessmentRequest.setHandled(Boolean.FALSE);
entityManager.persist(courseAssessmentRequest);
return courseAssessmentRequest;
}
/**
* Lists all student's course assessments excluding archived ones
*
* @return list of all students course assessments
*/
public List<CourseAssessmentRequest> listByCourseStudent(CourseStudent courseStudent) {
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<CourseAssessmentRequest> criteria = criteriaBuilder.createQuery(CourseAssessmentRequest.class);
Root<CourseAssessmentRequest> root = criteria.from(CourseAssessmentRequest.class);
criteria.select(root);
criteria.where(
criteriaBuilder.and(
criteriaBuilder.equal(root.get(CourseAssessmentRequest_.courseStudent), courseStudent),
criteriaBuilder.equal(root.get(CourseAssessmentRequest_.archived), Boolean.FALSE)
));
return entityManager.createQuery(criteria).getResultList();
}
/**
* Lists all student's course assessments excluding archived ones
*
* @return list of all students course assessments
*/
public List<CourseAssessmentRequest> listByCourseAndStudent(Course course, Student student) {
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<CourseAssessmentRequest> criteria = criteriaBuilder.createQuery(CourseAssessmentRequest.class);
Root<CourseAssessmentRequest> root = criteria.from(CourseAssessmentRequest.class);
Join<CourseAssessmentRequest, CourseStudent> courseStudentJoin = root.join(CourseAssessmentRequest_.courseStudent);
criteria.select(root);
criteria.where(
criteriaBuilder.and(
criteriaBuilder.equal(courseStudentJoin.get(CourseStudent_.course), course),
criteriaBuilder.equal(courseStudentJoin.get(CourseStudent_.student), student),
criteriaBuilder.equal(root.get(CourseAssessmentRequest_.archived), Boolean.FALSE)
));
return entityManager.createQuery(criteria).getResultList();
}
public CourseAssessmentRequest update(CourseAssessmentRequest courseAssessmentRequest, Date created, String requestText, Boolean handled) {
EntityManager entityManager = getEntityManager();
courseAssessmentRequest.setCreated(created);
courseAssessmentRequest.setRequestText(requestText);
courseAssessmentRequest.setHandled(handled);
entityManager.persist(courseAssessmentRequest);
return courseAssessmentRequest;
}
public CourseAssessmentRequest updateHandled(CourseAssessmentRequest courseAssessmentRequest, Boolean handled) {
EntityManager entityManager = getEntityManager();
courseAssessmentRequest.setHandled(handled);
entityManager.persist(courseAssessmentRequest);
return courseAssessmentRequest;
}
public List<CourseAssessmentRequest> listByCourse(Course course) {
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<CourseAssessmentRequest> criteria = criteriaBuilder.createQuery(CourseAssessmentRequest.class);
Root<CourseAssessmentRequest> root = criteria.from(CourseAssessmentRequest.class);
Join<CourseAssessmentRequest, CourseStudent> courseStudent = root.join(CourseAssessmentRequest_.courseStudent);
criteria.select(root);
criteria.where(
criteriaBuilder.and(
criteriaBuilder.equal(courseStudent.get(CourseStudent_.course), course),
criteriaBuilder.equal(courseStudent.get(CourseStudent_.archived), Boolean.FALSE),
criteriaBuilder.equal(root.get(CourseAssessmentRequest_.archived), Boolean.FALSE)
));
return entityManager.createQuery(criteria).getResultList();
}
public List<CourseAssessmentRequest> listByCourseAndHandled(Course course, Boolean handled) {
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<CourseAssessmentRequest> criteria = criteriaBuilder.createQuery(CourseAssessmentRequest.class);
Root<CourseAssessmentRequest> root = criteria.from(CourseAssessmentRequest.class);
Join<CourseAssessmentRequest, CourseStudent> courseStudent = root.join(CourseAssessmentRequest_.courseStudent);
criteria.select(root);
criteria.where(
criteriaBuilder.and(
criteriaBuilder.equal(courseStudent.get(CourseStudent_.course), course),
criteriaBuilder.equal(courseStudent.get(CourseStudent_.archived), Boolean.FALSE),
criteriaBuilder.equal(root.get(CourseAssessmentRequest_.archived), Boolean.FALSE),
criteriaBuilder.equal(root.get(CourseAssessmentRequest_.handled), handled)
));
return entityManager.createQuery(criteria).getResultList();
}
public List<CourseAssessmentRequest> listByStudent(Student student) {
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<CourseAssessmentRequest> criteria = criteriaBuilder.createQuery(CourseAssessmentRequest.class);
Root<CourseAssessmentRequest> root = criteria.from(CourseAssessmentRequest.class);
Join<CourseAssessmentRequest, CourseStudent> courseStudent = root.join(CourseAssessmentRequest_.courseStudent);
criteria.select(root);
criteria.where(
criteriaBuilder.and(
criteriaBuilder.equal(courseStudent.get(CourseStudent_.student), student),
criteriaBuilder.equal(root.get(CourseAssessmentRequest_.archived), Boolean.FALSE)
));
return entityManager.createQuery(criteria).getResultList();
}
}