package org.nextprot.api.core.dao.impl; import org.nextprot.api.commons.exception.NextProtException; import org.nextprot.api.commons.spring.jdbc.DataSourceServiceLocator; import org.nextprot.api.commons.utils.SQLDictionary; import org.nextprot.api.core.dao.TerminologyDao; import org.nextprot.api.core.domain.CvTerm; import org.nextprot.api.core.utils.TerminologyUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.jdbc.core.namedparam.SqlParameterSource; import org.springframework.jdbc.core.simple.ParameterizedRowMapper; import org.springframework.stereotype.Repository; import java.sql.ResultSet; import java.sql.SQLException; import java.util.HashSet; import java.util.List; import java.util.Set; @Repository public class TerminologyDaoImpl implements TerminologyDao { @Autowired private SQLDictionary sqlDictionary; @Autowired private DataSourceServiceLocator dsLocator; @Override public List<CvTerm> findTermByAccessionAndTerminology(String accession, String terminology) { throw new RuntimeException("Not implemented"); } @Override // TODO normally only terminology + accession is supposed to be unique !!!! // SHOULD USE findTermByAccessionAndTerminology public CvTerm findTerminologyByAccession(String accession) { Set<String> acs = new HashSet<String>(); acs.add(accession); SqlParameterSource params = new MapSqlParameterSource("accessions", acs); List<CvTerm> terms = new NamedParameterJdbcTemplate( dsLocator.getDataSource()).query(sqlDictionary.getSQLQuery("terminology-by-acs"), params, new DbTermRowMapper()); if (terms.size()==0) return null; else if(terms.size() > 1){ throw new NextProtException("Found " + terms.size() + " terms that corresponds to the same accession. Use the method findTerminologyByAccessionForTerminology (accession, terminology) instead"); } return terms.get(0); } public List<CvTerm> findTermByAccessionAndTerminology(String accession) { throw new RuntimeException("Not implemented"); } @Override public List<CvTerm> findTerminologyByAccessions(Set<String> accessions) { SqlParameterSource params = new MapSqlParameterSource("accessions", accessions); List<CvTerm> terms = new NamedParameterJdbcTemplate(dsLocator.getDataSource()).query(sqlDictionary.getSQLQuery("terminology-by-acs"), params, new DbTermRowMapper()); return terms; } public List<CvTerm> findTerminologyByOntology(String ontology) { SqlParameterSource params = new MapSqlParameterSource("ontology", ontology); List<CvTerm> terms=new NamedParameterJdbcTemplate( dsLocator.getDataSource()).query( sqlDictionary.getSQLQuery("terminology-by-ontology"), params, new DbTermRowMapper()); return terms; } @Override public List<CvTerm> findAllTerminology() { SqlParameterSource params = new MapSqlParameterSource(); List<CvTerm> terms=new NamedParameterJdbcTemplate( dsLocator.getDataSource()).query( sqlDictionary.getSQLQuery("terminology-all"), params, new DbTermRowMapper()); return terms; } private static class DbTermRowMapper implements ParameterizedRowMapper<CvTerm> { @Override public CvTerm mapRow(ResultSet resultSet, int row) throws SQLException { CvTerm term = new CvTerm(); term.setId(resultSet.getLong("id")); term.setAccession(resultSet.getString("accession")); term.setDescription(resultSet.getString("description")); term.setName(resultSet.getString("name")); term.setSynonyms(resultSet.getString("synonyms")); term.setProperties(TerminologyUtils.convertToProperties(resultSet.getString("properties"), term.getId(), term.getAccession())); term.setOntology(resultSet.getString("ontology")); term.setOntologyAltname(resultSet.getString("ontologyAltname")); term.setAncestorAccession(resultSet.getString("ancestor")); term.setChildAccession(resultSet.getString("children")); term.setXrefs(TerminologyUtils.convertToXrefs(resultSet.getString("xref"))); return term; } } @Override public List<String> findEnzymeAcsByMaster(String entryName) { SqlParameterSource params = new MapSqlParameterSource("uniqueName", entryName); List<String> accessions = new NamedParameterJdbcTemplate(dsLocator.getDataSource()).queryForList(sqlDictionary.getSQLQuery("enzyme-by-entry-name"), params, String.class); return accessions; } @Override public List<String> findTerminologyNamesList() { return new JdbcTemplate(dsLocator.getDataSource()).queryForList(sqlDictionary.getSQLQuery("terminology-names"), String.class); } }