package org.iatoki.judgels.uriel.models.daos.impls; import com.google.common.collect.ImmutableMap; import org.iatoki.judgels.play.models.daos.impls.AbstractHibernateDao; import org.iatoki.judgels.uriel.models.daos.ContestContestantPasswordDao; import org.iatoki.judgels.uriel.models.entities.ContestContestantPasswordModel; import org.iatoki.judgels.uriel.models.entities.ContestContestantPasswordModel_; 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; import java.util.Map; import java.util.stream.Collectors; @Singleton @Named("contestContestantPasswordDao") public final class ContestContestantPasswordHibernateDao extends AbstractHibernateDao<Long, ContestContestantPasswordModel> implements ContestContestantPasswordDao { public ContestContestantPasswordHibernateDao() { super(ContestContestantPasswordModel.class); } @Override public boolean existsByContestJidAndContestantJid(String contestJid, String contestantJid) { CriteriaBuilder cb = JPA.em().getCriteriaBuilder(); CriteriaQuery<Long> query = cb.createQuery(Long.class); Root<ContestContestantPasswordModel> root = query.from(getModelClass()); query .select(cb.count(root)) .where(cb.and(cb.equal(root.get(ContestContestantPasswordModel_.contestJid), contestJid), cb.equal(root.get(ContestContestantPasswordModel_.contestantJid), contestantJid))); return JPA.em().createQuery(query).getSingleResult() > 0; } @Override public ContestContestantPasswordModel findByContestJidAndContestantJid(String contestJid, String contestantJid) { CriteriaBuilder cb = JPA.em().getCriteriaBuilder(); CriteriaQuery<ContestContestantPasswordModel> query = cb.createQuery(getModelClass()); Root<ContestContestantPasswordModel> root = query.from(getModelClass()); query .where(cb.and(cb.equal(root.get(ContestContestantPasswordModel_.contestJid), contestJid), cb.equal(root.get(ContestContestantPasswordModel_.contestantJid), contestantJid))); return JPA.em().createQuery(query).getSingleResult(); } @Override public Map<String, String> getContestantPasswordsByContestJidAndContestantJids(String contestJid, Collection<String> contestantJids) { if (contestantJids.isEmpty()) { return ImmutableMap.of(); } else { CriteriaBuilder cb = JPA.em().getCriteriaBuilder(); CriteriaQuery<ContestContestantPasswordModel> query = cb.createQuery(getModelClass()); Root<ContestContestantPasswordModel> root = query.from(getModelClass()); query.where(cb.and(cb.equal(root.get(ContestContestantPasswordModel_.contestJid), contestJid), root.get(ContestContestantPasswordModel_.contestantJid).in(contestantJids))); List<ContestContestantPasswordModel> models = JPA.em().createQuery(query).getResultList(); return models.stream().collect(Collectors.toMap(m -> m.contestantJid, m -> m.password)); } } }