/** * Implements operations for managing the model_family table of the aidr_predict DB * * @author Koushik */ package qa.qcri.aidr.dbmanager.ejb.remote.facade.imp; import java.math.BigDecimal; import java.math.BigInteger; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.ejb.Stateless; import javax.persistence.NoResultException; import javax.persistence.Query; import org.apache.log4j.Logger; import org.hibernate.Criteria; import org.hibernate.Hibernate; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.criterion.Restrictions; import qa.qcri.aidr.common.exception.PropertyNotSetException; import qa.qcri.aidr.dbmanager.dto.CollectionDTO; import qa.qcri.aidr.dbmanager.dto.ModelFamilyDTO; import qa.qcri.aidr.dbmanager.dto.NominalAttributeDTO; import qa.qcri.aidr.dbmanager.dto.taggerapi.ModelWrapper; import qa.qcri.aidr.dbmanager.dto.taggerapi.TaggersForCodes; import qa.qcri.aidr.dbmanager.ejb.local.facade.impl.CoreDBServiceFacadeImp; import qa.qcri.aidr.dbmanager.ejb.remote.facade.ModelFamilyResourceFacade; import qa.qcri.aidr.dbmanager.entities.misc.Collection; import qa.qcri.aidr.dbmanager.entities.model.ModelFamily; import qa.qcri.aidr.dbmanager.entities.model.NominalAttribute; import qa.qcri.aidr.util.NativeQueryUtil; @Stateless(name="ModelFamilyResourceFacadeImp") public class ModelFamilyResourceFacadeImp extends CoreDBServiceFacadeImp<ModelFamily, Long> implements ModelFamilyResourceFacade { private static Logger logger = Logger.getLogger("db-manager-log"); public ModelFamilyResourceFacadeImp() { super(ModelFamily.class); } @Override public List<ModelFamilyDTO> getAllModelFamilies() throws PropertyNotSetException { List<ModelFamilyDTO> modelFamilyDTOList = new ArrayList<ModelFamilyDTO>(); List<ModelFamily> modelFamilyList = getAll(); if (modelFamilyList != null && !modelFamilyList.isEmpty()) { for (ModelFamily modelFamily : modelFamilyList) { //Hibernate.initialize(modelFamily.getModels()); Enlable this line if models need to be populated. modelFamilyDTOList.add(new ModelFamilyDTO(modelFamily)); } } return modelFamilyDTOList; //returns empty list if no data is found in the database } @Override public List<ModelFamilyDTO> getAllModelFamiliesByCrisis(Long crisisID) throws PropertyNotSetException { List<ModelFamilyDTO> modelFamilyDTOList = new ArrayList<ModelFamilyDTO>(); Criteria criteria = getCurrentSession().createCriteria(ModelFamily.class); criteria.add(Restrictions.eq("collection.id", crisisID)); List<ModelFamily> modelFamilyList = criteria.list(); if (modelFamilyList != null && !modelFamilyList.isEmpty()) { for (ModelFamily modelFamily : modelFamilyList) { modelFamilyDTOList.add(new ModelFamilyDTO(modelFamily)); } } return modelFamilyDTOList; //returns empty list if no data is found in the database } @Override public ModelFamilyDTO getModelFamilyByID(Long id) throws PropertyNotSetException { ModelFamily mf = this.getById(id); Hibernate.initialize(mf.getModels()); Hibernate.initialize(mf.getNominalAttribute()); return mf != null ? new ModelFamilyDTO(mf) : null; } @Override public boolean addCrisisAttribute(ModelFamilyDTO modelFamily) throws PropertyNotSetException { try { Collection collection = getEntityManager().find(Collection.class, modelFamily.getCrisisDTO().getCrisisID()); NominalAttribute attribute = getEntityManager().find(NominalAttribute.class, modelFamily.getNominalAttributeDTO().getNominalAttributeId()); modelFamily.setCrisisDTO(new CollectionDTO(collection)); modelFamily.setNominalAttributeDTO(new NominalAttributeDTO(attribute)); getEntityManager().persist(modelFamily.toEntity()); } catch (HibernateException he) { logger.error("Hibernate exception on adding ModelFamily.\n" + he.getStackTrace()); return false; } return true; } @Override public boolean deleteModelFamily(Long modelFamilyID) throws PropertyNotSetException { ModelFamily modelFamily = getEntityManager().find(ModelFamily.class, modelFamilyID); if (modelFamily != null) { try { getEntityManager().remove(modelFamily); } catch (HibernateException he) { logger.error("Hibernate exception on deleting ModelFamily using ID=" + modelFamilyID + he.getStackTrace()); return false; // hibernate delete operation failed. Details in the logs. } return true; // successfully deleted. } else { return false; // delete operation failed becuase no modelfamily is found against given ID. } } @Override public List<TaggersForCodes> getTaggersByCodes(final List<String> codes) { List<qa.qcri.aidr.dbmanager.dto.taggerapi.TaggersForCodes> result = new ArrayList<TaggersForCodes>(); String sql = "select c.code as code, " + " count(mf.modelFamilyID) as modelsCount " + " from model_family mf " + " right outer join collection c on c.id = mf.crisisID and classifier_enabled = 1" + " where c.code in :codes " + " group by mf.crisisID "; Query query = em.createNativeQuery(sql); query.setParameter("codes", codes); List<Object[]> rows = null; try { rows = query.getResultList(); } catch (NoResultException e) { logger.warn("No result for codes : " + codes); return null; } for (Object[] row : rows) { TaggersForCodes taggersForCodes = new TaggersForCodes(); taggersForCodes.setCode((String) row[0]); taggersForCodes.setCount((BigInteger) row[1]); result.add(taggersForCodes); } return result; } @Override public List<ModelWrapper> getModelFamilyAggregateDataForCollection(Long collectionId) { Map<Long, ModelWrapper> modelFamilyMap = new HashMap<Long, ModelWrapper>(); List<Long> modelFamilyIds = new ArrayList<Long>(); int index = 0; try { Query query = em.createNativeQuery(NativeQueryUtil.TRAINING_COUNT_FOR_CRISIS); query.setParameter("crisisID", collectionId); List<Object[]> rows = query.getResultList(); for (Object[] row : rows) { ModelWrapper modelWrapper = new ModelWrapper(); modelWrapper.setAttributeID(((BigInteger)row[0]).longValue()); modelWrapper.setAttribute((String)row[1]); modelWrapper.setModelFamilyID(((Integer)row[2]).longValue()); modelWrapper.setStatus(((Boolean)row[3]) == Boolean.TRUE ? "Active" : "Inactive"); modelWrapper.setTrainingExamples(((BigInteger)row[4]).longValue()); modelFamilyMap.put(modelWrapper.getModelFamilyID(), modelWrapper); modelFamilyIds.add(modelWrapper.getModelFamilyID()); } } catch (Exception e) { logger.error("exception", e); } if(modelFamilyIds.size() > 0) { try { String modelFamilyIdString = "" + modelFamilyMap.keySet(); Query query = em.createNativeQuery(NativeQueryUtil.MODEL_DETAILS_FOR_CRISIS); query.setParameter("modelFamilyIds", modelFamilyIds); List<Object[]> rows = query.getResultList(); for (Object[] row : rows) { ModelWrapper modelWrapper = modelFamilyMap.get(((Integer)row[2]).longValue()); modelWrapper.setModelID(((Integer)row[0]).longValue()); modelWrapper.setAuc((Double)row[1]); modelWrapper.setClassifiedDocuments(((BigDecimal)row[3]).longValue()); } } catch (Exception e) { logger.error("exception", e); } } List<ModelWrapper> modelWrapperList = new ArrayList<ModelWrapper>( modelFamilyMap.values()); return modelWrapperList; } }