package hu.sch.ejb;
import hu.sch.domain.PointHistory;
import hu.sch.domain.Semester;
import hu.sch.domain.user.User;
import hu.sch.services.PointHistoryManagerLocal;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.List;
import javax.ejb.Asynchronous;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author tomi
*/
@Stateless
public class PointHistoryManagerBean implements PointHistoryManagerLocal {
private final static Logger logger = LoggerFactory.getLogger(PointHistoryManagerBean.class);
private static final String pointGenerationQuery =
"SELECT p.user_id AS usr_id, LEAST(TRUNC(SQRT(SUM(p.sum * p.sum))),100) AS point "
+ "FROM ("
+ "SELECT pontigenyles.usr_id AS user_id, SUM(pontigenyles.pont) AS sum "
+ "FROM ertekelesek v "
+ "RIGHT JOIN pontigenyles ON pontigenyles.ertekeles_id = v.id "
+ "WHERE "
+ "v.next_version IS NULL "
+ "AND v.pontigeny_statusz = 'ELFOGADVA' "
+ "AND (v.semester = :semester OR v.semester = :prevSemester) "
+ "GROUP BY v.grp_id, pontigenyles.usr_id) AS p "
+ "GROUP BY p.user_id";
@PersistenceContext
private EntityManager em;
@Override
@Asynchronous
public void generateForSemesterAsync(Semester semester) {
logger.info("Starting point history generation batch job.");
if (semester == null) {
throw new IllegalArgumentException("semester cannot be null");
}
long then = System.currentTimeMillis();
deleteHistoryForSemester(semester);
generatePointHistoryForSemester(semester);
long elapsed = System.currentTimeMillis() - then;
logger.info("Elapsed time for point history batch job: {} ms", elapsed);
}
private void deleteHistoryForSemester(Semester semester) {
Query q = em.createQuery("DELETE FROM PointHistory ph WHERE ph.semester = :semester");
q.setParameter("semester", semester);
q.executeUpdate();
}
private void generatePointHistoryForSemester(Semester semester) {
Query q = em.createNativeQuery(pointGenerationQuery);
q.setParameter("semester", semester.getId());
q.setParameter("prevSemester", semester.getPrevious().getId());
List<Object[]> results = q.getResultList();
for (Object[] row : results) {
BigInteger userId = (BigInteger) row[0];
BigDecimal point = (BigDecimal) row[1];
PointHistory ph = new PointHistory();
ph.setPoint(point.intValue());
ph.setSemester(semester);
ph.setUser(em.getReference(User.class, userId.longValue()));
em.persist(ph);
}
}
}