/*
* #%L
* NICTA t3as UMLS CUI to SNOMED CT Lookup
* %%
* Copyright (C) 2014 NICTA
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
*
* Additional permission under GNU GPL version 3 section 7
*
* If you modify this Program, or any covered work, by linking or combining
* it with H2, GWT, or JavaBeans Activation Framework (JAF) (or a
* modified version of those libraries), containing parts covered by the
* terms of the H2 License, the GWT Terms, or the Common Development and
* Distribution License (CDDL) version 1.0 ,the licensors of this Program
* grant you additional permission to convey the resulting work.
* #L%
*/
package org.t3as.snomedct.lookup;
import com.google.common.base.Charsets;
import com.google.common.base.Joiner;
import org.h2.jdbcx.JdbcConnectionPool;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;
import static com.google.common.io.Resources.getResource;
import static com.google.common.io.Resources.readLines;
public class CreateLookupDb implements AutoCloseable {
private static final String INSERT_SQL =
"insert into snomed (snomedid,cui,termType,mrrank,description) values (?,?,?,?,?)";
private final File umlsMetaPath;
private final JdbcConnectionPool connectionPool;
private final Connection connection;
public CreateLookupDb(final File dbFile, final File umlsMetaPath) throws SQLException {
this.umlsMetaPath = umlsMetaPath;
this.connectionPool = JdbcConnectionPool.create("jdbc:h2:" + dbFile.getAbsoluteFile(), "foo", "bar");
this.connection = connectionPool.getConnection();
}
public int process() throws SQLException, IOException {
// load and process the MRRANK file
final Map<String, Integer> rankMap = new HashMap<>();
try (final BufferedReader mrrank = new BufferedReader(
new FileReader(umlsMetaPath.getAbsolutePath() + "/MRRANK.RRF"))
) {
int rank = 1;
for (String line; (line = mrrank.readLine()) != null; ) {
final String[] p = line.split("\\|", 0);
if (!p[1].startsWith("SNOMED")) continue;
rankMap.put(p[2], rank);
rank++;
}
}
// create the table
try (final Statement statement = connection.createStatement()) {
statement.execute(Joiner.on("\n").join(readLines(getResource("create-snomed-db.sql"), Charsets.UTF_8)));
}
// process the UMLS data
int count = 0;
try (final PreparedStatement prep = connection.prepareStatement(INSERT_SQL);
final BufferedReader mrconso =
new BufferedReader(new FileReader(umlsMetaPath.getAbsolutePath() + "/MRCONSO.RRF"))
) {
for (String line; (line = mrconso.readLine()) != null; ) {
final String[] p = line.split("\\|", 0);
if (!p[11].startsWith("SNOMED")) continue;
prep.setString(1, p[13]); // SNOMED CT code
prep.setString(2, p[0]); // CUI
prep.setString(3, p[12]); // term type
prep.setInt(4, rankMap.get(p[12])); // term type rank
prep.setString(5, p[14]); // description
prep.execute();
count++;
}
}
return count;
}
@Override
public void close() throws Exception {
connection.close();
connectionPool.dispose();
}
}