package kickr.db.dao;
import java.time.Duration;
import java.time.Instant;
import java.util.Date;
import java.util.List;
import kickr.db.entity.Match;
import kickr.db.util.Page;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
public class MatchDAO extends BaseDAO<Match> {
public MatchDAO(SessionFactory sessionFactory) {
super(sessionFactory);
}
public Match findMatchById(Long id) {
return uniqueResult(namedQuery("Match.get").setParameter("id", id));
}
public void create(Match match) {
persist(match);
}
public List<Match> getMatches(Page page) {
return list(paginate(namedQuery("Match.getAll"), page));
}
public List<Match> getMatchesByAliases(List<String> aliases, Page page) {
StringBuilder filterBuilder = new StringBuilder(
"SELECT m FROM Match m " +
"LEFT JOIN FETCH m.team1.offense " +
"LEFT JOIN FETCH m.team1.defense " +
"LEFT JOIN FETCH m.team2.offense " +
"LEFT JOIN FETCH m.team2.defense " +
"JOIN FETCH m.table " +
"LEFT JOIN FETCH m.creator " +
"WHERE m.played IS NOT NULL ");
addAliasFilterers(filterBuilder, aliases);
filterBuilder.append("ORDER BY m.played DESC");
Query query = currentSession().createQuery(filterBuilder.toString());
addAliasParameters(query, aliases);
return list(query
.setFirstResult(page.firstResult)
.setMaxResults(page.maxResults));
}
public void removeMatch(Long id) {
Match match = get(id);
removeMatch(match);
}
public void removeMatch(Match match) {
match.setRemoved(true);
}
public List<Match> getUnratedMatches(Duration delay) {
Date played = Date.from(Instant.now().minus(delay));
return list(namedQuery("Match.getUnrated").setParameter("played", played));
}
private void addAliasFilterers(StringBuilder filterBuilder, List<String> aliases) {
for (int i = 0; i < aliases.size(); i++) {
filterBuilder.append("AND m.participants LIKE :filter").append(i).append(" ");
}
}
private void addAliasParameters(Query query, List<String> aliases) {
for (int i = 0; i < aliases.size(); i++) {
query.setParameter("filter" + i, "%:" + aliases.get(i) + ":%");
}
}
}