package org.iatoki.judgels.uriel.models.daos.impls; import com.google.common.collect.ImmutableList; import org.iatoki.judgels.play.models.daos.impls.AbstractJudgelsHibernateDao; import org.iatoki.judgels.uriel.ContestClarificationStatus; import org.iatoki.judgels.uriel.models.daos.ContestClarificationDao; import org.iatoki.judgels.uriel.models.entities.ContestClarificationModel; import org.iatoki.judgels.uriel.models.entities.ContestClarificationModel_; import play.db.jpa.JPA; import javax.inject.Named; import javax.inject.Singleton; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; import java.util.Collection; import java.util.List; @Singleton @Named("contestClarificationDao") public final class ContestClarificationHibernateDao extends AbstractJudgelsHibernateDao<ContestClarificationModel> implements ContestClarificationDao { public ContestClarificationHibernateDao() { super(ContestClarificationModel.class); } @Override public long countUnansweredClarificationByContestJid(String contestJid) { CriteriaBuilder cb = JPA.em().getCriteriaBuilder(); CriteriaQuery<Long> query = cb.createQuery(Long.class); Root<ContestClarificationModel> root = query.from(ContestClarificationModel.class); query .select(cb.count(root)) .where(cb.and(cb.equal(root.get(ContestClarificationModel_.contestJid), contestJid)), cb.equal(root.get(ContestClarificationModel_.status), ContestClarificationStatus.ASKED.name())); return JPA.em().createQuery(query).getSingleResult(); } @Override public List<String> findAllAnsweredClarificationJidsInContestByUserJids(String contestJid, Collection<String> userJids) { if (userJids.isEmpty()) { return ImmutableList.of(); } CriteriaBuilder cb = JPA.em().getCriteriaBuilder(); CriteriaQuery<String> query = cb.createQuery(String.class); Root<ContestClarificationModel> root = query.from(ContestClarificationModel.class); query .select(root.get(ContestClarificationModel_.jid)) .where(cb.and(cb.equal(root.get(ContestClarificationModel_.contestJid), contestJid), root.get(ContestClarificationModel_.userCreate).in(userJids), cb.notEqual(root.get(ContestClarificationModel_.status), ContestClarificationStatus.ASKED.name()))); return JPA.em().createQuery(query).getResultList(); } @Override public long countClarificationsByContestJidAskedByUserJids(String contestJid, Collection<String> userJids) { if (userJids.size() == 0) { return 0; } CriteriaBuilder cb = JPA.em().getCriteriaBuilder(); CriteriaQuery<Long> query = cb.createQuery(Long.class); Root<ContestClarificationModel> root = query.from(ContestClarificationModel.class); query .select(cb.count(root)) .where(cb.and(cb.equal(root.get(ContestClarificationModel_.contestJid), contestJid)), root.get(ContestClarificationModel_.userCreate).in(userJids)); return JPA.em().createQuery(query).getSingleResult(); } @Override public List<ContestClarificationModel> findClarificationsByContestJidAskedByUserJids(String contestJid, Collection<String> userJids) { if (userJids.size() == 0) { return ImmutableList.of(); } CriteriaBuilder cb = JPA.em().getCriteriaBuilder(); CriteriaQuery<ContestClarificationModel> query = cb.createQuery(ContestClarificationModel.class); Root<ContestClarificationModel> root = query.from(ContestClarificationModel.class); query .orderBy(cb.desc(root.get(ContestClarificationModel_.id))) .where(cb.and(cb.equal(root.get(ContestClarificationModel_.contestJid), contestJid), root.get(ContestClarificationModel_.userCreate).in(userJids))); return JPA.em().createQuery(query).getResultList(); } @Override public List<String> findClarificationJidsByContestJidAskedByUserJids(String contestJid, Collection<String> userJids) { if (userJids.size() == 0) { return ImmutableList.of(); } CriteriaBuilder cb = JPA.em().getCriteriaBuilder(); CriteriaQuery<String> query = cb.createQuery(String.class); Root<ContestClarificationModel> root = query.from(ContestClarificationModel.class); query .select(root.get(ContestClarificationModel_.jid)) .where(cb.and(cb.equal(root.get(ContestClarificationModel_.contestJid), contestJid), root.get(ContestClarificationModel_.userCreate).in(userJids))); return JPA.em().createQuery(query).getResultList(); } }