package edu.harvard.i2b2.crc.ejb.analysis;
import java.util.Date;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.BeanFactory;
import edu.harvard.i2b2.common.exception.I2B2DAOException;
import edu.harvard.i2b2.crc.dao.SetFinderDAOFactory;
import edu.harvard.i2b2.crc.dao.setfinder.IQueryInstanceDao;
import edu.harvard.i2b2.crc.dao.setfinder.IQueryResultInstanceDao;
import edu.harvard.i2b2.crc.datavo.db.QtQueryInstance;
import edu.harvard.i2b2.crc.datavo.db.QtQueryResultInstance;
import edu.harvard.i2b2.crc.datavo.db.QtQueryStatusType;
import edu.harvard.i2b2.crc.datavo.db.StatusEnum;
import edu.harvard.i2b2.crc.datavo.setfinder.query.ResultOutputOptionListType;
import edu.harvard.i2b2.crc.datavo.setfinder.query.ResultOutputOptionType;
import edu.harvard.i2b2.crc.datavo.setfinder.query.UserType;
import edu.harvard.i2b2.crc.util.QueryProcessorUtil;
public class QueryInstance {
private static Log log = LogFactory.getLog(QueryInstance.class);
SetFinderDAOFactory sfDAOFactory = null;
public QueryInstance(SetFinderDAOFactory sfDAOFactory) {
this.sfDAOFactory = sfDAOFactory;
}
public String saveInstanceAndResultInstance(String queryMasterId,
UserType userType, String queueName,
ResultOutputOptionListType resultOptionList)
throws I2B2DAOException {
// create query instance
IQueryInstanceDao queryInstanceDao = sfDAOFactory.getQueryInstanceDAO();
// UserType userType = getUserTypeFromSetfinderHeader(xmlRequest);
String userId = userType.getLogin();
String groupId = userType.getGroup();
String queryInstanceId = queryInstanceDao.createQueryInstance(
queryMasterId, userId, groupId, queueName, StatusEnum.QUEUED
.ordinal());
log.debug("New Query instance id " + queryInstanceId);
IQueryResultInstanceDao patientSetResultDao = sfDAOFactory
.getPatientSetResultDAO();
String patientSetId = null;
if (resultOptionList != null
&& resultOptionList.getResultOutput() != null
&& resultOptionList.getResultOutput().size() > 0) {
for (ResultOutputOptionType resultOption : resultOptionList
.getResultOutput()) {
log.debug("Patient result ID [" + resultOption.getName()
+ "] for query instance= " + queryInstanceId);
patientSetId = patientSetResultDao.createPatientSet(
queryInstanceId, resultOption.getName());
log.debug("Patient Set ID [" + patientSetId
+ "] for query instance= " + queryInstanceId);
}
} else {
QueryProcessorUtil qp = QueryProcessorUtil.getInstance();
BeanFactory bf = qp.getSpringBeanFactory();
String defaultResultType = (String) bf
.getBean(QueryProcessorUtil.DEFAULT_SETFINDER_RESULT_BEANNAME);
patientSetId = patientSetResultDao.createPatientSet(
queryInstanceId, defaultResultType);
log.debug("Patient Set ID [" + patientSetId
+ "] for query instance= " + queryInstanceId);
}
return queryInstanceId;
}
public void updateInstanceStatus(String queryInstanceId, String statusType,
String message) throws I2B2DAOException {
// get query instance
// update the status
IQueryInstanceDao queryInstanceDao = sfDAOFactory.getQueryInstanceDAO();
QtQueryInstance qtQueryInstance = queryInstanceDao
.getQueryInstanceByInstanceId(queryInstanceId);
qtQueryInstance.setEndDate(new Date(System.currentTimeMillis()));
qtQueryInstance.setMessage(message);
QtQueryStatusType qtQueryStatusType = new QtQueryStatusType();
qtQueryStatusType.setStatusTypeId(StatusEnum.valueOf(statusType)
.ordinal());
qtQueryInstance.setQtQueryStatusType(qtQueryStatusType);
queryInstanceDao.update(qtQueryInstance, true);
}
public void updateResultInstanceStatusByInstanceId(String queryInstanceId,
String statusType, int setSize, String statusMsg) {
if (statusMsg == null) {
statusMsg = "";
}
IQueryResultInstanceDao patientSetResultDao = sfDAOFactory
.getPatientSetResultDAO();
List<QtQueryResultInstance> resultInstanceList = patientSetResultDao
.getResultInstanceList(queryInstanceId);
// iterate the list and update the status
for (QtQueryResultInstance singleResultInstance : resultInstanceList) {
updateResultInstanceStatus(singleResultInstance
.getResultInstanceId(), StatusEnum.valueOf(statusType)
.ordinal(), statusMsg, setSize);
}
}
public void updateResultInstanceStatus(String resultInstanceId,
int statusTypeId, String statusMsg, int setSize) {
// get query result instance
// update result instance status
IQueryResultInstanceDao patientSetResultDao = sfDAOFactory
.getPatientSetResultDAO();
patientSetResultDao.updatePatientSet(resultInstanceId, statusTypeId,
statusMsg, setSize, 0, "");
}
}