/* * * created: 2006 * * This file is part of Artemis * * Copyright (C) 2006 Genome Research Limited * * 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 2 * 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, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ package uk.ac.sanger.artemis.chado; import java.util.Collection; import java.util.Iterator; import java.util.List; import org.gmod.schema.analysis.AnalysisFeature; import org.gmod.schema.cv.Cv; import org.gmod.schema.cv.CvTerm; import org.gmod.schema.dao.*; import org.gmod.schema.general.Db; import org.gmod.schema.general.DbXRef; import org.gmod.schema.organism.Organism; import org.gmod.schema.pub.Pub; import org.gmod.schema.pub.PubDbXRef; import org.gmod.schema.sequence.Feature; import org.gmod.schema.sequence.FeatureCvTerm; import org.gmod.schema.sequence.FeatureCvTermDbXRef; import org.gmod.schema.sequence.FeatureCvTermProp; import org.gmod.schema.sequence.FeatureCvTermPub; import org.gmod.schema.sequence.FeatureDbXRef; import org.gmod.schema.sequence.FeatureLoc; import uk.ac.sanger.artemis.util.DatabaseDocument; public abstract class GmodDAO implements SequenceDaoI, SchemaDaoI, OrganismDaoI, CvDaoI, PubDaoI, GeneralDaoI { private static org.apache.log4j.Logger logger4j = org.apache.log4j.Logger.getLogger(GmodDAO.class); public abstract Graph getGraph(final Integer graphId); public abstract List getGraphs(final Integer featureId); public abstract List getTableColumns(final String tableName); public abstract List getOrganismsContainingSrcFeatures(); public abstract List getSimilarityMatchesByFeatureIds(final List featureIds); public abstract List getSimilarityMatches(final Integer srcFeatureId); public abstract List getClustersByFeatureIds(final List featureIds); public abstract List getParentFeaturesByChildFeatureIds(final List subjectIds); public abstract Feature getLazyFeatureNoResiduesById(final Integer featureId); public abstract List getFeatureLocsByFeatureId(int featureId); public abstract List getFeatureLocsBySrcFeatureId(int srcFeatureId); /** * Return a List of featureLoc's corresponding for a * List of feature_id's. * @param featureIds the list of featureIds to search * @return a (possibly empty) List */ public abstract List getFeatureLocsByListOfIds(final Collection featureIds); /** * Return all the Feature.featureDbXRefs for a List of feature_id's. * These are grouped by their feature_id and returned in a List * of Feature's. * @param featureIds the list of featureIds to search * @return a (possibly empty) List */ public abstract List getFeatureDbXRefsByFeatureId(final List featureIds); /** * Return a List of feature's corresponding for a * List of feature_id's. * @param featureIds the list of featureIds to search * @return a (possibly empty) List */ public abstract List getFeaturesByListOfIds(final List featureIds); /** * Return a list of chado features with residues * with residues. * @return the List of Feature objects */ public abstract List getResidueFeatures(final Integer organismId); /** * Return a list of chado features with residues * with residues. * @param commonName - organism common name * @return the List of Feature objects */ public abstract List getResidueFeaturesByOrganismCommonName(final String commonName); /** * Get the residues (sub-sequence) for a feature given it's * uniquename * @param uniqueName * @return */ public abstract List getResiduesByUniqueName(final String uniqueName); /** * Return all the Feature.featureProps for a List of feature_id's. * These are grouped by their feature_id and returned in a List * of Feature's. * @param featureIds * @return a (possibly empty) List */ public abstract List getFeaturePropByFeatureIds(final List featureIds); /** * Return a List of FeatureCvTerm's for all Feature's on * the given srcFeatureId * @param srcFeatureId srcfeature_id * @return */ public abstract List getFeatureCvTermsBySrcFeature(Feature srcFeature); /** * Return the FeatureCvTremDbXRef's for all Feature's given their srcfeature_id * @param srcFeatureId * @return */ public abstract List getFeatureCvTermDbXRefBySrcFeature(Feature srcFeature); /** * Return the FeatureCvTermPub's for all Feature's given their srcfeature_id * @param srcfeature_id * @return */ public abstract List getFeatureCvTermPubBySrcFeature(Feature srcFeature); /** * Return the FeaturePub's for all Feature's given their srcfeature_id * @param srcFeatureId * @return */ public abstract List getFeaturePubsBySrcFeature(Feature srcFeature); /** * Return the FeaturePub's for a Feature * @param feature * @return */ public abstract List getFeaturePubsByFeature(Feature feature); /** * Return the FeatureSynonym's for all Feature's given their srcfeature_id * @param srcFeatureId * @return */ public abstract List getFeatureSynonymsBySrcFeature(Feature srcFeature); /** * Return the FeatureSynonym's for all Feature's given their feature_id's * @param * @return */ public abstract List getFeatureSynonymsByFeatureIds(List featureIds); /** * Return a list of features that have this particular cvterm * @param cvTermName the CvTerm name * @return a (possibly empty) List of children */ public List getFeaturesByCvTermNameAndCvName(String cvTermName, String cvName) { return null; } public List getFeaturesByOrganism(Organism organism) { return null; } public List getFeaturesByUniqueNames(List name) { return null; } ////// ////// SchemaDaoI ////// ////// /** * Return the FeatureDbXRef's for all Feature's given their srcfeature_id * @param srcFeatureId * @return */ public abstract List getFeatureDbXRefsBySrcFeature(Feature srcFeature); public List getFeaturesByAnyNameAndOrganism(String arg0, String arg1, String arg2) { // TODO Auto-generated method stub return null; } public List getPossibleMatches(String arg0, CvTerm arg1, int arg2) { // TODO Auto-generated method stub return null; } public AnalysisFeature getAnalysisFeatureFromFeature(Feature arg0) { // TODO Auto-generated method stub return null; } ////// ////// GeneralDaoI ////// ////// /** * Retrieve a database by name * * @param name the name to lookup * @return the corresponding db, or null */ public Db getDbByName(String name) { return null; } /** * Retrieve the db xref corresponding to a given DB and accession number * * @param db the db the dbxref refers to * @param accession the accession "number" the dbxref refers to * @return the dbxref, or null */ public DbXRef getDbXRefByDbAndAcc(Db db, String accession) { return null; } public abstract List getDbs(); ////// ////// OrganismDaoI ////// ////// /** * Get the organism corresponding to this id * * @param id the organism id (primary key) to lookup by * @return the corresponding organism, or null */ public Organism getOrganismById(int id) { return null; } /** * Get the organism corresponding to this common name * * @param commonName the short name to look up * @return the corresponding organism, or null */ public abstract Organism getOrganismByCommonName(String commonName); /** * Get a list of the common name of all the organisms. * * @return a (possibly empty) List of all the organisms' common names */ public List findAllOrganismCommonNames() { return null; } ////// ////// CvDaoI ////// ////// public abstract List getAllCvs(); public List getAllTermsInCvWithCount(Cv arg0) { // TODO Auto-generated method stub return null; } public CvTerm getCvTermByDbXRef(DbXRef arg0) { // TODO Auto-generated method stub return null; } public List getPossibleMatches(String arg0, Cv arg1, int arg2) { // TODO Auto-generated method stub return null; } /** * Get a CV by id * * @param id the cv id (primary key) * @return the corresponding Cv, or null */ public Cv getCvById(int id) { return null; } // TODO Should this return a list or just one? /** * Retrieve a controlled vocabulary by its name * * @param name the name to lookup * @return the List of matches, or null */ public List getCvByName(String name) { return null; } /** * Retrieve a CvTerm from the Gene Ontology * * @param value the * @return the corresponding CvTerm, or null */ public CvTerm getGoCvTermByAcc(String value) { return null; } /** * Retrieve a CvTerm from the Gene Ontology via it's database entry * * @param id the database name eg GO:123456 * @return the corresponding CvTerm, or null */ public CvTerm getGoCvTermByAccViaDb(final String id) { return null; } public List getFeatureCvTermsByFeatureAndCvTermAndNot(Feature arg0, CvTerm arg1, boolean arg2) { // TODO Auto-generated method stub return null; } public FeatureDbXRef getFeatureDbXRefByFeatureAndDbXRef(Feature arg0, DbXRef arg1) { // TODO Auto-generated method stub return null; } public boolean existsNameInOntology(String arg0, Cv arg1) { // TODO Auto-generated method stub return false; } // // // PubDaoI // public Pub getPubByDbXRef(DbXRef arg0) { // TODO Auto-generated method stub return null; } public Pub getPubById(int arg0) { // TODO Auto-generated method stub return null; } public Pub getPubByUniqueName(String arg0) { // TODO Auto-generated method stub return null; } public List getPubPropByPubAndCvTerm(Pub arg0, CvTerm arg1) { // TODO Auto-generated method stub return null; } // // // Common functions // /** * Find a dbxref in the database and retrieve the associated * dbxref_id and db_id * @param dbXRef * @return */ protected DbXRef loadDbXRef(DbXRef dbXRef) { Integer db_id = getDbId(dbXRef.getDb()); if(db_id == null) throw new RuntimeException("No database called " + dbXRef.getDb().getName() + " found -check the spelling!"); dbXRef.getDb().setDbId(db_id.intValue()); Integer dbxref_id = getDbXRefId(dbXRef); if(dbxref_id == null) { dbXRef.setVersion("1"); // create a new accession entry in dbxref insertDbXRef(dbXRef); // now get the new dbxref_id dbxref_id = getDbXRefId(dbXRef); } dbXRef.setDbXRefId(dbxref_id.intValue()); return dbXRef; } /** * Find a Pub if it exists. If the Pub does not exist then create * one. * @param pub * @return */ protected Pub loadPub(Pub pub) { Pub pubResult = getPubByUniqueName(pub); if(pubResult == null) { // define the pub.type_id // CvTerm cvTerm; if(pub.getUniqueName().startsWith("PMID:") || pub.getUniqueName().startsWith("PubMed:")) cvTerm = DatabaseDocument.getCvTermByCvAndCvTerm("unfetched", "genedb_literature"); else cvTerm = DatabaseDocument.getCvTermByCvAndCvTerm("unknown", "genedb_literature"); pub.setCvTerm(cvTerm); insertPub(pub); pubResult = getPubByUniqueName(pub); // add PubDbXRef loadPubDbXRef(pubResult); } return pubResult; } /** * Create PubDbXRef for new Pub's and to handle links to * links to eg, pubmed. * @param pub */ private void loadPubDbXRef(final Pub pub) { try { int index = pub.getUniqueName().indexOf(':'); if (index > -1) { DbXRef dbXRef = new DbXRef(); dbXRef.setAccession(pub.getUniqueName().substring(index + 1)); Db db = new Db(); db.setName(pub.getUniqueName().substring(0, index)); dbXRef.setDb(db); dbXRef = loadDbXRef(dbXRef); PubDbXRef pubDbXRef = new PubDbXRef(); pubDbXRef.setDbXRef(dbXRef); pubDbXRef.setPub(pub); insertPubDbXRef(pubDbXRef); } } catch (Exception e) { logger4j.warn("GmodDAO.loadPubDbXRef() :: "+e.getMessage()); } } /** * Insert a feature_cvterm and associated feature_cvtermprop's, * feature_cvterm_dbxref's and feature_cvterm_pub. * @param feature_cvterm */ protected void insertAllFeatureCvTerm(final FeatureCvTerm feature_cvterm) { // get the pub_id and create a new Pub if necessary if(feature_cvterm.getPub() != null) feature_cvterm.setPub( loadPub(feature_cvterm.getPub()) ); insertFeatureCvTerm(feature_cvterm); // // get the current feature_id sequence value int feature_cvterm_id = getCurrval("feature_cvterm_feature_cvterm_id_seq"); feature_cvterm.setFeatureCvTermId(feature_cvterm_id); if(feature_cvterm.getFeatureCvTermProps() != null) { Collection featureCvTermProps = feature_cvterm.getFeatureCvTermProps(); Iterator it = featureCvTermProps.iterator(); while(it.hasNext()) { FeatureCvTermProp featureCvTermProp = (FeatureCvTermProp)it.next(); featureCvTermProp.setFeatureCvTerm(feature_cvterm); insertFeatureCvTermProp(featureCvTermProp); } } // feature_cvterm_pub's if(feature_cvterm.getFeatureCvTermPubs() != null) { Collection featureCvTermPubs = feature_cvterm.getFeatureCvTermPubs(); Iterator it = featureCvTermPubs.iterator(); while(it.hasNext()) { FeatureCvTermPub featureCvTermPub = (FeatureCvTermPub)it.next(); featureCvTermPub.setFeatureCvTerm(feature_cvterm); // get the pub_id and create a new Pub if necessary featureCvTermPub.setPub( loadPub(featureCvTermPub.getPub()) ); insertFeatureCvTermPub(featureCvTermPub); } } // feature_cvterm_dbxref's if(feature_cvterm.getFeatureCvTermDbXRefs() != null) { Collection featureCvTermDbXRefs = feature_cvterm.getFeatureCvTermDbXRefs(); Iterator it = featureCvTermDbXRefs.iterator(); while(it.hasNext()) { FeatureCvTermDbXRef featureCvTermDbXRef = (FeatureCvTermDbXRef)it.next(); featureCvTermDbXRef.setFeatureCvTerm(feature_cvterm); // look for dbxref in the database DbXRef dbxref = loadDbXRef(featureCvTermDbXRef.getDbXRef()); insertFeatureCvTermDbXRef(featureCvTermDbXRef); } } } protected abstract Integer getDbId(Db db); protected abstract Integer getDbXRefId(DbXRef dbXRef); protected abstract void insertDbXRef(DbXRef dbXRef); protected abstract Pub getPubByUniqueName(Pub pub); protected abstract void insertPub(Pub pub); protected abstract void insertPubDbXRef(PubDbXRef pubDbXRef); protected abstract void insertFeatureCvTerm(final FeatureCvTerm feature_cvterm); protected abstract int getCurrval(String seq_id); protected abstract void insertFeatureCvTermProp(FeatureCvTermProp featureCvTermProp); protected abstract void insertFeatureCvTermPub(FeatureCvTermPub featureCvTermPub); protected abstract void insertFeatureCvTermDbXRef(FeatureCvTermDbXRef featureCvTermDbXRef); }