package qa.qcri.aidr.manager.repository.impl; import java.io.Serializable; import java.math.BigDecimal; import java.math.BigInteger; import java.sql.Timestamp; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.hibernate.Criteria; import org.hibernate.HibernateException; import org.hibernate.SQLQuery; import org.hibernate.Session; import org.hibernate.criterion.Order; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import org.hibernate.type.IntegerType; import org.springframework.orm.hibernate4.HibernateCallback; import org.springframework.stereotype.Repository; import qa.qcri.aidr.manager.dto.CollectionLogDataResponse; import qa.qcri.aidr.manager.persistence.entities.CollectionLog; import qa.qcri.aidr.manager.repository.CollectionLogRepository; @Repository("collectionLogRepository") public class CollectionLogRepositoryImpl extends GenericRepositoryImpl<CollectionLog, Serializable> implements CollectionLogRepository { @SuppressWarnings("unchecked") @Override public CollectionLogDataResponse getPaginatedData(Integer start, Integer limit) { Criteria countCriteria = getHibernateTemplate().getSessionFactory().getCurrentSession().createCriteria(CollectionLog.class); countCriteria.setProjection(Projections.rowCount()); Long count = (Long) countCriteria.uniqueResult(); if (count == 0){ return new CollectionLogDataResponse(Collections.<CollectionLog>emptyList(), count); } Criteria criteria = getHibernateTemplate().getSessionFactory().getCurrentSession().createCriteria(CollectionLog.class); criteria.setFirstResult(start); criteria.setMaxResults(limit); criteria.addOrder(Order.desc("startDate")); return new CollectionLogDataResponse(criteria.list(), count); } @SuppressWarnings("unchecked") @Override public CollectionLogDataResponse getPaginatedDataForCollection(Integer start, Integer limit, Long collectionId) { Criteria countCriteria = getHibernateTemplate().getSessionFactory().getCurrentSession().createCriteria(CollectionLog.class); countCriteria.add(Restrictions.eq("collectionId", collectionId)); countCriteria.setProjection(Projections.rowCount()); Long count = (Long) countCriteria.uniqueResult(); if (count == 0){ return new CollectionLogDataResponse(Collections.<CollectionLog>emptyList(), count); } Criteria criteria = getHibernateTemplate().getSessionFactory().getCurrentSession().createCriteria(CollectionLog.class); criteria.add(Restrictions.eq("collectionId", collectionId)); criteria.setFirstResult(start); criteria.setMaxResults(limit); criteria.addOrder(Order.desc("startDate")); return new CollectionLogDataResponse(criteria.list(), count); } @Override public Integer countTotalDownloadedItemsForCollection(final Long collectionId) { return (Integer) getHibernateTemplate().execute(new HibernateCallback<Object>() { @Override public Object doInHibernate(Session session) throws HibernateException { String sql = " select sum(c.count) from collection_log c where c.collection_id = :collectionId "; SQLQuery sqlQuery = session.createSQLQuery(sql); sqlQuery.setParameter("collectionId", collectionId); BigDecimal total = (BigDecimal) sqlQuery.uniqueResult(); return total != null ? total.intValue() : 0; } }); } @Override public Long countTotalTweets() { return (Long) getHibernateTemplate().execute(new HibernateCallback<Object>() { @Override public Object doInHibernate(Session session) throws HibernateException { String sql = " select sum(c.count) from collection_log c "; SQLQuery sqlQuery = session.createSQLQuery(sql); BigDecimal total = (BigDecimal) sqlQuery.uniqueResult(); return total != null ? total.longValue() : 0; } }); } @SuppressWarnings("unchecked") @Override public Map<Integer, Integer> countTotalDownloadedItemsForCollectionIds(final List<Long> ids) { return (Map<Integer, Integer>) getHibernateTemplate().execute(new HibernateCallback<Object>() { @Override public Object doInHibernate(Session session) throws HibernateException { String sql = " select c.collection_id as id, " + " sum(c.count) as count " + " from collection_log c " + " where c.collection_id in :ids " + " group by c.collection_id "; SQLQuery sqlQuery = session.createSQLQuery(sql); sqlQuery.addScalar("id", new IntegerType()); sqlQuery.addScalar("count", new IntegerType()); sqlQuery.setParameterList("ids", ids); List<Object[]> list = sqlQuery.list(); Map<Integer, Integer> result = new HashMap<Integer, Integer>(); for (Object[] row : list) { result.put((Integer) row[0], (Integer) row[1]); } return result; } }); } @SuppressWarnings("unchecked") @Override public Integer countLogsStartedInInterval(final Long collectionId, final Date startDate, final Date endDate) { return (Integer) getHibernateTemplate().execute(new HibernateCallback<Object>() { @Override public Object doInHibernate(Session session) throws HibernateException { String sql = " select count(*) from collection_log c where c.collection_id = :collectionId and start_date = :startDate "; SQLQuery sqlQuery = session.createSQLQuery(sql); sqlQuery.setParameter("collectionId", collectionId); sqlQuery.setParameter("startDate", startDate); BigInteger total = (BigInteger) sqlQuery.uniqueResult(); return total != null ? total.intValue() : 0; } }); } @Override public void save(CollectionLog collectionLog) { Timestamp now = new Timestamp(System.currentTimeMillis()); collectionLog.setCreatedAt(now); collectionLog.setUpdatedAt(now); super.save(collectionLog); } }