/*
* Copyright (c) 2006-2007 Massachusetts General Hospital
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the i2b2 Software License v1.0
* which accompanies this distribution.
*
* Contributors:
* Rajesh Kuttan
*/
package edu.harvard.i2b2.crc.dao.pdo;
import java.io.IOException;
import java.sql.Clob;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import edu.harvard.i2b2.common.util.db.JDBCUtil;
import edu.harvard.i2b2.common.util.jaxb.DTOFactory;
import edu.harvard.i2b2.crc.datavo.pdo.BlobType;
import edu.harvard.i2b2.crc.datavo.pdo.ConceptType;
import edu.harvard.i2b2.crc.datavo.pdo.EidType;
import edu.harvard.i2b2.crc.datavo.pdo.EventType;
import edu.harvard.i2b2.crc.datavo.pdo.ModifierType;
import edu.harvard.i2b2.crc.datavo.pdo.ObservationType;
import edu.harvard.i2b2.crc.datavo.pdo.ObserverType;
import edu.harvard.i2b2.crc.datavo.pdo.ParamType;
import edu.harvard.i2b2.crc.datavo.pdo.PatientIdType;
import edu.harvard.i2b2.crc.datavo.pdo.PatientType;
import edu.harvard.i2b2.crc.datavo.pdo.PidType;
import edu.harvard.i2b2.crc.datavo.pdo.PidType.PatientId;
/**
* Class to build individual sections of table pdo xml like
* patient,concept,observationfact from the given {@link java.sql.ResultSet}
* $Id: RPDRPdoFactory.java,v 1.20 2009/11/14 16:41:26 rk903 Exp $
*
* @author rkuttan
*/
public class RPDRPdoFactory {
private static DTOFactory dtoFactory = new DTOFactory();
/**
* Inner class to build observation fact in table PDO format
*/
public static class ObservationFactBuilder {
boolean obsFactDetailFlag = false;
boolean obsFactBlobFlag = false;
boolean obsFactStatusFlag = false;
public ObservationFactBuilder(boolean detailFlag, boolean blobFlag,
boolean statusFlag) {
this.obsFactDetailFlag = detailFlag;
this.obsFactBlobFlag = blobFlag;
this.obsFactStatusFlag = statusFlag;
}
/**
* Read one record from resultset and build observation fact
*
* @param rowSet
* @param source
* @return ObservationSet.Observation
* @throws SQLException
* @throws IOException
*/
public ObservationType buildObservationSet(ResultSet rowSet,
String source) throws SQLException, IOException {
ObservationType observation = new ObservationType();
PatientIdType pId = new PatientIdType();
pId.setValue(rowSet.getString("obs_patient_num"));
pId.setSource(source);
observation.setPatientId(pId);
ObservationType.EventId eventId = new ObservationType.EventId();
eventId.setValue(rowSet.getString("obs_encounter_num"));
eventId.setSource(source);
observation.setEventId(eventId);
ObservationType.ConceptCd conceptCd = new ObservationType.ConceptCd();
conceptCd.setValue(rowSet.getString("obs_concept_cd"));
conceptCd.setName(rowSet.getString("concept_name"));
observation.setConceptCd(conceptCd);
ObservationType.ModifierCd modifierCd = new ObservationType.ModifierCd();
modifierCd.setValue(rowSet.getString("obs_modifier_cd"));
modifierCd.setName(rowSet.getString("modifier_name"));
observation.setModifierCd(modifierCd);
ObservationType.InstanceNum instanceNum = new ObservationType.InstanceNum();
instanceNum.setValue(rowSet.getString("obs_instance_num"));
observation.setInstanceNum(instanceNum);
Date startDate = rowSet.getTimestamp("obs_start_date");
if (startDate != null) {
observation.setStartDate(dtoFactory
.getXMLGregorianCalendar(startDate.getTime()));
}
ObservationType.ObserverCd observerCd = new ObservationType.ObserverCd();
observerCd.setValue(rowSet.getString("obs_provider_id"));
String providerName = rowSet.getString("provider_name");
observerCd.setName((providerName != null) ? providerName : "");
observation.setObserverCd(observerCd);
if (obsFactDetailFlag) {
Date endDate = rowSet.getTimestamp("obs_end_date");
if (endDate != null) {
observation.setEndDate(dtoFactory
.getXMLGregorianCalendar(endDate.getTime()));
}
observation.setValuetypeCd(rowSet.getString("obs_valtype_cd"));
observation.setTvalChar(rowSet.getString("obs_tval_char"));
ObservationType.NvalNum nvalNum = new ObservationType.NvalNum();
nvalNum.setValue(rowSet.getBigDecimal("obs_nval_num"));
observation.setNvalNum(nvalNum);
ObservationType.ValueflagCd valueFlagCd = new ObservationType.ValueflagCd();
valueFlagCd.setValue(rowSet.getString("obs_valueflag_cd"));
observation.setValueflagCd(valueFlagCd);
observation.setQuantityNum(rowSet
.getBigDecimal("obs_quantity_num"));
observation.setUnitsCd(rowSet.getString("obs_units_cd"));
if (rowSet.getString("obs_location_cd") != null) {
ObservationType.LocationCd locationCd = new ObservationType.LocationCd();
locationCd.setValue(rowSet.getString("obs_location_cd"));
String locationName = rowSet.getString("location_name");
locationCd.setName((locationName != null) ? locationName
: "");
observation.setLocationCd(locationCd);
}
observation.setConfidenceNum(rowSet
.getBigDecimal("obs_confidence_num"));
}
if (obsFactBlobFlag) {
Clob observationClob = rowSet.getClob("obs_observation_blob");
if (observationClob != null) {
try {
BlobType blobType = new BlobType();
blobType.getContent().add(
JDBCUtil.getClobStringWithLinebreak(observationClob));
observation.setObservationBlob(blobType);
} catch (IOException ioEx) {
ioEx.printStackTrace();
throw ioEx;
}
}
}
if (obsFactStatusFlag) {
if (rowSet.getTimestamp("obs_update_date") != null) {
observation.setUpdateDate(dtoFactory
.getXMLGregorianCalendar(rowSet.getTimestamp(
"obs_update_date").getTime()));
}
if (rowSet.getDate("obs_download_date") != null) {
observation.setDownloadDate(dtoFactory
.getXMLGregorianCalendar(rowSet.getTimestamp(
"obs_download_date").getTime()));
}
if (rowSet.getDate("obs_import_date") != null) {
observation.setImportDate(dtoFactory
.getXMLGregorianCalendar(rowSet.getTimestamp(
"obs_import_date").getTime()));
}
observation.setSourcesystemCd(rowSet
.getString("obs_sourcesystem_cd"));
observation.setUploadId(rowSet.getString("obs_upload_id"));
}
return observation;
}
}
/*
* Inner class to build patient in table PDO format
*/
public static class PatientBuilder {
boolean patientDetailFlag = false;
boolean patientBlobFlag = false;
boolean patientStatusFlag = false;
public PatientBuilder(boolean detailFlag, boolean blobFlag,
boolean statusFlag) {
this.patientDetailFlag = detailFlag;
this.patientBlobFlag = blobFlag;
this.patientStatusFlag = statusFlag;
}
/**
* Read one record from resultset and build patient set
*
* @param rowSet
* @param source
* @return PatientSet.Patient
* @throws SQLException
* @throws IOException
*/
public PatientType buildPatientSet(ResultSet rowSet, String source,List<ParamType> metaDataParamList)
throws SQLException, IOException {
PatientType patientDimensionType = new PatientType();
PatientIdType patientIdType = new PatientIdType();
patientIdType.setSource(source);
patientIdType.setValue(rowSet.getString("patient_patient_num"));
patientDimensionType.setPatientId(patientIdType);
if (patientDetailFlag) {
ParamTypeValueBuilder paramValBuilder = new ParamTypeValueBuilder();
for (Iterator<ParamType> metaParamIterator = metaDataParamList.iterator(); metaParamIterator.hasNext();) {
ParamType metaParamType = metaParamIterator.next();
if (metaParamType.getType().equalsIgnoreCase("string")) {
patientDimensionType.getParam().add(paramValBuilder.buildParamType(metaParamType,"patient_","_name",rowSet));
} else {
patientDimensionType.getParam().add(paramValBuilder.buildParamType(metaParamType,"patient_",null,rowSet));
}
}
}
if (patientBlobFlag) {
if (rowSet.getClob("patient_patient_blob") != null) {
BlobType blobType = new BlobType();
blobType.getContent().add(
JDBCUtil.getClobStringWithLinebreak(rowSet
.getClob("patient_patient_blob")));
}
}
if (patientStatusFlag) {
if (rowSet.getTimestamp("patient_update_date") != null) {
patientDimensionType.setUpdateDate(dtoFactory
.getXMLGregorianCalendar(rowSet.getTimestamp(
"patient_update_date").getTime()));
}
if (rowSet.getTimestamp("patient_download_date") != null) {
patientDimensionType.setDownloadDate(dtoFactory
.getXMLGregorianCalendar(rowSet.getTimestamp(
"patient_download_date").getTime()));
}
if (rowSet.getTimestamp("patient_import_date") != null) {
patientDimensionType.setImportDate(dtoFactory
.getXMLGregorianCalendar(rowSet.getTimestamp(
"patient_import_date").getTime()));
}
patientDimensionType.setSourcesystemCd(rowSet
.getString("patient_sourcesystem_cd"));
patientDimensionType.setUploadId(rowSet
.getString("patient_upload_id"));
}
return patientDimensionType;
}
}
/*
* Inner class to build observer section in table PDO format
*/
public static class ProviderBuilder {
boolean providerDetailFlag = false;
boolean providerBlobFlag = false;
boolean providerStatusFlag = false;
public ProviderBuilder(boolean detailFlag, boolean blobFlag,
boolean statusFlag) {
this.providerDetailFlag = detailFlag;
this.providerBlobFlag = blobFlag;
this.providerStatusFlag = statusFlag;
}
/**
* Read one record from resultset and build observer set
*
* @param rowSet
* @param source
* @return ObserverSet.Observer
* @throws SQLException
* @throws IOException
*/
public ObserverType buildObserverSet(ResultSet rowSet)
throws IOException, SQLException {
ObserverType providerDimensionType = new ObserverType();
providerDimensionType.setObserverCd(rowSet
.getString("provider_provider_id"));
providerDimensionType.setObserverPath(rowSet
.getString("provider_provider_path"));
if (providerDetailFlag) {
providerDimensionType.setNameChar(rowSet
.getString("provider_name_char"));
}
if (providerBlobFlag) {
Clob providerClob = rowSet.getClob("provider_provider_blob");
if (providerClob != null) {
BlobType blobType = new BlobType();
blobType.getContent().add(
JDBCUtil.getClobStringWithLinebreak(providerClob));
providerDimensionType.setObserverBlob(blobType);
}
}
if (providerStatusFlag) {
if (rowSet.getTimestamp("provider_update_date") != null) {
providerDimensionType.setUpdateDate(dtoFactory
.getXMLGregorianCalendar(rowSet.getTimestamp(
"provider_update_date").getTime()));
}
if (rowSet.getTimestamp("provider_download_date") != null) {
providerDimensionType.setDownloadDate(dtoFactory
.getXMLGregorianCalendar(rowSet.getTimestamp(
"provider_download_date").getTime()));
}
if (rowSet.getTimestamp("provider_import_date") != null) {
providerDimensionType.setImportDate(dtoFactory
.getXMLGregorianCalendar(rowSet.getTimestamp(
"provider_import_date").getTime()));
}
providerDimensionType.setSourcesystemCd(rowSet
.getString("provider_sourcesystem_cd"));
providerDimensionType.setUploadId(rowSet
.getString("provider_upload_id"));
}
return providerDimensionType;
}
}
/*
* Inner class to build concept section in table PDO format
*/
public static class ConceptBuilder {
boolean conceptDetailFlag = false;
boolean conceptBlobFlag = false;
boolean conceptStatusFlag = false;
public ConceptBuilder(boolean detailFlag, boolean blobFlag,
boolean statusFlag) {
this.conceptDetailFlag = detailFlag;
this.conceptBlobFlag = blobFlag;
this.conceptStatusFlag = statusFlag;
}
/**
* Read one record from resultset and build concept set
*
* @param rowSet
* @param source
* @return ConceptSet.Concept
* @throws SQLException
* @throws IOException
*/
public ConceptType buildConceptSet(ResultSet rowSet)
throws SQLException, IOException {
ConceptType conceptDimensionType = new ConceptType();
conceptDimensionType.setConceptCd(rowSet
.getString("concept_concept_cd"));
if (conceptDetailFlag) {
conceptDimensionType.setConceptPath(rowSet
.getString("concept_concept_path"));
conceptDimensionType.setNameChar(rowSet
.getString("concept_name_char"));
}
if (conceptBlobFlag) {
Clob conceptClob = rowSet.getClob("concept_concept_blob");
if (conceptClob != null) {
BlobType blobType = new BlobType();
blobType.getContent().add(
JDBCUtil.getClobStringWithLinebreak(conceptClob));
conceptDimensionType.setConceptBlob(blobType);
}
}
if (conceptStatusFlag) {
if (rowSet.getTimestamp("concept_update_date") != null) {
conceptDimensionType.setUpdateDate(dtoFactory
.getXMLGregorianCalendar(rowSet.getTimestamp(
"concept_update_date").getTime()));
}
if (rowSet.getTimestamp("concept_download_date") != null) {
conceptDimensionType.setDownloadDate(dtoFactory
.getXMLGregorianCalendar(rowSet.getTimestamp(
"concept_download_date").getTime()));
}
if (rowSet.getTimestamp("concept_import_date") != null) {
conceptDimensionType.setImportDate(dtoFactory
.getXMLGregorianCalendar(rowSet.getTimestamp(
"concept_import_date").getTime()));
}
conceptDimensionType.setSourcesystemCd(rowSet
.getString("concept_sourcesystem_cd"));
conceptDimensionType.setUploadId(rowSet
.getString("concept_upload_id"));
}
return conceptDimensionType;
}
}
/*
* Inner class to build concept section in table PDO format
*/
public static class ModifierBuilder {
boolean modifierDetailFlag = false;
boolean modifierBlobFlag = false;
boolean modifierStatusFlag = false;
public ModifierBuilder(boolean detailFlag, boolean blobFlag,
boolean statusFlag) {
this.modifierDetailFlag = detailFlag;
this.modifierBlobFlag = blobFlag;
this.modifierStatusFlag = statusFlag;
}
/**
* Read one record from resultset and build concept set
*
* @param rowSet
* @param source
* @return ConceptSet.Concept
* @throws SQLException
* @throws IOException
*/
public ModifierType buildModifierSet(ResultSet rowSet)
throws SQLException, IOException {
ModifierType modifierDimensionType = new ModifierType();
modifierDimensionType.setModifierCd(rowSet
.getString("modifier_modifier_cd"));
if (modifierDetailFlag) {
modifierDimensionType.setModifierPath(rowSet
.getString("modifier_modifier_path"));
modifierDimensionType.setNameChar(rowSet
.getString("modifier_name_char"));
}
if (modifierBlobFlag) {
Clob modifierClob = rowSet.getClob("modifier_modifier_blob");
if (modifierClob != null) {
BlobType blobType = new BlobType();
blobType.getContent().add(
JDBCUtil.getClobStringWithLinebreak(modifierClob));
modifierDimensionType.setModifierBlob(blobType);
}
}
if (modifierStatusFlag) {
if (rowSet.getTimestamp("modifier_update_date") != null) {
modifierDimensionType.setUpdateDate(dtoFactory
.getXMLGregorianCalendar(rowSet.getTimestamp(
"modifier_update_date").getTime()));
}
if (rowSet.getTimestamp("modifier_download_date") != null) {
modifierDimensionType.setDownloadDate(dtoFactory
.getXMLGregorianCalendar(rowSet.getTimestamp(
"modifier_download_date").getTime()));
}
if (rowSet.getTimestamp("modifier_import_date") != null) {
modifierDimensionType.setImportDate(dtoFactory
.getXMLGregorianCalendar(rowSet.getTimestamp(
"modifier_import_date").getTime()));
}
modifierDimensionType.setSourcesystemCd(rowSet
.getString("modifier_sourcesystem_cd"));
modifierDimensionType.setUploadId(rowSet
.getString("modifier_upload_id"));
}
return modifierDimensionType;
}
}
/*
* Inner class to build event section in table PDO format
*/
public static class EventBuilder {
boolean eventDetailFlag = false;
boolean eventBlobFlag = false;
boolean eventStatusFlag = false;
public EventBuilder(boolean detailFlag, boolean blobFlag,
boolean statusFlag) {
this.eventDetailFlag = detailFlag;
this.eventBlobFlag = blobFlag;
this.eventStatusFlag = statusFlag;
}
/**
* Read one record from resultset and build event set
*
* @param rowSet
* @param source
* @return EventSet.Event
* @throws SQLException
* @throws IOException
*/
public EventType buildEventSet(ResultSet rowSet, String source,List<ParamType> metaDataParamList)
throws SQLException, IOException {
EventType visitDimensionType = new EventType();
PatientIdType patientIdType = new PatientIdType();
patientIdType.setValue(rowSet.getString("visit_patient_num"));
patientIdType.setSource(source);
visitDimensionType.setPatientId(patientIdType);
EventType.EventId eventId = new EventType.EventId();
eventId.setValue(rowSet.getString("visit_encounter_num"));
eventId.setSource(source);
visitDimensionType.setEventId(eventId);
ParamTypeValueBuilder paramValBuilder = new ParamTypeValueBuilder();
if (eventDetailFlag) {
for (Iterator<ParamType> metaParamIterator = metaDataParamList.iterator(); metaParamIterator.hasNext();) {
ParamType metaParamType = metaParamIterator.next();
if (metaParamType.getType().equalsIgnoreCase("string")) {
visitDimensionType.getParam().add(paramValBuilder.buildParamType(metaParamType,"visit_","_name",rowSet));
} else {
visitDimensionType.getParam().add(paramValBuilder.buildParamType(metaParamType,"visit_",null,rowSet));
}
}
Date startDate = rowSet.getTimestamp("visit_start_date");
if (startDate != null) {
visitDimensionType.setStartDate(dtoFactory
.getXMLGregorianCalendar(startDate.getTime()));
}
Date endDate = rowSet.getTimestamp("visit_end_date");
if (endDate != null) {
visitDimensionType.setEndDate(dtoFactory
.getXMLGregorianCalendar(endDate.getTime()));
}
}
if (eventBlobFlag) {
Clob visitClob = rowSet.getClob("visit_visit_blob");
if (visitClob != null) {
BlobType blobType = new BlobType();
blobType.getContent()
.add(JDBCUtil.getClobStringWithLinebreak(visitClob));
visitDimensionType.setEventBlob(blobType);
}
}
if (eventStatusFlag) {
if (rowSet.getTimestamp("visit_update_date") != null) {
visitDimensionType.setUpdateDate(dtoFactory
.getXMLGregorianCalendar(rowSet.getTimestamp(
"visit_update_date").getTime()));
}
if (rowSet.getTimestamp("visit_download_date") != null) {
visitDimensionType.setDownloadDate(dtoFactory
.getXMLGregorianCalendar(rowSet.getTimestamp(
"visit_download_date").getTime()));
}
if (rowSet.getTimestamp("visit_import_date") != null) {
visitDimensionType.setImportDate(dtoFactory
.getXMLGregorianCalendar(rowSet.getTimestamp(
"visit_import_date").getTime()));
}
visitDimensionType.setSourcesystemCd(rowSet
.getString("visit_sourcesystem_cd"));
visitDimensionType.setUploadId(rowSet
.getString("visit_upload_id"));
}
return visitDimensionType;
}
}
/*
* Inner class to build pid section in table PDO format
*/
public static class PidBuilder {
boolean pmDetailFlag = false;
boolean pmBlobFlag = false;
boolean pmStatusFlag = false;
public PidBuilder(boolean detailFlag, boolean blobFlag,
boolean statusFlag) {
this.pmDetailFlag = detailFlag;
this.pmBlobFlag = blobFlag;
this.pmStatusFlag = statusFlag;
}
/**
* Read one record from resultset and build concept set
*
* @param rowSet
* @param source
* @return ConceptSet.Concept
* @throws SQLException
* @throws IOException
*/
public PidType buildPidSet(ResultSet rowSet) throws SQLException,
IOException {
PidType.PatientMapId patientMapType = new PidType.PatientMapId();
patientMapType.setValue(rowSet.getString("pm_patient_ide"));
patientMapType.setSource(rowSet.getString("pm_patient_ide_source"));
PatientId patientId = new PatientId();
patientId.setValue(rowSet.getString("pm_patient_num"));
PidType pidType = new PidType();
pidType.setPatientId(patientId);
pidType.getPatientMapId().add(patientMapType);
// patientMapType.setValue(rowSet.getString("pm_patient_num"));
if (pmDetailFlag) {
patientMapType.setStatus(rowSet
.getString("pm_patient_ide_status"));
}
if (pmBlobFlag) {
; // no blob field in the mapping table
}
if (pmStatusFlag) {
if (rowSet.getTimestamp("pm_update_date") != null) {
patientMapType.setUpdateDate(dtoFactory
.getXMLGregorianCalendar(rowSet.getTimestamp(
"pm_update_date").getTime()));
}
if (rowSet.getTimestamp("pm_download_date") != null) {
patientMapType.setDownloadDate(dtoFactory
.getXMLGregorianCalendar(rowSet.getTimestamp(
"pm_download_date").getTime()));
}
if (rowSet.getTimestamp("pm_import_date") != null) {
patientMapType.setImportDate(dtoFactory
.getXMLGregorianCalendar(rowSet.getTimestamp(
"pm_import_date").getTime()));
}
patientMapType.setSourcesystemCd(rowSet
.getString("pm_sourcesystem_cd"));
patientMapType.setUploadId(rowSet.getString("pm_upload_id"));
}
return pidType;
}
}
/*
* Inner class to build pid section in table PDO format
*/
public static class EidBuilder {
boolean pmDetailFlag = false;
boolean pmBlobFlag = false;
boolean pmStatusFlag = false;
public EidBuilder(boolean detailFlag, boolean blobFlag,
boolean statusFlag) {
this.pmDetailFlag = detailFlag;
this.pmBlobFlag = blobFlag;
this.pmStatusFlag = statusFlag;
}
/**
* Read one record from resultset and build concept set
*
* @param rowSet
* @param source
* @return ConceptSet.Concept
* @throws SQLException
* @throws IOException
*/
public EidType buildEidSet(ResultSet rowSet) throws SQLException,
IOException {
EidType.EventMapId eventMapType = new EidType.EventMapId();
eventMapType.setValue(rowSet.getString("em_encounter_ide"));
eventMapType.setSource(rowSet.getString("em_encounter_ide_source"));
eventMapType.setPatientId(rowSet.getString("em_patient_ide"));
eventMapType.setPatientIdSource(rowSet
.getString("em_patient_ide_source"));
EidType.EventId eventId = new EidType.EventId();
eventId.setValue(rowSet.getString("em_encounter_num"));
EidType eidType = new EidType();
eidType.setEventId(eventId);
eidType.getEventMapId().add(eventMapType);
// patientMapType.setValue(rowSet.getString("pm_patient_num"));
if (pmDetailFlag) {
eventMapType.setStatus(rowSet
.getString("em_encounter_ide_status"));
eventId.setStatus(eventMapType.getStatus());
}
if (pmBlobFlag) {
; // no blob field in the mapping table
}
if (pmStatusFlag) {
if (rowSet.getTimestamp("em_update_date") != null) {
eventMapType.setUpdateDate(dtoFactory
.getXMLGregorianCalendar(rowSet.getTimestamp(
"em_update_date").getTime()));
eventId.setUpdateDate(eventMapType.getUpdateDate());
}
if (rowSet.getTimestamp("em_download_date") != null) {
eventMapType.setDownloadDate(dtoFactory
.getXMLGregorianCalendar(rowSet.getTimestamp(
"em_download_date").getTime()));
eventId.setDownloadDate(eventMapType.getDownloadDate());
}
if (rowSet.getTimestamp("em_import_date") != null) {
eventMapType.setImportDate(dtoFactory
.getXMLGregorianCalendar(rowSet.getTimestamp(
"em_import_date").getTime()));
eventId.setImportDate(eventMapType.getImportDate());
}
eventMapType.setSourcesystemCd(rowSet
.getString("em_sourcesystem_cd"));
eventId.setSourcesystemCd(eventMapType.getSourcesystemCd());
eventMapType.setUploadId(rowSet.getString("em_upload_id"));
eventId.setUploadId(eventMapType.getUploadId());
}
//
return eidType;
}
}
}