package com.github.windbender.dao; import java.math.BigInteger; import java.util.ArrayList; import java.util.List; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.SQLQuery; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.criterion.Property; import org.hibernate.criterion.Restrictions; import org.joda.time.DateTime; import com.github.windbender.domain.ImageEvent; import com.github.windbender.domain.User; import com.yammer.dropwizard.hibernate.AbstractDAO; public class EventDAO extends AbstractDAO<ImageEvent> { public EventDAO(SessionFactory sessionFactory) { super(sessionFactory); } public ImageEvent findById(Long id) { return get(id); } public long create(ImageEvent ir) { return persist(ir).getId(); } public List<ImageEvent> findEventsForUserToID(User u, int number) { List<ImageEvent> list = new ArrayList<ImageEvent>(); String sql = "select * from ( select count(y.image_event_id) as totalActions, events.id as eventId from events left join (select * from identifications where user_id != ?) y on y.image_event_id = events.id group by events.id ) x where x.totalActions < ? order by totalActions,eventId"; SQLQuery sqlQuery = this.currentSession().createSQLQuery(sql); int limit = 2; Query query = sqlQuery.setParameter(0, u.getId()).setParameter(1, limit); List<Object[]> l = query.list(); int count = 0; for(Object[] oa: l) { int numberOfIdentifications = 0; Long event_id = null; BigInteger numberOfIdentifications_bi = (BigInteger)oa[0]; Integer event_id_bi = (Integer)oa[1]; if(numberOfIdentifications_bi != null) { numberOfIdentifications = numberOfIdentifications_bi.intValue(); } if(event_id_bi != null) { event_id = event_id_bi.longValue(); } if(event_id != null) { ImageEvent e = this.findById(event_id); list.add(e); count++; if(count > number) break; } } return list; } public List<ImageEvent> findEventsBetween(DateTime before, DateTime after) { Session currentSession = this.currentSession(); Criteria crit = currentSession.createCriteria(ImageEvent.class); crit.add(Restrictions.ge("eventStartTime", before)); crit.add(Restrictions.le("eventStartTime", after)); crit.addOrder( Property.forName("eventStartTime").desc() ); List<ImageEvent> findList = crit.list(); return findList; } public List<ImageEvent> findEventsBetween(long l, DateTime before, DateTime after) { Session currentSession = this.currentSession(); Criteria crit = currentSession.createCriteria(ImageEvent.class); crit.add(Restrictions.ge("eventStartTime", before)); crit.add(Restrictions.le("eventStartTime", after)); crit.add(Restrictions.eq("cameraID",l)); crit.addOrder( Property.forName("eventStartTime").desc() ); List<ImageEvent> findList = crit.list(); return findList; } public void save(ImageEvent ie) { this.currentSession().saveOrUpdate(ie); } public List<ImageEvent> findAll() { Session currentSession = this.currentSession(); Criteria crit = currentSession.createCriteria(ImageEvent.class); crit.addOrder( Property.forName("eventStartTime").desc() ); List<ImageEvent> findList = crit.list(); return findList; } public List<Integer> findEventIdsDoneByUser(User u) { List<ImageEvent> list = new ArrayList<ImageEvent>(); String sql = "select image_event_id from identifications where user_id=? group by image_event_id order by image_event_id"; SQLQuery sqlQuery = this.currentSession().createSQLQuery(sql); Query query = sqlQuery.setParameter(0, u.getId()); List<Integer> l = query.list(); return l; } public List<Integer> findEventsIdsWithFewerThanIdentifications(int number) { List<ImageEvent> list = new ArrayList<ImageEvent>(); String sql = "select eventId from (select count(identifications.image_event_id) as totalActions, events.id as eventId from events left join identifications on identifications.image_event_id = events.id group by events.id ) x where x.totalActions < ? order by totalActions,eventId"; SQLQuery sqlQuery = this.currentSession().createSQLQuery(sql); Query query = sqlQuery.setParameter(0, number); List<Integer> l = query.list(); return l; } public List<Integer> findEventIdsIdentifiedByUser(Long project_id, User u) { List<ImageEvent> list = new ArrayList<ImageEvent>(); String sql = "select image_event_id from identifications i, events e, cameras c where i.image_event_id=e.id and e.camera_id = c.id and c.project_id=? and user_id=? group by e.id order by e.id"; SQLQuery sqlQuery = this.currentSession().createSQLQuery(sql); Query query = sqlQuery.setParameter(0, project_id).setParameter(1, u.getId()); List<Integer> l = query.list(); return l; } public List<Integer> findEventIdsUploadedByUser(Long project_id, User u) { List<ImageEvent> list = new ArrayList<ImageEvent>(); String sql = "select e.id from images i, events e, cameras c where i.event_id = e.id and e.camera_id = c.id and c.project_id=? and i.user_id=? group by e.id order by e.id"; SQLQuery sqlQuery = this.currentSession().createSQLQuery(sql); Query query = sqlQuery.setParameter(0, project_id).setParameter(1, u.getId()); List<Integer> l = query.list(); return l; } public List<Integer> findEventsIdsWithFewerThanIdentifications(Long project_id, int number) { List<ImageEvent> list = new ArrayList<ImageEvent>(); String sql = "select eventId from (select count(i.image_event_id) as totalActions, e.id as eventId from cameras c, events e left join identifications i on i.image_event_id = e.id where c.id = e.camera_id and c.project_id=? group by e.id ) x where x.totalActions < ? order by totalActions,eventId"; SQLQuery sqlQuery = this.currentSession().createSQLQuery(sql); Query query = sqlQuery.setParameter(0, project_id).setParameter(1, number); List<Integer> l = query.list(); return l; } public List<Integer> findFlaggedEventsIdsWithFewerThanIdentifications(Long project_id,int number) { List<ImageEvent> list = new ArrayList<ImageEvent>(); String sql = "select eventId from ( "+ "select count(i.image_event_id) as totalActions, e.id as eventId "+ "from cameras c, events e left join identifications i on i.image_event_id = e.id "+ "where c.id = e.camera_id and c.project_id=? group by e.id "+ ") x, "+ "(select image_event_id ,count(*) flags from event_review_needed, events "+ "where event_review_needed.image_event_id = events.id and event_review_needed.flagged=1 group by events.id "+ ") y where x.eventId= y.image_event_id and totalActions < flags+? order by totalActions,eventId"; SQLQuery sqlQuery = this.currentSession().createSQLQuery(sql); Query query = sqlQuery.setParameter(0, project_id).setParameter(1, number); List<Integer> l = query.list(); return l; } }