package edu.harvard.i2b2.crc.loader.dao;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Types;
import java.util.HashMap;
import java.util.Map;
import javax.sql.DataSource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.object.BatchSqlUpdate;
import edu.harvard.i2b2.common.exception.I2B2Exception;
import edu.harvard.i2b2.crc.loader.datavo.loader.DataSourceLookup;
import edu.harvard.i2b2.crc.datavo.pdo.EventType;
import edu.harvard.i2b2.crc.datavo.pdo.ParamType;
/**
* Encounter mapping and Visit data access object.
*
* @author rk903
*/
public class VisitDAO extends CRCLoaderDAO implements IVisitDAO {
private int DB_BATCH_INSERT_SIZE = 2000;
private static Log log = LogFactory.getLog(VisitDAO.class);
private DataSourceLookup dataSourceLookup = null;
public VisitDAO(DataSourceLookup dataSourceLookup, DataSource ds) {
setDataSource(ds);
setDbSchemaName(dataSourceLookup.getFullSchema());
this.dataSourceLookup = dataSourceLookup;
}
public int getRecordCountByUploadId(int uploadId) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(this.getDataSource());
int insertCount = jdbcTemplate.queryForInt(
"select count(1) from " + this.getDbSchemaName()
+ "visit_dimension where upload_id =?",
new Object[] { uploadId });
return insertCount;
}
/**
* Create batch insert handle for temp observation fact table.
*
* @param tempTableName
* @return
*/
public TempVisitDimensionInsertHandler createTempVisitDimensionInsert(
String tempTableName) {
TempEncounterVisitInsert tempEncounterVisitInsert = new TempEncounterVisitInsert(
getDataSource(), tempTableName, this.getDbSchemaName());
tempEncounterVisitInsert.setBatchSize(DB_BATCH_INSERT_SIZE);
return new TempVisitDimensionInsertHandler(tempEncounterVisitInsert);
}
/**
* Function to create temp visit dimension table using stored proc.
*
* @param tempTableName
* @throws Exception
*/
public void createTempTable(String tempTableName) throws I2B2Exception {
Connection conn = null;
try {
conn = this.getDataSource().getConnection();
CallableStatement callStmt = conn.prepareCall("{call "
+ this.getDbSchemaName() + "CREATE_TEMP_VISIT_TABLE(?,?)}");
callStmt.setString(1, tempTableName);
callStmt.registerOutParameter(2, java.sql.Types.VARCHAR);
callStmt.execute();
this.getSQLServerProcedureError(dataSourceLookup.getServerType(),
callStmt, 2);
} catch (SQLException sqlEx) {
sqlEx.printStackTrace();
throw new I2B2Exception(
"SQLException occured" + sqlEx.getMessage(), sqlEx);
} catch (Exception ex) {
ex.printStackTrace();
throw new I2B2Exception("Exception occured" + ex.getMessage(), ex);
} finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException sqlEx) {
sqlEx.printStackTrace();
log.error("Error while closing connection", sqlEx);
}
}
}
}
/**
* Function to create new encounter/visit from temp_visit_dimension table
* using stored proc.
*
* @param tempTableName
* @throws Exception
*/
public void createVisitFromTempTable(String tempTableName, int uploadId)
throws I2B2Exception {
Connection conn = null;
try {
conn = this.getDataSource().getConnection();
CallableStatement callStmt = conn.prepareCall("{call "
+ this.getDbSchemaName()
+ "INSERT_ENCOUNTERVISIT_FROMTEMP(?,?,?)}");
callStmt.setString(1, tempTableName);
callStmt.setInt(2, uploadId);
callStmt.registerOutParameter(3, java.sql.Types.VARCHAR);
callStmt.execute();
this.getSQLServerProcedureError(dataSourceLookup.getServerType(),
callStmt, 3);
} catch (SQLException sqlEx) {
sqlEx.printStackTrace();
throw new I2B2Exception(
"SQLException occured" + sqlEx.getMessage(), sqlEx);
} catch (Exception ex) {
ex.printStackTrace();
throw new I2B2Exception("Exception occured" + ex.getMessage(), ex);
} finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException sqlEx) {
sqlEx.printStackTrace();
log.error("Error while closing connection", sqlEx);
}
}
}
}
// ************* Operation Objects section ***************
/**
* <code>TempEncounterVisitInsert</code> Insert Object.
*/
protected class TempEncounterVisitInsert extends BatchSqlUpdate {
/**
* Create a new instance of TempEncounterVisitInsert.
*
* @param ds
* the DataSource to use for the insert
*/
protected TempEncounterVisitInsert(DataSource ds, String tempTableName,
String schemaName) {
super(ds, "INSERT INTO " + schemaName + tempTableName + " ("
+ "encounter_id," + "encounter_id_source," + "patient_id,"
+ "patient_id_source," + "inout_cd," + "location_cd,"
+ "location_path," + "start_date," + "end_date,"
+ "visit_blob," + "update_date," + "download_date,"
+ "import_date," + "sourcesystem_cd)"
+ " VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
declareParameter(new SqlParameter(Types.VARCHAR));
declareParameter(new SqlParameter(Types.VARCHAR));
declareParameter(new SqlParameter(Types.VARCHAR));
declareParameter(new SqlParameter(Types.VARCHAR));
declareParameter(new SqlParameter(Types.VARCHAR));
declareParameter(new SqlParameter(Types.VARCHAR));
declareParameter(new SqlParameter(Types.VARCHAR));
declareParameter(new SqlParameter(Types.TIMESTAMP));
declareParameter(new SqlParameter(Types.TIMESTAMP));
declareParameter(new SqlParameter(Types.LONGVARCHAR));
declareParameter(new SqlParameter(Types.TIMESTAMP));
declareParameter(new SqlParameter(Types.TIMESTAMP));
declareParameter(new SqlParameter(Types.TIMESTAMP));
declareParameter(new SqlParameter(Types.VARCHAR));
compile();
}
protected void insert(EventType event) {
Map<String, ParamType> paramMap = null;
if (event.getParam() != null) {
paramMap = buildNVParam(event.getParam());
} else {
paramMap = new HashMap<String, ParamType>();
}
Object[] objs = new Object[] {
// encounterVisitMap.get("encounter_ide"),
event.getEventId().getValue(),
// encounterVisitMap.get("encounter_ide_source"),
event.getEventId().getSource(),
// encounterVisitMap.get("patient_ide"),
(event.getPatientId() != null) ? event.getPatientId()
.getValue() : null,
// encounterVisitMap.get("patient_ide_source"),
(event.getPatientId() != null) ? event.getPatientId()
.getSource() : null,
// encounterVisitMap.get("inout_cd"),
(paramMap.get("inout_cd") != null) ? paramMap.get(
"inout_cd").getValue() : null,
// encounterVisitMap.get("location_cd"),
(paramMap.get("location_cd") != null) ? paramMap.get(
"location_cd").getValue() : null,
// encounterVisitMap.get("location_path"),
(paramMap.get("location_path") != null) ? paramMap.get(
"location_path").getValue() : null,
// encounterVisitMap.get("start_date"),
(event.getStartDate() != null) ? event.getStartDate()
.toGregorianCalendar().getTime() : null,
// encounterVisitMap.get("end_date"),
(event.getEndDate() != null) ? event.getEndDate()
.toGregorianCalendar().getTime() : null,
// encounterVisitMap.get("visit_blob"),
(event.getEventBlob() != null) ? event.getEventBlob()
.getContent().get(0).toString() : null,
// encounterVisitMap.get("update_date"),
(event.getUpdateDate() != null) ? event.getUpdateDate()
.toGregorianCalendar().getTime() : null,
// encounterVisitMap.get("download_date"),
(event.getDownloadDate() != null) ? event.getDownloadDate()
.toGregorianCalendar().getTime() : null,
// encounterVisitMap.get("import_date"),
(event.getImportDate() != null) ? event.getImportDate()
.toGregorianCalendar().getTime() : null,
// encounterVisitMap.get("source_system_cd")
event.getSourcesystemCd() };
super.update(objs);
}
}
}