/**
* Implements operations for managing the model_nominal_label table of the aidr_predict DB
*
* @author Koushik
*/
package qa.qcri.aidr.dbmanager.ejb.remote.facade.imp;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import org.apache.log4j.Logger;
import org.hibernate.Hibernate;
import org.hibernate.criterion.Restrictions;
import qa.qcri.aidr.common.exception.PropertyNotSetException;
import qa.qcri.aidr.dbmanager.dto.DocumentDTO;
import qa.qcri.aidr.dbmanager.dto.ModelNominalLabelDTO;
import qa.qcri.aidr.dbmanager.ejb.local.facade.impl.CoreDBServiceFacadeImp;
import qa.qcri.aidr.dbmanager.ejb.remote.facade.DocumentResourceFacade;
import qa.qcri.aidr.dbmanager.ejb.remote.facade.ModelNominalLabelResourceFacade;
import qa.qcri.aidr.dbmanager.ejb.remote.facade.ModelResourceFacade;
import qa.qcri.aidr.dbmanager.entities.model.Model;
import qa.qcri.aidr.dbmanager.entities.model.ModelFamily;
import qa.qcri.aidr.dbmanager.entities.model.ModelNominalLabel;
import qa.qcri.aidr.dbmanager.entities.model.NominalLabel;
@Stateless(name = "ModelNominalLabelResourceFacadeImp")
public class ModelNominalLabelResourceFacadeImp extends CoreDBServiceFacadeImp<ModelNominalLabel, Long> implements ModelNominalLabelResourceFacade {
private Logger logger = Logger.getLogger("db-manager-log");
@EJB
private ModelResourceFacade modelEJB;
@EJB
private DocumentResourceFacade documentEJB;
protected ModelNominalLabelResourceFacadeImp() {
super(ModelNominalLabel.class);
}
@Override
public List<ModelNominalLabelDTO> getAllModelNominalLabels() {
List<ModelNominalLabelDTO> dtoList = new ArrayList<ModelNominalLabelDTO>();
try {
List<ModelNominalLabel> list = this.getAll();
if (list != null && !list.isEmpty()) {
logger.info("Fetched list size: " + list.size());
for (ModelNominalLabel m : list) {
dtoList.add(new ModelNominalLabelDTO(m));
}
}
return dtoList;
} catch (Exception e) {
logger.error("Error in getAllModelNominalLabels.");
return null;
}
}
@Override
public List<ModelNominalLabelDTO> getAllModelNominalLabelsByModelID(Long modelID, String crisisCode) {
List<ModelNominalLabelDTO> dtoList = new ArrayList<ModelNominalLabelDTO>();;
List<ModelNominalLabel> modelNominalLabelList = new ArrayList<ModelNominalLabel>();
Model model = modelEJB.getById(modelID);
if (model != null) {
logger.info("Model is not NULL in getAllModelNominalLabelsByModelID for modelID = " + modelID + ",crisis code = " + crisisCode);
Hibernate.initialize(model.getModelFamily());
try {
Boolean modelStatus = model.getModelFamily().isIsActive(); //getting model status
ModelFamily modelFamily = model.getModelFamily();
Hibernate.initialize(modelFamily.getNominalAttribute());
Long nominalAttributeId = modelFamily.getNominalAttribute().getNominalAttributeId();
//Long nominalAttributeId = model.getModelFamily().getNominalAttribute().getNominalAttributeId();
modelNominalLabelList = this.getAllByCriteria(Restrictions.eq("id.modelId", modelID));
logger.info("modelNominalLabellist size = " + (modelNominalLabelList != null ? modelNominalLabelList.size() : "null"));
for (ModelNominalLabel labelEntity : modelNominalLabelList) {
//Getting training examples for each label
int trainingSet = 0;
NominalLabel nominalLabel = labelEntity.getNominalLabel();
if (nominalLabel != null && !nominalLabel.getNominalLabelCode().equalsIgnoreCase("null")) {
try {
trainingSet = documentEJB.getDocumentCountForNominalLabelAndCrisis(nominalLabel.getNominalLabelId(),crisisCode);
} catch (Exception e) {
// TODO Auto-generated catch block
logger.error("Error in getDocumentCollectionWithNominalLabelData.", e);
}
}
// Deep copying modelNominalLabel to ModelNominalLabelDTO
Hibernate.initialize(labelEntity.getModel());
Hibernate.initialize(labelEntity.getNominalLabel());
ModelNominalLabelDTO dto = new ModelNominalLabelDTO(labelEntity);
dto.setModelStatus(modelStatus == true ? "RUNNING" : "NOT RUNNING");
dto.setNominalAttributeId(nominalAttributeId);
dto.setTrainingDocuments(trainingSet);
dtoList.add(dto);
}
} catch (Exception e) {
logger.error("Exception occured in getAllModelNominalLabelsByModelID \n\n", e);
return null;
}
}
return dtoList;
}
@Override
public void saveModelNominalLabel(ModelNominalLabelDTO modelNominalLabel) throws PropertyNotSetException {
save(modelNominalLabel.toEntity());
}
@Override
public ModelNominalLabelDTO addModelNominalLabel(ModelNominalLabelDTO modelNominalLabel) {
try {
ModelNominalLabel modelLabel = modelNominalLabel.toEntity();
em.persist(modelLabel);
em.flush();
em.refresh(modelLabel);
return new ModelNominalLabelDTO(modelLabel);
} catch (Exception e) {
logger.error("Error in addModelNominalLabel.", e);
return null;
}
}
@Override
public ModelNominalLabelDTO editModelNominalLabel(ModelNominalLabelDTO modelNominalLabel) throws PropertyNotSetException {
logger.info("Received request for: " + modelNominalLabel.getIdDTO().getNominalLabelId() + ":" + modelNominalLabel.getIdDTO().getModelId());
try {
ModelNominalLabel label = modelNominalLabel.toEntity();
ModelNominalLabel oldLabel = getByCriteria(Restrictions.eq("id", modelNominalLabel.getIdDTO().toEntity()));
if (oldLabel != null) {
oldLabel = em.merge(label);
return (oldLabel != null) ? new ModelNominalLabelDTO(oldLabel) : null;
} else {
throw new RuntimeException("Not found");
}
} catch (Exception e) {
logger.error("Exception in merging/updating nominalLabel: " + modelNominalLabel.getIdDTO().getNominalLabelId(), e);
}
return null;
}
@Override
public Integer deleteModelNominalLabel(ModelNominalLabelDTO modelNominalLabel) throws PropertyNotSetException {
if (modelNominalLabel != null) {
ModelNominalLabel managed = em.merge(modelNominalLabel.toEntity());
em.remove(managed);
return 1;
}
return 0;
}
@Override
public ModelNominalLabelDTO getModelNominalLabelByID(Long nominalLabelID) throws PropertyNotSetException {
ModelNominalLabel nb = this.getByCriteria(Restrictions.eq("id.nominalLabelId", nominalLabelID));
return nb != null ? new ModelNominalLabelDTO(nb) : null;
}
@Override
public Boolean isModelNominalLabelExists(Long nominalLabelID) throws PropertyNotSetException {
return (getModelNominalLabelByID(nominalLabelID) != null) ? true : false;
}
@Override
public void deleteModelNominalLabelByModelID(Long modelID) {
List<ModelNominalLabel> modelNominalLabelList = this.getAllByCriteria(Restrictions.eq("id.modelId", modelID));
for (ModelNominalLabel modelNominalLabel : modelNominalLabelList) {
delete(modelNominalLabel);
}
}
}