package org.genedb.db.fixup;
import org.genedb.util.TwoKeyMap;
import org.apache.log4j.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
/**
* Caches the cvterms used to type features and organismprops,
* and makes it easy to retrieve the ID from the name or vice versa.
* Used by {@link FixResidues}.
*
* @author rh11
*
*/
public class TypeCodes {
private static final Logger logger = Logger.getLogger(TypeCodes.class);
private TwoKeyMap<String,String,Integer> idByCvNameAndTermName = new TwoKeyMap<String,String,Integer>();
private Map<Integer,String> cvNameById = new HashMap<Integer,String>();
private Map<Integer,String> termNameById = new HashMap<Integer,String>();
public TypeCodes(Connection conn) throws SQLException {
PreparedStatement st = conn.prepareStatement(
"select cvterm_id"
+" , cv.name as cv_name"
+" , cvterm.name as cvterm_name"
+" from cvterm"
+" join cv using (cv_id)"
+" join ("
+" select distinct type_id as cvterm_id from feature"
+" union"
+" select distinct type_id as cvterm_id from organismprop"
+" union"
+" select distinct type_id as cvterm_id from featureprop"
+") feature_types using (cvterm_id)"
);
try {
ResultSet rs = st.executeQuery();
logger.trace("Loading CV terms from database");
while (rs.next()) {
int cvTermId = rs.getInt("cvterm_id");
String cvName = rs.getString("cv_name");
String cvTermName = rs.getString("cvterm_name");
idByCvNameAndTermName.put(cvName, cvTermName, cvTermId);
cvNameById.put(cvTermId, cvName);
termNameById.put(cvTermId, cvTermName);
}
logger.trace("CV terms loaded");
}
finally {
try {
st.close();
}
catch (SQLException e) {
System.err.println("SQLException from close(), probably caused by a previous exception");
e.printStackTrace(System.err);
}
}
}
public int typeId(String cvName, String cvTermName) {
Integer result = idByCvNameAndTermName.get(cvName, cvTermName);
if (result == null)
throw new IllegalArgumentException(String.format("Term '%s' not found in CV '%s'", cvTermName, cvName));
return result;
}
public String cvName(int cvTermId) {
if (!cvNameById.containsKey(cvTermId))
throw new IllegalArgumentException(String.format("CV term ID=%d not found", cvTermId));
return cvNameById.get(cvTermId);
}
public String termName(int cvTermId) {
if (!termNameById.containsKey(cvTermId))
throw new IllegalArgumentException(String.format("CV term ID=%d not found", cvTermId));
return termNameById.get(cvTermId);
}
}