package org.ohdsi.rabbitInAHat.dataModel; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Map; import javax.swing.JOptionPane; import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVRecord; public class StemTableAdd { public static void addStemTable(ETL etl) { Database sourceDatabase = etl.getSourceDatabase(); Database targetDatabase = etl.getTargetDatabase(); InputStream tableStream; InputStream mappingStream; if (targetDatabase.getDbName().toLowerCase().equals("cdmv5.0.1")) { tableStream = StemTableAdd.class.getResourceAsStream("StemTableV5.0.1.csv"); mappingStream = StemTableAdd.class.getResourceAsStream("StemTableDefaultMappingV5.0.1.csv"); } else { JOptionPane.showMessageDialog(null, "No stem table definition available for " + targetDatabase.getDbName(), "Error", JOptionPane.ERROR_MESSAGE); return; } try { Table sourceStemTable = new Table(); sourceStemTable.setStem(true); for (CSVRecord row : CSVFormat.RFC4180.withHeader().parse(new InputStreamReader(tableStream))) { if (sourceStemTable.getName() == null) sourceStemTable.setName(row.get("TABLE_NAME").toLowerCase()); Field field = new Field(row.get("COLUMN_NAME").toLowerCase(), sourceStemTable); field.setNullable(row.get("IS_NULLABLE").equals("YES")); field.setType(row.get("DATA_TYPE")); field.setDescription(row.get("DESCRIPTION")); field.setStem(true); sourceStemTable.getFields().add(field); } sourceStemTable.setDb(sourceDatabase); sourceDatabase.getTables().add(sourceStemTable); Table targetStemTable = new Table(sourceStemTable); targetStemTable.setDb(targetDatabase); targetDatabase.getTables().add(targetStemTable); Mapping<Table> mapping = etl.getTableToTableMapping(); Map<String, Table> nameToTable = new HashMap<String, Table>(); for (CSVRecord row : CSVFormat.RFC4180.withHeader().parse(new InputStreamReader(mappingStream))) { String targetTableName = row.get("TARGET_TABLE"); Table targetTable = nameToTable.get(targetTableName); if (targetTable == null) { targetTable = targetDatabase.getTableByName(targetTableName); mapping.addSourceToTargetMap(sourceStemTable, targetTable); nameToTable.put(targetTableName, targetTable); } Mapping<Field> fieldToFieldMapping = etl.getFieldToFieldMapping(sourceStemTable, targetTable); Field sourceField = sourceStemTable.getFieldByName(row.get("SOURCE_FIELD")); Field targetField = targetTable.getFieldByName(row.get("TARGET_FIELD")); fieldToFieldMapping.addSourceToTargetMap(sourceField, targetField); } } catch (IOException e) { throw new RuntimeException(e.getMessage()); } } }