package qa.qcri.aidr.analysis.facade.imp; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.apache.log4j.Logger; import org.hibernate.Criteria; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import qa.qcri.aidr.analysis.entity.TagData; import qa.qcri.aidr.analysis.entity.TagDataPK; import qa.qcri.aidr.analysis.facade.TagDataStatisticsResourceFacade; import qa.qcri.aidr.common.values.ReturnCode; /** * Implements the operations for the interface TagDataStatisticsResourceFacade */ @Stateless(name = "TagDataStatisticsResourceFacadeImp") public class TagDataStatisticsResourceFacadeImp implements TagDataStatisticsResourceFacade { private static Logger logger = Logger.getLogger(TagDataStatisticsResourceFacadeImp.class); @PersistenceContext(unitName = "qa.qcri.aidr.analysis-EJBS") private EntityManager em; @Override public EntityManager getEntityManager() { try { return em; } catch (Exception e) { logger.error("getEntityManager failed"); throw new HibernateException("getEntityManager failed"); } } @Override public int setEntityManager(EntityManager em) { try { if (null == this.em) { this.em = em; logger.info("EntityManager set to new value: " + this.em); return 1; } else logger.info("Skipping setter, since EntityManager already initialized to :" + this.em); return 0; } catch (Exception e) { logger.error("EntityManager setting exception : " + em, e); throw new HibernateException("setEntityManager failed"); } } @Override public Session getCurrentSession() { try { return em.unwrap(Session.class); } catch (Exception e) { logger.error("exception: ", e); throw new HibernateException("getCurrentSession failed"); } } @Override public ReturnCode writeData(TagData tagData) { try { em.persist(tagData); logger.info("Success in persisting tag data for: " + tagData.getCrisisCode() + ", " + tagData.getAttributeCode() + ", " + tagData.getLabelCode() + ", " + tagData.getTimestamp() + ", " + tagData.getGranularity() + ": " + tagData.getCount()); return ReturnCode.SUCCESS; } catch (Exception e) { logger.error("Failure in persisting tag data for: " + tagData.getCrisisCode() + ", " + tagData.getAttributeCode() + ", " + tagData.getLabelCode() + ", " + tagData.getTimestamp() + ", " + tagData.getGranularity() + ": " + tagData.getCount()); logger.error("exception: ", e); return ReturnCode.ERROR; } } @Override public TagData getSingleDataByPK(TagDataPK tagDataPK) { Criteria criteria = getCurrentSession().createCriteria(TagData.class); Criterion criterion = Restrictions.conjunction() .add(Restrictions.eq("crisisCode", tagDataPK.getCrisisCode())) .add(Restrictions.eq("timestamp", tagDataPK.getTimestamp())) .add(Restrictions.eq("granularity", tagDataPK.getGranularity())) .add(Restrictions.eq("attributeCode", tagDataPK.getAttributeCode())) .add(Restrictions.eq("labelCode", tagDataPK.getLabelCode())); criteria.add(criterion); try { TagData obj = (TagData) criteria.uniqueResult(); return obj; } catch (HibernateException e) { logger.error("error in getSingleDataByPK for crisisCode : " + tagDataPK.getCrisisCode() + " attributeCode : " + tagDataPK.getAttributeCode() + " labelCode : " +tagDataPK.getLabelCode() + "timestamp : " + tagDataPK.getTimestamp()); } return null; } @SuppressWarnings("unchecked") @Override public List<TagData> getDataByCrisis(String crisisCode) { Criteria criteria = getCurrentSession().createCriteria(TagData.class); criteria.add(Restrictions.eq("crisisCode", crisisCode)); try { List<TagData> objList = (List<TagData>) criteria.list(); return objList; } catch (HibernateException e) { logger.error("Error in getDataByCrisis for crisis : " + crisisCode); } return null; } // TODO @SuppressWarnings("unchecked") @Override public Map<String, Long> getTagCountByCrisisGranularity(String crisisCode, Long timestamp) { try { Criterion criterion = Restrictions.conjunction() .add(Restrictions.eq("crisisCode", crisisCode)) .add(Restrictions.ge("timestamp", timestamp)); List<Object> countList = getCurrentSession().createCriteria(TagData.class) .add(criterion) .setProjection(Projections.distinct(Projections.projectionList() .add(Projections.groupProperty("granularity").as("granularity")) .add(Projections.sum("count").as("count"))) ).list(); Map<String, Long> data = new HashMap<String, Long>(); for (int i = 0; i < countList.size();i++) { Object[] temp = (Object[]) countList.get(i); Long g = ((Number) temp[0]).longValue(); Long count = ((Number) temp[1]).longValue(); data.put(g.toString(), count); } return data; } catch (HibernateException e) { logger.error("Error in getTagCountByCrisisGranularity for crisisCode : " + crisisCode + " and timestamp : " + timestamp, e); } return null; } @SuppressWarnings("unchecked") @Override public List<String> getAttributesForCrisis(String crisisCode) { try { List<String> attributesList = (List<String>) getCurrentSession().createCriteria(TagData.class) .add(Restrictions.eq("crisisCode", crisisCode)) .setProjection(Projections.distinct(Projections.property("attributeCode"))).list(); return attributesList; } catch (Exception e) { logger.error("exception in getAttributesForCrisis for crisisCode : " + crisisCode, e); return null; } } @SuppressWarnings("unchecked") @Override public List<Long> getGranularitiesForCrisis(String crisisCode) { try { List<Long> gList = (List<Long>) getCurrentSession().createCriteria(TagData.class) .add(Restrictions.eq("crisisCode", crisisCode)) .setProjection(Projections.distinct(Projections.property("granularity"))).list(); return gList; } catch (Exception e) { logger.error("exception in getGranularitiesForCrisis for crisisCode : " + crisisCode, e); return null; } } @SuppressWarnings("unchecked") @Override public List<TagData> getDataByCrisisGranularity(String crisisCode, Long timestamp, Long granularity) { Criteria criteria = getCurrentSession().createCriteria(TagData.class); Criterion criterion = Restrictions.conjunction() .add(Restrictions.eq("crisisCode", crisisCode)) .add(Restrictions.ge("timestamp", timestamp)); if (granularity != null) { criterion = Restrictions.conjunction() .add(criterion) .add(Restrictions.eq("granularity", granularity)); } criteria.add(criterion); try { List<TagData> objList = (List<TagData>) criteria.list(); return objList; } catch (HibernateException e) { logger.error("exception in getDataByCrisisGranularity for crisisCode : " + crisisCode + " granularity : " + granularity, e); } return null; } @SuppressWarnings("unchecked") @Override public List<TagData> getDataByCrisisAttributeLabel(String crisisCode, String attributeCode, String labelCode) { Criteria criteria = getCurrentSession().createCriteria(TagData.class); Criterion criterion = Restrictions.conjunction() .add(Restrictions.eq("crisisCode", crisisCode)) .add(Restrictions.eq("attributeCode", attributeCode)); if (labelCode != null) { criterion = Restrictions.conjunction() .add(criterion) .add(Restrictions.eq("labelCode", labelCode)); } criteria.add(criterion); try { List<TagData> objList = (List<TagData>) criteria.list(); return objList; } catch (HibernateException e) { logger.error("exception in getDataByCrisisAttributeLabel for crisisCode : " + crisisCode + " attributeCode : " + attributeCode + " labelCode : " + labelCode, e); } return null; } @Override public List<TagData> getDataByCrisisAttributeLabelGranularity(String crisisCode, String attributeCode, String labelCode, Long granularity) { Criteria criteria = getCurrentSession().createCriteria(TagData.class); Criterion criterion = Restrictions.conjunction() .add(Restrictions.eq("crisisCode", crisisCode)) .add(Restrictions.eq("attributeCode", attributeCode)) .add(Restrictions.eq("labelCode", labelCode)) .add(Restrictions.eq("granularity", granularity)); criteria.add(criterion); try { List<TagData> objList = (List<TagData>) criteria.list(); return objList; } catch (HibernateException e) { logger.error("exception in getDataByCrisisAttributeLabelGranularity for crisisCode : " + crisisCode + " attributeCode : " + attributeCode + " labelCode : " + labelCode + " granularity : " + granularity, e); } return null; } public List<TagData> getDataByGranularityInTimeWindow(String crisisCode, String attributeCode, String labelCode, Long timestamp, Long granularity) { Criteria criteria = getCurrentSession().createCriteria(TagData.class); Criterion criterion = Restrictions.conjunction() .add(Restrictions.eq("crisisCode", crisisCode)) .add(Restrictions.eq("attributeCode", attributeCode)) .add(Restrictions.eq("granularity", granularity)) .add(Restrictions.eq("timestamp", timestamp)); if (labelCode != null) { criterion = Restrictions.conjunction() .add(criterion) .add(Restrictions.eq("labelCode", labelCode)); } criteria.add(criterion); try { List<TagData> objList = (List<TagData>) criteria.list(); return objList; } catch (HibernateException e) { logger.error("exception in getDataByGranularityInTimeWindow for crisisCode : " + crisisCode + " attributeCode : " + attributeCode + " timestamp : " + timestamp + " granularity : " + granularity, e); } return null; } @Override public List<TagData> getDataAfterTimestamp(String crisisCode, String attributeCode, String labelCode, Long timestamp) { Criteria criteria = getCurrentSession().createCriteria(TagData.class); Criterion criterion = Restrictions.conjunction() .add(Restrictions.eq("crisisCode", crisisCode)) .add(Restrictions.eq("attributeCode", attributeCode)) .add(Restrictions.ge("timestamp", timestamp)); if (labelCode != null) { criterion = Restrictions.conjunction() .add(criterion) .add(Restrictions.eq("labelCode", labelCode)); } criteria.add(criterion); try { List<TagData> objList = (List<TagData>) criteria.list(); return objList; } catch (HibernateException e) { logger.error("exception in getDataAfterTimestampGranularity for crisisCode : " + crisisCode + " attributeCode : " + attributeCode + " timestamp : " + timestamp, e); } return null; } @Override public List<TagData> getDataAfterTimestampGranularity(String crisisCode, String attributeCode, String labelCode, Long timestamp, Long granularity) { Criteria criteria = getCurrentSession().createCriteria(TagData.class); Criterion criterion = Restrictions.conjunction() .add(Restrictions.eq("crisisCode", crisisCode)) .add(Restrictions.eq("attributeCode", attributeCode)) .add(Restrictions.ge("timestamp", timestamp)) .add(Restrictions.eq("granularity", granularity)); if (labelCode != null) { criterion = Restrictions.conjunction() .add(criterion) .add(Restrictions.eq("labelCode", labelCode)); } criteria.add(criterion); try { List<TagData> objList = (List<TagData>) criteria.list(); return objList; } catch (HibernateException e) { logger.error("exception in getDataAfterTimestampGranularity for crisisCode : " + crisisCode + " attributeCode : " + attributeCode + " timestamp : " + timestamp + " granularity : " + granularity, e); } return null; } @Override public List<TagData> getDataBeforeTimestamp(String crisisCode, String attributeCode, String labelCode, Long timestamp) { Criteria criteria = getCurrentSession().createCriteria(TagData.class); Criterion criterion = Restrictions.conjunction() .add(Restrictions.eq("crisisCode", crisisCode)) .add(Restrictions.eq("attributeCode", attributeCode)) .add(Restrictions.le("timestamp", timestamp)); if (labelCode != null) { criterion = Restrictions.conjunction() .add(criterion) .add(Restrictions.eq("labelCode", labelCode)); } criteria.add(criterion); try { List<TagData> objList = (List<TagData>) criteria.list(); return objList; } catch (HibernateException e) { logger.error("exception in getDataBeforeTimestamp for crisisCode : " + crisisCode + " attributeCode : " + attributeCode + " timestamp : " + timestamp, e); } return null; } @Override public List<TagData> getDataBeforeTimestampGranularity(String crisisCode, String attributeCode, String labelCode, Long timestamp, Long granularity) { Criteria criteria = getCurrentSession().createCriteria(TagData.class); Criterion criterion = Restrictions.conjunction() .add(Restrictions.eq("crisisCode", crisisCode)) .add(Restrictions.eq("attributeCode", attributeCode)) .add(Restrictions.le("timestamp", timestamp)) .add(Restrictions.eq("granularity", granularity)); if (labelCode != null) { criterion = Restrictions.conjunction() .add(criterion) .add(Restrictions.eq("labelCode", labelCode)); } criteria.add(criterion); try { List<TagData> objList = (List<TagData>) criteria.list(); return objList; } catch (HibernateException e) { logger.error("exception in getDataBeforeTimestampGranularity for crisisCode : " + crisisCode + " attributeCode : " + attributeCode + " timestamp : " + timestamp + " granularity : " + granularity, e); } return null; } @Override public List<TagData> getDataInInterval(String crisisCode, String attributeCode, String labelCode, Long timestamp1, Long timestamp2) { Criteria criteria = getCurrentSession().createCriteria(TagData.class); Criterion criterion = Restrictions.conjunction() .add(Restrictions.eq("crisisCode", crisisCode)) .add(Restrictions.eq("attributeCode", attributeCode)) .add(Restrictions.ge("timestamp", timestamp1)) .add(Restrictions.le("timestamp", timestamp2)); if (labelCode != null) { criterion = Restrictions.conjunction() .add(criterion) .add(Restrictions.eq("labelCode", labelCode)); } criteria.add(criterion); try { List<TagData> objList = (List<TagData>) criteria.list(); return objList; } catch (HibernateException e) { logger.error("exception in getDataInInterval for crisisCode : " + crisisCode + " attributeCode : " + attributeCode + " timestamp1 : " + timestamp1 + " timestamp2 : " + timestamp2, e); } return null; } @Override public List<TagData> getDataInIntervalWithGranularity(String crisisCode, String attributeCode, String labelCode, Long timestamp1, Long timestamp2, Long granularity) { Criteria criteria = getCurrentSession().createCriteria(TagData.class); Criterion criterion = Restrictions.eq("crisisCode", crisisCode); // Now add the optional non-null criteria if (attributeCode != null) { criterion = Restrictions.conjunction() .add(criterion) .add(Restrictions.eq("attributeCode", attributeCode)); } if (labelCode != null) { criterion = Restrictions.conjunction() .add(criterion) .add(Restrictions.eq("labelCode", labelCode)); } if (granularity != null) { criterion = Restrictions.conjunction() .add(criterion) .add(Restrictions.eq("granularity", granularity)); } if (timestamp1 != null) { criterion = Restrictions.conjunction() .add(criterion) .add(Restrictions.ge("timestamp", timestamp1)); } if (timestamp2 != null) { criterion = Restrictions.conjunction() .add(criterion) .add(Restrictions.le("timestamp", timestamp2)); } criteria.add(criterion); try { List<TagData> objList = (List<TagData>) criteria.list(); return objList; } catch (HibernateException e) { logger.error("exception in getDataInIntervalWithGranularity for crisisCode : " + crisisCode + " attributeCode : " + attributeCode + " timestamp1 : " + timestamp1 + " timestamp2 : " + timestamp2 + " granularity : " + granularity, e); } return null; } }