package org.iatoki.judgels.uriel.models.daos.impls;
import org.iatoki.judgels.play.models.daos.impls.AbstractHibernateDao;
import org.iatoki.judgels.uriel.ContestProblemStatus;
import org.iatoki.judgels.uriel.models.daos.ContestProblemDao;
import org.iatoki.judgels.uriel.models.entities.ContestProblemModel;
import org.iatoki.judgels.uriel.models.entities.ContestProblemModel_;
import play.db.jpa.JPA;
import javax.inject.Named;
import javax.inject.Singleton;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Order;
import javax.persistence.criteria.Root;
import java.util.List;
@Singleton
@Named("contestProblemDao")
public final class ContestProblemHibernateDao extends AbstractHibernateDao<Long, ContestProblemModel> implements ContestProblemDao {
public ContestProblemHibernateDao() {
super(ContestProblemModel.class);
}
@Override
public List<ContestProblemModel> findByContestJid(String contestJid) {
CriteriaBuilder cb = JPA.em().getCriteriaBuilder();
CriteriaQuery<ContestProblemModel> query = cb.createQuery(ContestProblemModel.class);
Root<ContestProblemModel> root = query.from(ContestProblemModel.class);
query
.where(cb.equal(root.get(ContestProblemModel_.contestJid), contestJid))
.orderBy(cb.asc(root.get(ContestProblemModel_.alias)));
return JPA.em().createQuery(query).getResultList();
}
@Override
public ContestProblemModel findByProblemJidOrderedByAlias(String contestJid, String problemJid) {
CriteriaBuilder cb = JPA.em().getCriteriaBuilder();
CriteriaQuery<ContestProblemModel> query = cb.createQuery(ContestProblemModel.class);
Root<ContestProblemModel> root = query.from(ContestProblemModel.class);
query
.where(cb.and(cb.equal(root.get(ContestProblemModel_.problemJid), problemJid), cb.equal(root.get(ContestProblemModel_.contestJid), contestJid)));
return JPA.em().createQuery(query).getSingleResult();
}
@Override
public boolean existsByProblemJid(String contestJid, String problemJid) {
CriteriaBuilder cb = JPA.em().getCriteriaBuilder();
CriteriaQuery<Long> query = cb.createQuery(Long.class);
Root<ContestProblemModel> root = query.from(ContestProblemModel.class);
query
.select(cb.count(root))
.where(cb.and(cb.equal(root.get(ContestProblemModel_.problemJid), problemJid), cb.equal(root.get(ContestProblemModel_.contestJid), contestJid)));
return (JPA.em().createQuery(query).getSingleResult() != 0);
}
@Override
public boolean existsByProblemAlias(String contestJid, String problemAlias) {
CriteriaBuilder cb = JPA.em().getCriteriaBuilder();
CriteriaQuery<Long> query = cb.createQuery(Long.class);
Root<ContestProblemModel> root = query.from(ContestProblemModel.class);
query
.select(cb.count(root))
.where(cb.and(cb.equal(root.get(ContestProblemModel_.alias), problemAlias), cb.equal(root.get(ContestProblemModel_.contestJid), contestJid)));
return (JPA.em().createQuery(query).getSingleResult() != 0);
}
@Override
public List<ContestProblemModel> findOpenedByContestJidOrderedByAlias(String contestJid) {
CriteriaBuilder cb = JPA.em().getCriteriaBuilder();
CriteriaQuery<ContestProblemModel> query = cb.createQuery(ContestProblemModel.class);
Root<ContestProblemModel> root = query.from(ContestProblemModel.class);
Order orderBy = cb.asc(root.get(ContestProblemModel_.alias));
query
.where(cb.and(cb.equal(root.get(ContestProblemModel_.contestJid), contestJid), cb.equal(root.get(ContestProblemModel_.status), ContestProblemStatus.OPEN.name())))
.orderBy(orderBy);
return JPA.em().createQuery(query).getResultList();
}
@Override
public List<ContestProblemModel> findUsedByContestJidOrderedByAlias(String contestJid) {
CriteriaBuilder cb = JPA.em().getCriteriaBuilder();
CriteriaQuery<ContestProblemModel> query = cb.createQuery(ContestProblemModel.class);
Root<ContestProblemModel> root = query.from(ContestProblemModel.class);
Order orderBy = cb.asc(root.get(ContestProblemModel_.alias));
query
.where(cb.and(cb.equal(root.get(ContestProblemModel_.contestJid), contestJid), cb.notEqual(root.get(ContestProblemModel_.status), ContestProblemStatus.UNUSED.name())))
.orderBy(orderBy);
return JPA.em().createQuery(query).getResultList();
}
@Override
public long countValidByContestJid(String contestJid) {
CriteriaBuilder cb = JPA.em().getCriteriaBuilder();
CriteriaQuery<Long> query = cb.createQuery(Long.class);
Root<ContestProblemModel> root = query.from(ContestProblemModel.class);
query
.select(cb.count(root))
.where(cb.and(cb.equal(root.get(ContestProblemModel_.contestJid), contestJid), cb.notEqual(root.get(ContestProblemModel_.status), ContestProblemStatus.UNUSED.name())));
return JPA.em().createQuery(query).getSingleResult();
}
@Override
public List<ContestProblemModel> findUsedByContestJidOrderedByStatusAndThenAlias(String contestJid, long offset, long limit) {
CriteriaBuilder cb = JPA.em().getCriteriaBuilder();
CriteriaQuery<ContestProblemModel> query = cb.createQuery(ContestProblemModel.class);
Root<ContestProblemModel> root = query.from(ContestProblemModel.class);
query
.where(cb.and(cb.equal(root.get(ContestProblemModel_.contestJid), contestJid), cb.notEqual(root.get(ContestProblemModel_.status), ContestProblemStatus.UNUSED.name())))
.orderBy(cb.desc(root.get(ContestProblemModel_.status)), cb.asc(root.get(ContestProblemModel_.alias)));
TypedQuery<ContestProblemModel> q = JPA.em().createQuery(query).setFirstResult((int) offset);
if (limit != -1) {
q.setMaxResults((int) limit);
}
return q.getResultList();
}
@Override
public boolean isThereNewProblem(String contestJid, long lastTime) {
CriteriaBuilder cb = JPA.em().getCriteriaBuilder();
CriteriaQuery<Long> query = cb.createQuery(Long.class);
Root<ContestProblemModel> root = query.from(ContestProblemModel.class);
query
.select(cb.count(root))
.where(cb.and(cb.equal(root.get(ContestProblemModel_.contestJid), contestJid), cb.gt(root.get(ContestProblemModel_.timeUpdate), lastTime)));
return (JPA.em().createQuery(query).getSingleResult() != 0);
}
}