package edu.harvard.i2b2.crc.dao.setfinder;
import java.io.StringWriter;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Map;
import edu.harvard.i2b2.common.exception.I2B2DAOException;
import edu.harvard.i2b2.common.util.jaxb.JAXBUtil;
import edu.harvard.i2b2.crc.dao.CRCDAO;
import edu.harvard.i2b2.crc.dao.SetFinderDAOFactory;
import edu.harvard.i2b2.crc.datavo.CRCJAXBUtil;
import edu.harvard.i2b2.crc.datavo.i2b2result.BodyType;
import edu.harvard.i2b2.crc.datavo.i2b2result.DataType;
import edu.harvard.i2b2.crc.datavo.i2b2result.ResultEnvelopeType;
import edu.harvard.i2b2.crc.datavo.i2b2result.ResultType;
public class QueryResultPatientGenderCountGenerator extends CRCDAO implements
IResultGenerator {
public static final String RESULT_NAME = "PATIENT_GENDER_COUNT_XML";
public void generateResult(Map param) throws I2B2DAOException {
SetFinderConnection sfConn = (SetFinderConnection) param
.get("SetFinderConnection");
SetFinderDAOFactory sfDAOFactory = (SetFinderDAOFactory) param
.get("SetFinderDAOFactory");
// String patientSetId = (String)param.get("PatientSetId");
String queryInstanceId = (String) param.get("QueryInstanceId");
String TEMP_DX_TABLE = (String) param.get("TEMP_DX_TABLE");
String resultInstanceId = (String) param.get("ResultInstanceId");
this
.setDbSchemaName(sfDAOFactory.getDataSourceLookup()
.getFullSchema());
String demographics_count_sql = "select count(distince dx.patient_num) as demo_count, case when cl.name_char IS NULL then pd.sex_cd else cl.name_char end pd_demo_cd from "
+ this.getDbSchemaName()
+ "patient_dimension pd left join code_lookup cl on pd.sex_cd = cl.code_cd "
+ " and lower(cl.table_cd) = 'patient_dimension' and upper(cl.column_cd) = 'SEX_CD' ,"
+ TEMP_DX_TABLE
+ " dx where pd.patient_num = dx.patient_num"
+ " group by case when cl.name_char IS NULL then pd.sex_cd else cl.name_char end";
boolean errorFlag = false;
int totalCount = 0;
try {
log.debug("Executing[ " + demographics_count_sql + " ]");
PreparedStatement stmt = sfConn
.prepareStatement(demographics_count_sql);
ResultSet resultSet = stmt.executeQuery();
ResultType resultType = new ResultType();
resultType.setName(RESULT_NAME);
while (resultSet.next()) {
String demoCount = resultSet.getString("demo_count");
String raceCd = resultSet.getString("pd_demo_cd");
DataType mdataType = new DataType();
mdataType.setValue(demoCount);
mdataType.setColumn(raceCd);
mdataType.setType("int");
resultType.getData().add(mdataType);
}
stmt.close();
edu.harvard.i2b2.crc.datavo.i2b2result.ObjectFactory of = new edu.harvard.i2b2.crc.datavo.i2b2result.ObjectFactory();
BodyType bodyType = new BodyType();
bodyType.getAny().add(of.createResult(resultType));
ResultEnvelopeType resultEnvelop = new ResultEnvelopeType();
resultEnvelop.setBody(bodyType);
JAXBUtil jaxbUtil = CRCJAXBUtil.getJAXBUtil();
StringWriter strWriter = new StringWriter();
jaxbUtil.marshaller(of.createI2B2ResultEnvelope(resultEnvelop),
strWriter);
IXmlResultDao xmlResultDao = sfDAOFactory.getXmlResultDao();
xmlResultDao.createQueryXmlResult(resultInstanceId, strWriter
.toString());
} catch (Exception sqlEx) {
log.error("QueryResultPatientSetGenerator.generateResult:"
+ sqlEx.getMessage(), sqlEx);
throw new I2B2DAOException(
"QueryResultPatientSetGenerator.generateResult:"
+ sqlEx.getMessage(), sqlEx);
} finally {
IQueryResultInstanceDao resultInstanceDao = sfDAOFactory
.getPatientSetResultDAO();
if (errorFlag) {
resultInstanceDao.updatePatientSet(resultInstanceId,
QueryStatusTypeId.STATUSTYPE_ID_ERROR, 0);
} else {
resultInstanceDao.updatePatientSet(resultInstanceId,
QueryStatusTypeId.STATUSTYPE_ID_FINISHED, totalCount);
}
}
}
}