/* * 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.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; /** * Class to build individual sections of plain pdo xml like * patient,concept,observationfact from the given {@link java.sql.ResultSet} * * $Id: I2B2PdoFactory.java,v 1.19 2009/11/14 16:53:58 rk903 Exp $ * * @author rkuttan */ public class I2B2PdoFactory { private DTOFactory dtoFactory = new DTOFactory(); /** * Inner class to build observation fact in Plain PDO format */ public class ObservationFactBuilder { /** detail flag **/ boolean obsFactDetailFlag = false; /** blob flag **/ boolean obsFactBlobFlag = false; /** status flag **/ boolean obsFactStatusFlag = false; String dbType = null; /** * Parameter constructor * * @param detailFlag * @param blobFlag * @param statusFlag */ public ObservationFactBuilder(boolean detailFlag, boolean blobFlag, boolean statusFlag, String dbType) { this.obsFactDetailFlag = detailFlag; this.obsFactBlobFlag = blobFlag; this.obsFactStatusFlag = statusFlag; this.dbType = dbType; } /** * Read one record from resultset and build observation fact * * @param rowSet * resultset * @return Observation fact set * @throws SQLException * @throws IOException */ public ObservationType buildObservationSet(ResultSet rowSet) throws SQLException, IOException { ObservationType observationFactType = new ObservationType(); PatientIdType patientIdType = new PatientIdType(); patientIdType.setValue(rowSet.getString("obs_patient_num")); observationFactType.setPatientId(patientIdType); ObservationType.EventId eventId = new ObservationType.EventId(); eventId.setValue(rowSet.getString("obs_encounter_num")); observationFactType.setEventId(eventId); ObservationType.ConceptCd conceptCd = new ObservationType.ConceptCd(); conceptCd.setValue(rowSet.getString("obs_concept_cd")); observationFactType.setConceptCd(conceptCd); ObservationType.ModifierCd modifierCd = new ObservationType.ModifierCd(); modifierCd.setValue(rowSet.getString("obs_modifier_cd")); observationFactType.setModifierCd(modifierCd); ObservationType.InstanceNum instanceNum = new ObservationType.InstanceNum(); instanceNum.setValue(rowSet.getString("obs_instance_num")); observationFactType.setInstanceNum(instanceNum); Date startDate = rowSet.getTimestamp("obs_start_date"); if (startDate != null) { observationFactType.setStartDate(dtoFactory .getXMLGregorianCalendar(startDate.getTime())); } ObservationType.ObserverCd observerCd = new ObservationType.ObserverCd(); observerCd .setValue(((rowSet.getString("obs_provider_id") != null) ? rowSet .getString("obs_provider_id") : "")); observationFactType.setObserverCd(observerCd); if (obsFactDetailFlag) { Date endDate = rowSet.getTimestamp("obs_end_date"); if (endDate != null) { observationFactType.setEndDate(dtoFactory .getXMLGregorianCalendar(endDate.getTime())); } observationFactType.setValuetypeCd(rowSet .getString("obs_valtype_cd")); observationFactType.setTvalChar((rowSet .getString("obs_tval_char") != null) ? rowSet .getString("obs_tval_char") : ""); ObservationType.NvalNum valNum = new ObservationType.NvalNum(); valNum.setValue(rowSet.getBigDecimal("obs_nval_num")); observationFactType.setNvalNum(valNum); ObservationType.ValueflagCd valueFlagCd = new ObservationType.ValueflagCd(); valueFlagCd.setValue(rowSet.getString("obs_valueflag_cd")); observationFactType.setValueflagCd(valueFlagCd); observationFactType.setQuantityNum(rowSet .getBigDecimal("obs_quantity_num")); observationFactType .setUnitsCd(rowSet.getString("obs_units_cd")); ObservationType.LocationCd locationCd = new ObservationType.LocationCd(); locationCd.setValue(rowSet.getString("obs_location_cd")); observationFactType.setLocationCd(locationCd); observationFactType.setConfidenceNum(rowSet .getBigDecimal("obs_confidence_num")); // Double confidenceNum = // rowSet.getDouble("obs_confidence_num"); } if (obsFactBlobFlag) { if (dbType.equalsIgnoreCase("POSTGRESQL")) { String clob = rowSet.getString("obs_observation_blob"); if (clob !=null) { BlobType blobType = new BlobType(); blobType.getContent().add(clob); observationFactType.setObservationBlob(blobType); } } else { Clob observationClob = rowSet.getClob("obs_observation_blob"); if (observationClob != null) { BlobType blobType = new BlobType(); blobType.getContent().add( JDBCUtil.getClobStringWithLinebreak(observationClob)); observationFactType.setObservationBlob(blobType); } } } if (obsFactStatusFlag) { if (rowSet.getTimestamp("obs_update_date") != null) { observationFactType.setUpdateDate(dtoFactory .getXMLGregorianCalendar(rowSet.getTimestamp( "obs_update_date").getTime())); } if (rowSet.getTimestamp("obs_download_date") != null) { observationFactType.setDownloadDate(dtoFactory .getXMLGregorianCalendar(rowSet.getTimestamp( "obs_download_date").getTime())); } if (rowSet.getTimestamp("obs_import_date") != null) { observationFactType.setImportDate(dtoFactory .getXMLGregorianCalendar(rowSet.getTimestamp( "obs_import_date").getTime())); } observationFactType.setSourcesystemCd(rowSet .getString("obs_sourcesystem_cd")); observationFactType.setUploadId(rowSet .getString("obs_upload_id")); } return observationFactType; } } /** * Inner class to build Patient dimension in Plain PDO format */ public class PatientBuilder { boolean patientDetailFlag = false; boolean patientBlobFlag = false; boolean patientStatusFlag = false; String dbType = null; /** * Patameter constructor * * @param detailFlag * @param blobFlag * @param statusFlag */ public PatientBuilder(boolean detailFlag, boolean blobFlag, boolean statusFlag, String dbType) { this.patientDetailFlag = detailFlag; this.patientBlobFlag = blobFlag; this.patientStatusFlag = statusFlag; this.dbType = dbType; } /** * Function reads single row from the resultset and builds patient * dimension * * @param rowSet * @return Patient dimension type * @throws SQLException * @throws IOException */ public PatientType buildPatientSet(ResultSet rowSet, List<ParamType> metaDataParamList) throws SQLException, IOException { PatientType patientDimensionType = new PatientType(); PatientIdType patientIdType = new PatientIdType(); patientIdType.setValue(rowSet.getString("patient_patient_num")); patientDimensionType.setPatientId(patientIdType); List<ParamType> paramTypeList = patientDimensionType.getParam(); ParamType paramType = null; if (patientDetailFlag) { for (Iterator<ParamType> metaParamIterator = metaDataParamList.iterator(); metaParamIterator.hasNext();) { ParamType metaParamType = metaParamIterator.next(); ParamTypeValueBuilder paramValBuilder = new ParamTypeValueBuilder(); paramTypeList.add(paramValBuilder.buildParamType(metaParamType,"patient_",null,rowSet)); } } if (patientBlobFlag) { if (dbType.equalsIgnoreCase("POSTGRESQL")) { String clob = rowSet.getString("patient_patient_blob"); if (clob !=null) { BlobType blobType = new BlobType(); blobType.getContent().add(clob); patientDimensionType.setPatientBlob(blobType); } } else { Clob patientClob = rowSet.getClob("patient_patient_blob"); if (patientClob != null) { BlobType patientBlobType = new BlobType(); patientBlobType.getContent().add( JDBCUtil.getClobStringWithLinebreak(patientClob)); patientDimensionType.setPatientBlob(patientBlobType); } } } 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 provider dimension in plain pdo format */ public class ProviderBuilder { boolean providerDetailFlag = false; boolean providerBlobFlag = false; boolean providerStatusFlag = false; String dbType = null; /** * Parameter constructor * * @param detailFlag * @param blobFlag * @param statusFlag */ public ProviderBuilder(boolean detailFlag, boolean blobFlag, boolean statusFlag, String dbType) { this.providerDetailFlag = detailFlag; this.providerBlobFlag = blobFlag; this.providerStatusFlag = statusFlag; this.dbType = dbType; } /** * Reads single row from resultset and builds provider dimension * * @param rowSet * @return * @throws SQLException * @throws IOException */ public ObserverType buildObserverSet(ResultSet rowSet) throws SQLException, IOException { 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) { if (dbType.equalsIgnoreCase("POSTGRESQL")) { String clob = rowSet.getString("provider_provider_blob"); if (clob !=null) { BlobType blobType = new BlobType(); blobType.getContent().add(clob); providerDimensionType.setObserverBlob(blobType); } } else { Clob providerClob = rowSet.getClob("provider_provider_blob"); if (providerClob != null) { BlobType providerBlobType = new BlobType(); providerBlobType.getContent().add( JDBCUtil.getClobStringWithLinebreak(providerClob)); providerDimensionType.setObserverBlob(providerBlobType); } } } 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 dimension in plain pdo format */ public class ConceptBuilder { boolean conceptDetailFlag = false; boolean conceptBlobFlag = false; boolean conceptStatusFlag = false; String dbType = null; /** * Parameter Constuctor * * @param detailFlag * @param blobFlag * @param statusFlag */ public ConceptBuilder(boolean detailFlag, boolean blobFlag, boolean statusFlag, String dbType) { this.conceptDetailFlag = detailFlag; this.conceptBlobFlag = blobFlag; this.conceptStatusFlag = statusFlag; this.dbType = dbType; } /** * Reads one row from result set and builds concept dimension * * @param rowSet * @return * @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.setConceptCd(rowSet .getString("concept_concept_cd")); conceptDimensionType.setConceptPath(rowSet .getString("concept_concept_path")); conceptDimensionType.setNameChar(rowSet .getString("concept_name_char")); } if (conceptBlobFlag) { if (dbType.equalsIgnoreCase("POSTGRESQL")) { String clob = rowSet.getString("concept_concept_blob"); if (clob !=null) { BlobType blobType = new BlobType(); blobType.getContent().add(clob); conceptDimensionType.setConceptBlob(blobType); } } else { Clob conceptClob = rowSet.getClob("concept_concept_blob"); if (conceptClob != null) { BlobType conceptBlobType = new BlobType(); conceptBlobType.getContent().add( JDBCUtil.getClobStringWithLinebreak(conceptClob)); conceptDimensionType.setConceptBlob(conceptBlobType); } } } 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 dimension in plain pdo format */ public class ModifierBuilder { boolean modifierDetailFlag = false; boolean modifierBlobFlag = false; boolean modifierStatusFlag = false; String dbType = null; /** * Parameter Constuctor * * @param detailFlag * @param blobFlag * @param statusFlag */ public ModifierBuilder(boolean detailFlag, boolean blobFlag, boolean statusFlag, String dbType) { this.modifierDetailFlag = detailFlag; this.modifierBlobFlag = blobFlag; this.modifierStatusFlag = statusFlag; this.dbType = dbType; } /** * Reads one row from result set and builds concept dimension * * @param rowSet * @return * @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.setModifierCd(rowSet .getString("modifier_modifier_cd")); modifierDimensionType.setModifierPath(rowSet .getString("modifier_modifier_path")); modifierDimensionType.setNameChar(rowSet .getString("modifier_name_char")); } if (modifierBlobFlag) { if (dbType.equalsIgnoreCase("POSTGRESQL")) { String clob = rowSet.getString("modifier_modifier_blob"); if (clob !=null) { BlobType blobType = new BlobType(); blobType.getContent().add(clob); modifierDimensionType.setModifierBlob(blobType); } } else { Clob modifierClob = rowSet.getClob("modifier_modifier_blob"); if (modifierClob != null) { BlobType modifierBlobType = new BlobType(); modifierBlobType.getContent().add( JDBCUtil.getClobStringWithLinebreak(modifierClob)); modifierDimensionType.setModifierBlob(modifierBlobType); } } } 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 visit dimension in plain pdo format */ public class EventBuilder { boolean eventDetailFlag = false; boolean eventBlobFlag = false; boolean eventStatusFlag = false; String dbType = null; public EventBuilder(boolean detailFlag, boolean blobFlag, boolean statusFlag, String dbType) { this.eventDetailFlag = detailFlag; this.eventBlobFlag = blobFlag; this.eventStatusFlag = statusFlag; this.dbType = dbType; } /** * Reads one row from result set and builds visit/event dimension * * @param rowSet * @return * @throws SQLException * @throws IOException */ public EventType buildEventSet(ResultSet rowSet,List<ParamType> metaDataParamList) throws SQLException, IOException { EventType visitDimensionType = new EventType(); PatientIdType patientIdType = new PatientIdType(); patientIdType.setValue(rowSet.getString("visit_patient_num")); visitDimensionType.setPatientId(patientIdType); EventType.EventId eventId = new EventType.EventId(); eventId.setValue(rowSet.getString("visit_encounter_num")); visitDimensionType.setEventId(eventId); if (eventDetailFlag) { 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())); } for (Iterator<ParamType> metaParamIterator = metaDataParamList.iterator(); metaParamIterator.hasNext();) { ParamType metaParamType = metaParamIterator.next(); ParamTypeValueBuilder paramValBuilder = new ParamTypeValueBuilder(); visitDimensionType.getParam().add(paramValBuilder.buildParamType(metaParamType,"visit_",null,rowSet)); } } if (eventBlobFlag) { if (dbType.equalsIgnoreCase("POSTGRESQL")) { String clob = rowSet.getString("visit_visit_blob"); if (clob !=null) { BlobType blobType = new BlobType(); blobType.getContent().add(clob); visitDimensionType.setEventBlob(blobType); } } else { Clob visitClob = rowSet.getClob("visit_visit_blob"); if (visitClob != null) { BlobType visitBlobType = new BlobType(); visitBlobType.getContent().add( JDBCUtil.getClobStringWithLinebreak(visitClob)); visitDimensionType.setEventBlob(visitBlobType); } } } 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; } } }