package org.iatoki.judgels.uriel.models.daos.impls;
import org.iatoki.judgels.play.models.daos.impls.AbstractHibernateDao;
import org.iatoki.judgels.uriel.ContestContestantStatus;
import org.iatoki.judgels.uriel.models.daos.ContestContestantDao;
import org.iatoki.judgels.uriel.models.entities.ContestContestantModel;
import org.iatoki.judgels.uriel.models.entities.ContestContestantModel_;
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.List;
@Singleton
@Named("contestContestantDao")
public final class ContestContestantHibernateDao extends AbstractHibernateDao<Long, ContestContestantModel> implements ContestContestantDao {
public ContestContestantHibernateDao() {
super(ContestContestantModel.class);
}
@Override
public boolean existsByContestJidAndContestantJid(String contestJid, String contestantJid) {
CriteriaBuilder cb = JPA.em().getCriteriaBuilder();
CriteriaQuery<Long> query = cb.createQuery(Long.class);
Root<ContestContestantModel> root = query.from(getModelClass());
query
.select(cb.count(root))
.where(cb.and(cb.equal(root.get(ContestContestantModel_.userJid), contestantJid), cb.equal(root.get(ContestContestantModel_.contestJid), contestJid), cb.equal(root.get(ContestContestantModel_.status), ContestContestantStatus.APPROVED.name())));
return (JPA.em().createQuery(query).getSingleResult() != 0);
}
@Override
public ContestContestantModel findByContestJidAndContestantJid(String contestJid, String contestantJid) {
CriteriaBuilder cb = JPA.em().getCriteriaBuilder();
CriteriaQuery<ContestContestantModel> query = cb.createQuery(getModelClass());
Root<ContestContestantModel> root = query.from(getModelClass());
query
.where(cb.and(cb.equal(root.get(ContestContestantModel_.contestJid), contestJid), cb.equal(root.get(ContestContestantModel_.userJid), contestantJid)));
return JPA.em().createQuery(query).getSingleResult();
}
@Override
public long countContestContestantByContestJid(String contestJid) {
CriteriaBuilder cb = JPA.em().getCriteriaBuilder();
CriteriaQuery<Long> query = cb.createQuery(Long.class);
Root<ContestContestantModel> root = query.from(getModelClass());
query
.select(cb.count(root))
.where(cb.equal(root.get(ContestContestantModel_.contestJid), contestJid));
return JPA.em().createQuery(query).getSingleResult();
}
@Override
public boolean isContestStarted(String contestJid, String contestantJid) {
CriteriaBuilder cb = JPA.em().getCriteriaBuilder();
CriteriaQuery<Long> query = cb.createQuery(Long.class);
Root<ContestContestantModel> root = query.from(getModelClass());
query
.select(cb.count(root))
.where(cb.and(cb.equal(root.get(ContestContestantModel_.userJid), contestantJid), cb.equal(root.get(ContestContestantModel_.contestJid), contestJid), cb.equal(root.get(ContestContestantModel_.contestStartTime), 0)));
return (JPA.em().createQuery(query).getSingleResult() == 0);
}
@Override
public boolean isThereNewContestant(String contestJid, long lastTime) {
CriteriaBuilder cb = JPA.em().getCriteriaBuilder();
CriteriaQuery<Long> query = cb.createQuery(Long.class);
Root<ContestContestantModel> root = query.from(getModelClass());
query
.select(cb.count(root))
.where(cb.and(cb.equal(root.get(ContestContestantModel_.contestJid), contestJid), cb.gt(root.get(ContestContestantModel_.timeUpdate), lastTime)));
return (JPA.em().createQuery(query).getSingleResult() != 0);
}
@Override
public List<String> findContestJidsByContestantJid(String contestantJid) {
CriteriaBuilder cb = JPA.em().getCriteriaBuilder();
CriteriaQuery<String> query = cb.createQuery(String.class);
Root<ContestContestantModel> root = query.from(getModelClass());
query
.select(root.get(ContestContestantModel_.contestJid))
.where(cb.equal(root.get(ContestContestantModel_.userJid), contestantJid));
return JPA.em().createQuery(query).getResultList();
}
@Override
public List<ContestContestantModel> findAllByContestJid(String contestJid) {
CriteriaBuilder cb = JPA.em().getCriteriaBuilder();
CriteriaQuery<ContestContestantModel> query = cb.createQuery(getModelClass());
Root<ContestContestantModel> root = query.from(getModelClass());
query
.where(cb.equal(root.get(ContestContestantModel_.contestJid), contestJid));
return JPA.em().createQuery(query).getResultList();
}
}