package swag49.statistics; import org.slf4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.transaction.annotation.Transactional; import swag49.dao.DataAccessObject; import swag49.model.Player; import swag49.model.Statistic; import swag49.model.StatisticEntry; import swag49.util.Log; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.TypedQuery; import java.util.Collection; public abstract class StatisticCalculatorBase implements StatisticCalculator { @Log private Logger log; @PersistenceContext private EntityManager em; @Autowired @Qualifier("statisticDAO") private DataAccessObject<Statistic, Long> statisticDAO; @Autowired @Qualifier("statisticEntryDAO") private DataAccessObject<StatisticEntry, StatisticEntry.Id> statisticEntryDAO; // @Value("$processing{statistic.limit}") private Integer limit = 5; @Override @Transactional("swag49.map") public void calculate() { log.info("Calculation of {} started (limit: {}).", getStatisticName(), limit); Statistic statistic = new Statistic(); statistic.setName(getStatisticName()); statistic.setEntries(null); Collection<Statistic> statistics = statisticDAO.queryByExample(statistic); assert statistics.size() <= 1; if (statistics.size() == 1) statistic = statistics.toArray(new Statistic[statistics.size()])[0]; else statistic = statisticDAO.create(statistic); String queryString = getRankedPlayersQuery(); TypedQuery<Player> query = em.createQuery(queryString, Player.class); query.setMaxResults(limit); statistic.getEntries().clear(); int ranking = 1; for (Player player : query.getResultList()) { StatisticEntry entry = new StatisticEntry(statistic, ranking); entry.setPlayer(player); entry.setScore(getScore(player)); statisticEntryDAO.create(entry); ranking++; } statisticDAO.update(statistic); log.info("Calculation of {} finished (limit: {}).", getStatisticName(), limit); } protected abstract String getRankedPlayersQuery(); protected abstract int getScore(Player player); protected abstract String getStatisticName(); }