package fi.otavanopisto.muikku.plugins.workspace.dao; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.LockModeType; import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; import fi.otavanopisto.muikku.plugins.workspace.model.WorkspaceVisit_; import fi.otavanopisto.muikku.model.users.UserEntity; import fi.otavanopisto.muikku.model.workspace.WorkspaceEntity; import fi.otavanopisto.muikku.plugins.CorePluginsDAO; import fi.otavanopisto.muikku.plugins.workspace.model.WorkspaceVisit; public class WorkspaceVisitDAO extends CorePluginsDAO<WorkspaceVisit> { private static final long serialVersionUID = 1L; public WorkspaceVisit create(UserEntity userEntity, WorkspaceEntity workspaceEntity, Date lastVisit) { WorkspaceVisit visit = new WorkspaceVisit(); visit.setUserEntityId(userEntity.getId()); visit.setWorkspaceEntityId(workspaceEntity.getId()); visit.setNumVisits(0l); visit.setLastVisit(lastVisit); persist(visit); return visit; } public WorkspaceVisit lockingFindByUserEntityAndWorkspaceEntity(UserEntity userEntity, WorkspaceEntity workspaceEntity) { EntityManager entityManager = getEntityManager(); CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery<WorkspaceVisit> criteria = criteriaBuilder.createQuery(WorkspaceVisit.class); Root<WorkspaceVisit> root = criteria.from(WorkspaceVisit.class); criteria.select(root); criteria.where(criteriaBuilder.and( criteriaBuilder.equal(root.get(WorkspaceVisit_.userEntityId), userEntity.getId()), criteriaBuilder.equal(root.get(WorkspaceVisit_.workspaceEntityId), workspaceEntity.getId())) ); TypedQuery<WorkspaceVisit> query = entityManager.createQuery(criteria); query.setLockMode(LockModeType.PESSIMISTIC_WRITE); return getSingleResult(query); } public WorkspaceVisit findByUserEntityAndWorkspaceEntity(UserEntity userEntity, WorkspaceEntity workspaceEntity) { EntityManager entityManager = getEntityManager(); CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery<WorkspaceVisit> criteria = criteriaBuilder.createQuery(WorkspaceVisit.class); Root<WorkspaceVisit> root = criteria.from(WorkspaceVisit.class); criteria.select(root); criteria.where(criteriaBuilder.and( criteriaBuilder.equal(root.get(WorkspaceVisit_.userEntityId), userEntity.getId()), criteriaBuilder.equal(root.get(WorkspaceVisit_.workspaceEntityId), workspaceEntity.getId())) ); return getSingleResult(entityManager.createQuery(criteria)); } public List<WorkspaceVisit> listByUserEntityAndMinVisitsOrderByLastVisit(UserEntity userEntity, Long numVisits, Integer firstResult, Integer maxResults) { EntityManager entityManager = getEntityManager(); CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery<WorkspaceVisit> criteria = criteriaBuilder.createQuery(WorkspaceVisit.class); Root<WorkspaceVisit> root = criteria.from(WorkspaceVisit.class); criteria.select(root); criteria.where( criteriaBuilder.and( criteriaBuilder.equal(root.get(WorkspaceVisit_.userEntityId), userEntity.getId()), criteriaBuilder.greaterThanOrEqualTo(root.get(WorkspaceVisit_.numVisits), numVisits) ) ); criteria.orderBy(criteriaBuilder.desc(root.get(WorkspaceVisit_.lastVisit))); TypedQuery<WorkspaceVisit> query = entityManager.createQuery(criteria); if (firstResult != null) { query.setFirstResult(firstResult); } if (maxResults != null) { query.setMaxResults(maxResults); } return query.getResultList(); } public List<WorkspaceVisit> listByWorkspaceEntityIdsAndUserEntityAndMinVisitsOrderByLastVisit( Collection<Long> workspaceEntityIds, UserEntity userEntity, Long numVisits, Integer firstResult, Integer maxResults ) { EntityManager entityManager = getEntityManager(); CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery<WorkspaceVisit> criteria = criteriaBuilder.createQuery(WorkspaceVisit.class); Root<WorkspaceVisit> root = criteria.from(WorkspaceVisit.class); criteria.select(root); if (workspaceEntityIds == null || workspaceEntityIds.isEmpty()) { return Collections.emptyList(); } else { criteria.where( criteriaBuilder.and( root.get(WorkspaceVisit_.workspaceEntityId).in(workspaceEntityIds), criteriaBuilder.equal(root.get(WorkspaceVisit_.userEntityId), userEntity.getId()), criteriaBuilder.greaterThanOrEqualTo(root.get(WorkspaceVisit_.numVisits), numVisits) ) ); } criteria.orderBy(criteriaBuilder.desc(root.get(WorkspaceVisit_.lastVisit))); TypedQuery<WorkspaceVisit> query = entityManager.createQuery(criteria); if (firstResult != null) { query.setFirstResult(firstResult); } if (maxResults != null) { query.setMaxResults(maxResults); } return query.getResultList(); } public void updateNumVisitsAndLastVisit(WorkspaceVisit workspaceVisit, Long numVisits, Date lastVisit) { workspaceVisit.setNumVisits(numVisits); workspaceVisit.setLastVisit(lastVisit); persist(workspaceVisit); } }