package fr.openwide.core.jpa.more.business.task.dao; import java.util.Calendar; import java.util.Date; import java.util.List; import com.querydsl.jpa.JPQLQuery; import com.querydsl.jpa.impl.JPAQuery; import fr.openwide.core.jpa.business.generic.dao.GenericEntityDaoImpl; import fr.openwide.core.jpa.more.business.task.model.QQueuedTaskHolder; import fr.openwide.core.jpa.more.business.task.model.QueuedTaskHolder; import fr.openwide.core.jpa.more.business.task.util.TaskStatus; public class QueuedTaskHolderDaoImpl extends GenericEntityDaoImpl<Long, QueuedTaskHolder> implements IQueuedTaskHolderDao { private static final QQueuedTaskHolder qQueuedTaskHolder = QQueuedTaskHolder.queuedTaskHolder; // NOSONAR @Override public Long count(Date since, TaskStatus... statuses) { JPQLQuery<QueuedTaskHolder> query = new JPAQuery<>(getEntityManager()); query.from(qQueuedTaskHolder).where( qQueuedTaskHolder.status.in(statuses).and(qQueuedTaskHolder.creationDate.after(since))); return query.fetchCount(); } @Override public Long count(TaskStatus... statuses) { JPQLQuery<QueuedTaskHolder> query = new JPAQuery<>(getEntityManager()); query.from(qQueuedTaskHolder).where(qQueuedTaskHolder.status.in(statuses)); return query.fetchCount(); } @Override public QueuedTaskHolder getNextTaskForExecution(String taskType) { Date now = new Date(); QQueuedTaskHolder qQueuedTask = QQueuedTaskHolder.queuedTaskHolder; JPQLQuery<QueuedTaskHolder> query = new JPAQuery<QueuedTaskHolder>(getEntityManager()); query.from(qQueuedTask) .where(qQueuedTask.taskType.eq(taskType) .and(qQueuedTask.startDate.isNull()) .and(qQueuedTask.triggeringDate.isNull() .or(qQueuedTask.triggeringDate.before(now)))) .orderBy(qQueuedTask.version.asc(), qQueuedTask.creationDate.asc()); List<QueuedTaskHolder> tasksForExecution = query.fetch(); if (tasksForExecution.isEmpty()) { return null; } else { return tasksForExecution.get(0); } } @Override public QueuedTaskHolder getStalledTask(String taskType, int executionTimeLimitInSeconds) { Calendar timeLimit = Calendar.getInstance(); timeLimit.add(Calendar.SECOND, -executionTimeLimitInSeconds); QQueuedTaskHolder qQueuedTask = QQueuedTaskHolder.queuedTaskHolder; JPQLQuery<QueuedTaskHolder> query = new JPAQuery<QueuedTaskHolder>(getEntityManager()); query.from(qQueuedTask) .where(qQueuedTask.startDate.isNotNull() .and(qQueuedTask.taskType.eq(taskType)) .and(qQueuedTask.startDate.before(timeLimit.getTime()))); List<QueuedTaskHolder> stalledTasks = query.fetch(); if (stalledTasks.isEmpty()) { return null; } else { return stalledTasks.get(0); } } @Override public List<QueuedTaskHolder> listConsumable() { JPQLQuery<QueuedTaskHolder> query = new JPAQuery<QueuedTaskHolder>(getEntityManager()); query.from(qQueuedTaskHolder) .where(qQueuedTaskHolder.status.in(TaskStatus.CONSUMABLE_TASK_STATUS)) .orderBy(qQueuedTaskHolder.id.asc()); return query.fetch(); } @Override public List<QueuedTaskHolder> listConsumable(String queueId) { JPQLQuery<QueuedTaskHolder> query = new JPAQuery<QueuedTaskHolder>(getEntityManager()); query.from(qQueuedTaskHolder) .where(qQueuedTaskHolder.status.in(TaskStatus.CONSUMABLE_TASK_STATUS)) .orderBy(qQueuedTaskHolder.id.asc()); if (queueId != null) { query.where(qQueuedTaskHolder.queueId.eq(queueId)); } else { query.where(qQueuedTaskHolder.queueId.isNull()); } return query.fetch(); } @Override public List<String> listTypes() { JPQLQuery<String> query = new JPAQuery<String>(getEntityManager()); query.select(qQueuedTaskHolder.taskType) .from(qQueuedTaskHolder) .orderBy(qQueuedTaskHolder.taskType.asc()) .distinct(); return query.fetch(); } }