Commit 76f17a41 authored by R.W.Majeed's avatar R.W.Majeed

allow DataSource in constructors in addition to property configuration

parent dbeaa19e
Changelog
i2b2 integration constructors also accept DataSource for database connections.
......@@ -34,6 +34,8 @@ import java.util.Objects;
import java.util.Set;
import java.util.logging.Logger;
import javax.sql.DataSource;
import de.sekmi.histream.Modifier;
import de.sekmi.histream.Observation;
import de.sekmi.histream.ObservationException;
......@@ -84,14 +86,13 @@ public class I2b2Inserter extends AbstractObservationHandler implements Observat
private int insertCount;
public I2b2Inserter(Map<String,String> config) throws ClassNotFoundException, SQLException{
this.nullUnitCd = "@"; // technically, null is allowed, but the demodata uses both '@' and ''
this.nullLocationCd = "@"; // technically, null is allowed, but the demodata only uses '@'
this.nullValueFlagCd = "@";// technically, null is allowed, but the demodata uses both '@' and ''
// TODO nullBlob (technically null allowed, but '' is used in demodata)
this.nullModifierCd = "@"; // null not allowed, @ is used in demodata
this.nullValueTypeCd = "@"; // TODO check database
insertCount = 0;
open(config);
db = PostgresExtension.getConnection(config, new String[]{"jdbc.","data.jdbc."});
initialize(config);
}
public I2b2Inserter(DataSource ds, Map<String,String> config) throws SQLException{
db = ds.getConnection();
initialize(config);
}
......@@ -168,18 +169,23 @@ public class I2b2Inserter extends AbstractObservationHandler implements Observat
}
/**
* Opens a database connection and prepares statements
* Initialize the database connection
* @throws SQLException if preparation/initialisation failed
* @throws ClassNotFoundException if database driver not found
*/
private void open(Map<String,String> props)throws SQLException, ClassNotFoundException{
db = PostgresExtension.getConnection(props, new String[]{"jdbc.","data.jdbc."});
db.setAutoCommit(false);
private void initialize(Map<String,String> props)throws SQLException{
this.nullUnitCd = "@"; // technically, null is allowed, but the demodata uses both '@' and ''
this.nullLocationCd = "@"; // technically, null is allowed, but the demodata only uses '@'
this.nullValueFlagCd = "@";// technically, null is allowed, but the demodata uses both '@' and ''
// TODO nullBlob (technically null allowed, but '' is used in demodata)
this.nullModifierCd = "@"; // null not allowed, @ is used in demodata
this.nullValueTypeCd = "@"; // TODO check database
this.nullProviderId = props.get("nullProvider");
if( this.nullProviderId == null ){
log.warning("property 'nullProvider' missing, using '@' (may violate foreign keys)");
this.nullProviderId = "@";
}
insertCount = 0;
db.setAutoCommit(false);
prepareStatements(props);
}
......
......@@ -27,9 +27,10 @@ import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Map;
import java.util.Objects;
import java.util.Properties;
import javax.sql.DataSource;
import de.sekmi.histream.DateTimeAccuracy;
import de.sekmi.histream.Extension;
import de.sekmi.histream.Plugin;
......@@ -97,10 +98,27 @@ public abstract class PostgresExtension<T> implements Extension<T>, Plugin {
);
}
/**
* Open a database connection using configuration properties
* with the given prefixes.
* @param propertyPrefixes prefix to the configuration properties
* @throws ClassNotFoundException if the database driver could not be loaded
* @throws SQLException any SQL exceptions
*/
protected void openDatabase(String[] propertyPrefixes) throws ClassNotFoundException, SQLException{
db = getConnection(config, propertyPrefixes);
prepareStatements();
}
/**
* Open a database connection using a data source
* @param ds data source
* @throws SQLException SQL exceptions
*/
protected void openDatabase(DataSource ds) throws SQLException{
db = ds.getConnection();
prepareStatements();
}
@Override
public void close()throws IOException{
......
......@@ -36,11 +36,7 @@ import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sql.DataSource;
import de.sekmi.histream.DateTimeAccuracy;
import de.sekmi.histream.Observation;
......@@ -125,19 +121,33 @@ public class PostgresPatientStore extends PostgresExtension<I2b2Patient> impleme
public PostgresPatientStore(Map<String,String> configuration) throws ClassNotFoundException, SQLException {
super(configuration);
this.projectId = config.get("project");
if( projectId == null ){
log.warning("property project is null, some things might fail");
}
openDatabase(new String[]{"jdbc.","data.jdbc."});
initialize();
}
/**
* Create a patient store using a {@link DataSource}.
* The project id must be specified with the key {@code project}.
* @param ds data source for the connection
* @param configuration configuration settings
* @throws SQLException SQL error
*/
public PostgresPatientStore(DataSource ds, Map<String,String> configuration) throws SQLException{
super(configuration);
this.projectId = config.get("project");
openDatabase(ds);
initialize();
}
private void initialize() throws SQLException{
this.idSourceDefault = "HIVE";
this.idSourceSeparator = ':';
// this.autoInsertSourceId = "HS.auto";
patientCache = new Hashtable<>(1000);
idCache = new Hashtable<>(1000);
openDatabase(new String[]{"jdbc.","data.jdbc."});
loadMaxPatientNum();
batchLoad();
}
private I2b2Patient getCached(int patient_num){
return patientCache.get(patient_num);
}
......@@ -167,6 +177,9 @@ public class PostgresPatientStore extends PostgresExtension<I2b2Patient> impleme
protected void prepareStatements()throws SQLException{
db.setAutoCommit(true);
if( projectId == null ){
log.warning("property project is null, some things might fail");
}
// TODO: use prefix from configuration to specify tablespace
insert = db.prepareStatement("INSERT INTO patient_dimension(patient_num, import_date, sourcesystem_cd) VALUES(?,current_timestamp,?)");
insertIde = db.prepareStatement("INSERT INTO patient_mapping(patient_ide, patient_ide_source, patient_num, patient_ide_status, project_id, import_date, download_date, sourcesystem_cd) values (?,?,?,?,'"+projectId+"',current_timestamp,?,?)");
......
......@@ -36,6 +36,8 @@ import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sql.DataSource;
import de.sekmi.histream.DateTimeAccuracy;
import de.sekmi.histream.Observation;
import de.sekmi.histream.ext.ExternalSourceType;
......@@ -80,21 +82,46 @@ public class PostgresVisitStore extends PostgresExtension<I2b2Visit>{
private PreparedStatement deleteSource;
private PreparedStatement deleteMapSource;
/**
* Create a visit store using configuration settings.
* The project id must be specified with the key {@code project}.
* JDBC connection configuration is specified with the key
* prefixes {@code jdbc.*} and {@code data.jdbc.*}
* @param configuration key value pairs
* @throws ClassNotFoundException database driver not found
* @throws SQLException SQL exceptions
*/
public PostgresVisitStore(Map<String,String> configuration) throws ClassNotFoundException, SQLException {
super(configuration);
this.projectId = config.get("project");
openDatabase(new String[]{"jdbc.","data.jdbc."});
initialize();
}
/**
* Create a visit store using a {@link DataSource}.
* The project id must be specified with the key {@code project}.
* @param ds data source for the connection
* @param configuration configuration settings
* @throws SQLException SQL error
*/
public PostgresVisitStore(DataSource ds, Map<String,String> configuration) throws SQLException{
super(configuration);
this.projectId = config.get("project");
openDatabase(ds);
initialize();
}
private void initialize() throws SQLException{
visitCache = new Hashtable<>();
idCache = new Hashtable<>();
projectId = config.get("project");
idSourceDefault = "HIVE";
idSourceSeparator = ':';
openDatabase(new String[]{"jdbc.","data.jdbc."});
db.setAutoCommit(true);
loadMaxEncounterNum();
batchLoad();
}
@Override
protected void prepareStatements() throws SQLException {
// TODO: use prefix from configuration to specify tablespace
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment