Mercurial > repos > mahtabm > ensembl
diff variant_effect_predictor/Bio/EnsEMBL/DBSQL/TranslationAdaptor.pm @ 0:1f6dce3d34e0
Uploaded
| author | mahtabm |
|---|---|
| date | Thu, 11 Apr 2013 02:01:53 -0400 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/variant_effect_predictor/Bio/EnsEMBL/DBSQL/TranslationAdaptor.pm Thu Apr 11 02:01:53 2013 -0400 @@ -0,0 +1,912 @@ +=head1 LICENSE + + Copyright (c) 1999-2012 The European Bioinformatics Institute and + Genome Research Limited. All rights reserved. + + This software is distributed under a modified Apache license. + For license details, please see + + http://www.ensembl.org/info/about/code_licence.html + +=head1 CONTACT + + Please email comments or questions to the public Ensembl + developers list at <dev@ensembl.org>. + + Questions may also be sent to the Ensembl help desk at + <helpdesk@ensembl.org>. + +=cut + +=head1 NAME + +Bio::EnsEMBL::DBSQL::TranslationAdaptor - Provides a means to fetch and store +Translation objects from a database. + +=head1 DESCRIPTION + +This adaptor provides a means to retrieve and store +Bio::EnsEMBL::Translation objects from/in a database. + +Translation objects only truly make sense in the context of their +transcripts so the recommended means to retrieve Translations is +by retrieving the Transcript object first, and then fetching the +Translation. + +=head1 SYNOPSIS + + use Bio::EnsEMBL::Registry; + + Bio::EnsEMBL::Registry->load_registry_from_db( + -host => 'ensembldb.ensembl.org', + -user => 'anonymous' + ); + + $transcript_adaptor = + Bio::EnsEMBL::Registry->get_adaptor( "human", "core", + "transcript" ); + + $translation_adaptor = + Bio::EnsEMBL::Registry->get_adaptor( "human", "core", + "translation" ); + + my $transcript = $transcript_adaptor->fetch_by_dbID(131243); + my $translation = + $translation_adaptor->fetch_by_Transcript($transcript); + + print("Translation Start Site: " + . $translation->start_Exon()->stable_id() . " " + . $translation->start() + . "\n" ); + print("Translation Stop: " + . $translation->end_Exon()->stable_id() . " " + . $translation->end() ); + +=head1 METHODS + +=cut + +package Bio::EnsEMBL::DBSQL::TranslationAdaptor; + +use vars qw(@ISA); +use strict; + +use Bio::EnsEMBL::DBSQL::BaseAdaptor; +use Bio::EnsEMBL::Translation; +use Bio::EnsEMBL::Utils::Exception qw( throw warning deprecate ); +use Bio::EnsEMBL::Utils::Scalar qw( assert_ref ); + + +@ISA = qw( Bio::EnsEMBL::DBSQL::BaseAdaptor ); + +=head2 fetch_all_alternative_by_Transcript + + Arg [1] : Bio::EnsEMBL::Transcript $transcript + Example : + + @tl = @{ + $translation_adaptor->fetch_all_alternative_by_Transcript( + $transcript) + }; + + Description: Retrieves all alternative translations associated with a + particular transcript. If no alternative translation is + found, a reference to an empty list is returned. + + Returntype : listref of Bio::EnsEMBL::Translation + Exceptions : throw on incorrect argument + Caller : Transcript + Status : Stable + +=cut + +sub fetch_all_alternative_by_Transcript { + my ( $self, $transcript ) = @_; + + assert_ref($transcript, 'Bio::EnsEMBL::Transcript'); + + my $tl_created_date = + $self->db()->dbc()->from_date_to_seconds('tl.created_date'); + my $tl_modified_date = + $self->db()->dbc()->from_date_to_seconds('tl.modified_date'); + + my $sql = + sprintf( "SELECT tl.translation_id, tl.start_exon_id, " + . "tl.end_exon_id, tl.seq_start, tl.seq_end, " + . "tl.stable_id, tl.version, %s, %s " + . "FROM translation tl " + . "JOIN transcript t " + . "ON (t.transcript_id = tl.transcript_id) " + . "WHERE tl.transcript_id = ? " + . "AND tl.translation_id != t.canonical_translation_id", + $tl_created_date, $tl_modified_date ); + + my $transcript_id = $transcript->dbID(); + my $sth = $self->prepare($sql); + $sth->bind_param( 1, $transcript_id, SQL_INTEGER ); + + $sth->execute(); + + my ( + $translation_id, $start_exon_id, $end_exon_id, + $seq_start, $seq_end, $stable_id, + $version, $created_date, $modified_date + ); + + $sth->bind_columns( + \( + $translation_id, $start_exon_id, $end_exon_id, + $seq_start, $seq_end, $stable_id, + $version, $created_date, $modified_date + ) ); + + # Get all alternative translations. + my $translations = []; + while ( $sth->fetch() ) { + if ( !defined($translation_id) ) { next } + + my ( $start_exon, $end_exon ); + + # this will load all the exons whenever we load the translation + # but I guess thats ok .... + + foreach my $exon ( @{ $transcript->get_all_Exons() } ) { + if ( $exon->dbID() == $start_exon_id ) { $start_exon = $exon } + if ( $exon->dbID() == $end_exon_id ) { $end_exon = $exon } + } + + if ( !( defined($start_exon) && defined($end_exon) ) ) { + throw( + sprintf( + "Could not find start or end exon in transcript_id=%d\n", + $transcript->dbID() ) ); + } + + my $translation = + Bio::EnsEMBL::Translation->new_fast( { + 'dbID' => $translation_id, + 'adaptor' => $self, + 'start' => $seq_start, + 'end' => $seq_end, + 'start_exon' => $start_exon, + 'end_exon' => $end_exon, + 'stable_id' => $stable_id, + 'version' => $version, + 'created_date' => $created_date || undef, + 'modified_date' => $modified_date || undef, + } ); + + $translation->transcript($transcript); + + push( @{$translations}, $translation ); + + } ## end while ( $sth->fetch() ) + + return $translations; +} ## end sub fetch_all_by_Transcript + +=head2 fetch_by_Transcript + + Arg [1] : Bio::EnsEMBL::Transcript $transcript + Example : $tl = $translation_adaptor->fetch_by_Transcript($transcript); + Description: Retrieves a Translation via its associated transcript. + If the Translation is not found, undef is returned. + Returntype : Bio::EnsEMBL::Translation + Exceptions : throw on incorrect argument + Caller : Transcript + Status : Stable + +=cut + +sub fetch_by_Transcript { + my ( $self, $transcript ) = @_; + + assert_ref( $transcript, 'Bio::EnsEMBL::Transcript' ); + + my $tl_created_date = + $self->db()->dbc()->from_date_to_seconds('tl.created_date'); + my $tl_modified_date = + $self->db()->dbc()->from_date_to_seconds('tl.modified_date'); + + my $sql = + sprintf( "SELECT tl.translation_id, tl.start_exon_id, " + . "tl.end_exon_id, tl.seq_start, tl.seq_end, " + . "tl.stable_id, tl.version, %s, %s " + . "FROM translation tl " + . "JOIN transcript tr " + . "ON (tl.translation_id = tr.canonical_translation_id) " + . "WHERE tr.transcript_id = ?", + $tl_created_date, $tl_modified_date ); + + my $transcript_id = $transcript->dbID(); + my $sth = $self->prepare($sql); + $sth->bind_param( 1, $transcript_id, SQL_INTEGER ); + + $sth->execute(); + + my ( + $translation_id, $start_exon_id, $end_exon_id, + $seq_start, $seq_end, $stable_id, + $version, $created_date, $modified_date + ) = $sth->fetchrow_array(); + $sth->finish(); + + if ( !defined($translation_id) ) { return undef } + + my ( $start_exon, $end_exon ); + + # this will load all the exons whenever we load the translation + # but I guess thats ok .... + + foreach my $exon ( @{ $transcript->get_all_Exons() } ) { + if ( $exon->dbID() == $start_exon_id ) { $start_exon = $exon } + if ( $exon->dbID() == $end_exon_id ) { $end_exon = $exon } + } + + if ( !( defined($start_exon) && defined($end_exon) ) ) { + throw( + sprintf( "Could not find start or end exon in transcript_id=%d\n", + $transcript->dbID() ) ); + } + + my $translation = + Bio::EnsEMBL::Translation->new_fast( { + 'dbID' => $translation_id, + 'adaptor' => $self, + 'start' => $seq_start, + 'end' => $seq_end, + 'start_exon' => $start_exon, + 'end_exon' => $end_exon, + 'stable_id' => $stable_id, + 'version' => $version, + 'created_date' => $created_date || undef, + 'modified_date' => $modified_date || undef, + } ); + + $translation->transcript($transcript); + + return $translation; +} ## end sub fetch_by_Transcript + + + +=head2 fetch_all_by_external_name + + Arg [1] : string $external_name + The external identifier for the translation(s) to be + obtained. + Arg [2] : (optional) string $external_db_name + The name of the external database from which the + identifier originates. + Arg [3] : Boolean override. Force SQL regex matching for users + who really do want to find all 'NM%' + Example : my @translations = + @{ $trl_adaptor->fetch_all_by_external_name('BRCA2') }; + my @many_translations = + @{ $trl_adaptor->fetch_all_by_external_name('BRCA%') }; + Description: Retrieves a list of translations fetched via an + external identifier. Note that this may not be a + particularly useful method, because translations + do not make much sense out of the context of + their transcript. It may be better to use the + TranscriptAdaptor::fetch_all_by_external_name instead. + SQL wildcards % and _ are supported in the $external_name + but their use is somewhat restricted for performance reasons. + Users that really do want % and _ in the first three characters + should use argument 3 to prevent optimisations + Returntype : reference to a list of Translations + Exceptions : none + Caller : general + Status : Medium Risk + : At some time may be deprecated to instead use + : TranscriptAdaptor::fetch_all_by_external_name + +=cut + +sub fetch_all_by_external_name { + my ( $self, $external_name, $external_db_name, $override ) = @_; + + my $entry_adaptor = $self->db->get_DBEntryAdaptor(); + + my @ids = $entry_adaptor->list_translation_ids_by_extids( + $external_name, $external_db_name, $override ); + + my $transcript_adaptor = $self->db()->get_TranscriptAdaptor(); + + my @out; + foreach my $id (@ids) { + my $transcript = $transcript_adaptor->fetch_by_translation_id($id); + + if ( defined($transcript) ) { + push @out, $self->fetch_by_Transcript($transcript); + } + } + + return \@out; +} + +=head2 fetch_all_by_GOTerm + + Arg [1] : Bio::EnsEMBL::OntologyTerm + The GO term for which translations should be fetched. + + Example: @translations = @{ + $translation_adaptor->fetch_all_by_GOTerm( + $go_adaptor->fetch_by_accession('GO:0030326') ) }; + + Description : Retrieves a list of translations that are + associated with the given GO term, or with any of + its descendent GO terms. + + Return type : listref of Bio::EnsEMBL::Translation + Exceptions : Throws of argument is not a GO term + Caller : general + Status : Stable + +=cut + +sub fetch_all_by_GOTerm { + my ( $self, $term ) = @_; + + assert_ref( $term, 'Bio::EnsEMBL::OntologyTerm' ); + if ( $term->ontology() ne 'GO' ) { + throw('Argument is not a GO term'); + } + + my $entryAdaptor = $self->db->get_DBEntryAdaptor(); + + my %unique_dbIDs; + foreach my $accession ( map { $_->accession() } + ( $term, @{ $term->descendants() } ) ) + { + my @ids = + $entryAdaptor->list_translation_ids_by_extids( $accession, 'GO' ); + foreach my $dbID (@ids) { $unique_dbIDs{$dbID} = 1 } + } + + my @result; + if ( scalar( keys(%unique_dbIDs) ) > 0 ) { + my $transcript_adaptor = $self->db()->get_TranscriptAdaptor(); + + foreach my $dbID ( sort { $a <=> $b } keys(%unique_dbIDs) ) { + my $transcript = + $transcript_adaptor->fetch_by_translation_id($dbID); + if ( defined($transcript) ) { + push( @result, $self->fetch_by_Transcript($transcript) ); + } + } + } + + return \@result; +} ## end sub fetch_all_by_GOTerm + +=head2 fetch_all_by_GOTerm_accession + + Arg [1] : String + The GO term accession for which genes should be + fetched. + + Example : + + @genes = + @{ $gene_adaptor->fetch_all_by_GOTerm_accession('GO:0030326') }; + + Description : Retrieves a list of genes that are associated with + the given GO term, or with any of its descendent + GO terms. The genes returned are in their native + coordinate system, i.e. in the coordinate system + in which they are stored in the database. If + another coordinate system is required then the + Gene::transfer or Gene::transform method can be + used. + + Return type : listref of Bio::EnsEMBL::Gene + Exceptions : Throws of argument is not a GO term accession + Caller : general + Status : Stable + +=cut + +sub fetch_all_by_GOTerm_accession { + my ( $self, $accession ) = @_; + + if ( $accession !~ /^GO:/ ) { + throw('Argument is not a GO term accession'); + } + + my $goAdaptor = + Bio::EnsEMBL::Registry->get_adaptor( 'Multi', 'Ontology', + 'OntologyTerm' ); + + my $term = $goAdaptor->fetch_by_accession($accession); + + return $self->fetch_all_by_GOTerm($term); +} + +=head2 store + + Arg [1] : Bio::EnsEMBL::Translation $translation + The translation object to be stored in the database + Example : $transl_id = $translation_adaptor->store($translation); + Description: Stores a translation object in the database + Returntype : int - the new dbID of the stored translation + Exceptions : thrown if the dbID of the start_Exon or end_Exon is not + defined. + thrown if only partial stable id information is present (e.g. + identifier but not version number) + Caller : Transcript::store + Status : Stable + +=cut + +sub store { + my ( $self, $translation, $transcript_id ) = @_; + + my $start_exon = $translation->start_Exon(); + my $end_exon = $translation->end_Exon(); + + if(!$start_exon) { + throw("Translation must define a start_Exon to be stored."); + } + + if(!$end_exon) { + throw("Translation must define an end_Exon to be stored."); + } + + if(!$start_exon->dbID) { + throw("start_Exon must have a dbID for Translation to be stored."); + } + + if(!$end_exon->dbID) { + throw("end_Exon must have a dbID for Translation to be stored."); + } + + my $store_translation_sql = qq( + INSERT INTO translation + SET seq_start = ?, + start_exon_id = ?, + seq_end = ?, + end_exon_id = ?, + transcript_id = ? + ); + + if (defined($translation->stable_id)) { + my $created = $self->db->dbc->from_seconds_to_date($translation->created_date()); + my $modified = $self->db->dbc->from_seconds_to_date($translation->modified_date()); + $store_translation_sql .= ", stable_id = ?, version = ?, created_date = " . $created . " , modified_date = " . $modified; + + } + + my $sth = $self->prepare($store_translation_sql); + $sth->bind_param(1,$translation->start,SQL_INTEGER); + $sth->bind_param(2,$translation->start_Exon->dbID,SQL_INTEGER); + $sth->bind_param(3,$translation->end,SQL_INTEGER); + $sth->bind_param(4,$translation->end_Exon->dbID,SQL_INTEGER); + $sth->bind_param(5,$transcript_id,SQL_INTEGER); + + + if (defined($translation->stable_id)) { + + $sth->bind_param(6, $translation->stable_id,SQL_VARCHAR); + my $version = ($translation->version()) ? $translation->version() : 1; + $sth->bind_param(7, $version,SQL_VARCHAR); + } + + $sth->execute(); + + my $transl_dbID = $sth->{'mysql_insertid'}; + + # + # store object xref mappings to translations + # + + my $dbEntryAdaptor = $self->db()->get_DBEntryAdaptor(); + # store each of the xrefs for this translation + foreach my $dbl ( @{$translation->get_all_DBEntries} ) { + $dbEntryAdaptor->store( $dbl, $transl_dbID, "Translation", 1 ); + } + + #storing the protein features associated with the translation + my $pfadaptor = $self->db->get_ProteinFeatureAdaptor(); + foreach my $pf(@{$translation->get_all_ProteinFeatures}){ + $pfadaptor->store($pf, $transl_dbID); + } + + $translation->get_all_Attributes(); + + # store any translation attributes that are defined + my $attr_adaptor = $self->db->get_AttributeAdaptor(); + $attr_adaptor->store_on_Translation($transl_dbID, + $translation->get_all_Attributes()); + + $translation->dbID($transl_dbID); + $translation->adaptor($self); + + return $transl_dbID; +} + + + +=head2 remove + + Arg [1] : Bio::EnsEMBL::Translation $translation + Example : $translation_adaptor->remove($translation); + Description: Removes a translation completely from the database, and all + associated information including protein features etc. + Returntype : none + Exceptions : throw on incorrect arguments + warning if translation is not in this database + Caller : TranscriptAdaptor::remove + Status : Stable + +=cut + +sub remove { + my $self = shift; + my $translation = shift; + + if(!ref($translation) || !$translation->isa('Bio::EnsEMBL::Translation')) { + throw("Bio::EnsEMBL::Translation argument expected."); + } + + if( !$translation->is_stored($self->db()) ) { + warning("Cannot remove translation " . $translation->dbID() . + ". Is not stored in this database."); + return; + } + + # remove athe attributes associated with this translation + my $attrib_adp = $self->db->get_AttributeAdaptor; + $attrib_adp->remove_from_Translation($translation); + + # remove all xref associations to this translation + my $dbe_adaptor = $self->db()->get_DBEntryAdaptor(); + foreach my $dbe (@{$translation->get_all_DBEntries()}) { + $dbe_adaptor->remove_from_object($dbe, $translation, 'Translation'); + } + + # remove all protein_features on this translation + my $sth = $self->prepare + ("DELETE FROM protein_feature WHERE translation_id = ?"); + $sth->bind_param(1,$translation->dbID,SQL_INTEGER); + $sth->execute(); + $sth->finish(); + + # remove the translation itself + + $sth = $self->prepare("DELETE FROM translation WHERE translation_id = ?" ); + $sth->bind_param(1,$translation->dbID,SQL_INTEGER); + $sth->execute(); + $sth->finish(); + + $translation->dbID( undef ); + $translation->adaptor(undef); + + return +} + + +=head2 list_dbIDs + + Arg [1] : none + Example : @translation_ids = @{$translation_adaptor->list_dbIDs()}; + Description: Gets an array of internal ids for all translations in the current db + Returntype : list of ints + Exceptions : none + Caller : ? + Status : Stable + +=cut + +sub list_dbIDs { + my ($self) = @_; + + return $self->_list_dbIDs("translation"); +} + + +=head2 list_stable_ids + + Arg [1] : none + Example : @transl_stable_ids = @{$transl_adaptor->list_stable_dbIDs()}; + Description: Gets an array of stable ids for all translations in the current + db + Returntype : reference to a list of strings + Exceptions : none + Caller : general + Status : Stable + +=cut + +sub list_stable_ids { + my ($self) = @_; + + return $self->_list_dbIDs("translation", "stable_id"); +} + + + +=head2 fetch_by_dbID + + Arg [1] : int $dbID + The internal identifier of the Translation to obtain + Example : $translation = $translation_adaptor->fetch_by_dbID(1234); + Description: This fetches a Translation object via its internal id. + This is only debatably useful since translations do + not make much sense outside of the context of their + Transcript. Consider using fetch_by_Transcript instead. + Returntype : Bio::EnsEMBL::Translation, or undef if the translation is not + found. + Exceptions : warning if an additional (old style) Transcript argument is + provided + Caller : ? + Status : Stable + +=cut + +sub fetch_by_dbID { + my ( $self, $dbID, $transcript ) = @_; + + if ($transcript) { + deprecate( "Use of fetch_by_dbID " + . "with a Transcript argument is deprecated." + . "Use fetch_by_Transcript instead." ); + } + + if ( !defined($dbID) ) { + throw("dbID argument is required"); + } + + my $transcript_adaptor = $self->db()->get_TranscriptAdaptor(); + $transcript = $transcript_adaptor->fetch_by_translation_id($dbID); + + if ( defined($transcript) ) { + my $translation = $self->fetch_by_Transcript($transcript); + + if ( defined($translation) && $translation->dbID()==$dbID ) { + return $translation; + } + + my @alt_translations = + @{ $self->fetch_all_alternative_by_Transcript($transcript) }; + + foreach my $alt_translation (@alt_translations) { + if ( $alt_translation->dbID() == $dbID ) { + return $alt_translation; + } + } + } + + return undef; +} ## end sub fetch_by_dbID + + +=head2 fetch_by_stable_id + + Arg [1] : string $stable_id + The stable identifier of the Translation to obtain + Example : $translation = $translation_adaptor->fetch_by_stable_id("ENSP00001"); + Description: This fetches a Translation object via its stable id. + This is only debatably useful since translations do + not make much sense outside of the context of their + Transcript. Consider using fetch_by_Transcript instead. + Returntype : Bio::EnsEMBL::Translation or undef if the translation is not + found. + Exceptions : warning if an additional (old style) Transcript argument is + provided + Caller : ? + Status : Stable + +=cut + +sub fetch_by_stable_id { + my ($self,$stable_id) = @_; + + if(!$stable_id) { + throw("stable id argument is required"); + } + + my $transcript_adaptor = $self->db()->get_TranscriptAdaptor(); + my $transcript = + $transcript_adaptor->fetch_by_translation_stable_id($stable_id); + + return undef if(!$transcript); + + return $self->fetch_by_Transcript($transcript); +} + + +=head2 fetch_all_by_Transcript_list + + Arg [1] : reference to list of Bio::EnsEMBL::Transcripts $transcripts + The list of $transcripts to obtain Translation object for. + Example : @translations = @{$tla->fetch_all_by_Transcript_list([$t1,$t2]); + Description: Fetches all translations associated with the list of transcripts + passed to this method. The passed transcripts will also have + their translation set by this method. + Returntype : Reference to list of Bio::EnsEMBL::Translations + Exceptions : None + Caller : general + Status : Stable + +=cut + +sub fetch_all_by_Transcript_list { + my ($self,$transcripts) = @_; + + if(!defined($transcripts) || ref($transcripts) ne 'ARRAY') { + throw("reference to list of Transcripts argument is required"); + } + + return [] if(!@$transcripts); + + my %trans_hash = map {$_->dbID() => $_} @$transcripts; + my @id_list = keys %trans_hash; + + my @out; + + # mysql is faster and we ensure that we do not exceed the max query size by + # splitting large queries into smaller queries of 200 ids + my $max_size = 200; + + my ( $transcript_id, $translation_id, $start_exon_id, $end_exon_id, + $seq_start, $seq_end, $stable_id, $version, + $created_date, $modified_date ); + + my %ex_hash; + + while(@id_list) { + my @ids; + if(@id_list > $max_size) { + @ids = splice(@id_list, 0, $max_size); + } else { + @ids = splice(@id_list, 0); + } + + my $id_str; + if(@ids > 1) { + $id_str = " IN (" . join(',', @ids). ")"; + } else { + $id_str = " = " . $ids[0]; + } + + my $canonical_lookup = $self->dbc()->sql_helper()->execute_into_hash( + -SQL => 'SELECT transcript_id, canonical_translation_id FROM transcript WHERE transcript_id '.$id_str + ); + + my $created_date = $self->db->dbc->from_date_to_seconds("tl.created_date"); + my $modified_date = $self->db->dbc->from_date_to_seconds("tl.modified_date"); + + my $sth = $self->prepare + ("SELECT tl.transcript_id, tl.translation_id, tl.start_exon_id, + tl.end_exon_id, tl.seq_start, tl.seq_end, + tl.stable_id, tl.version, " . $created_date . "," . + $modified_date . + " FROM translation tl + WHERE tl.transcript_id $id_str"); + + $sth->execute(); + + $sth->bind_columns( \$transcript_id, \$translation_id, \$start_exon_id, \$end_exon_id, + \$seq_start, \$seq_end, \$stable_id, \$version, + \$created_date, \$modified_date ); + + while($sth->fetch()) { + my ($start_exon, $end_exon); + + # this will load all the exons whenever we load the translation + # but I guess thats ok .... + + my $tr = $trans_hash{$transcript_id}; + + foreach my $exon (@{$tr->get_all_Exons()}) { + if(!$start_exon && $exon->dbID() == $start_exon_id ) { + $start_exon = $exon; + last if($end_exon); + } + + if(!$end_exon && $exon->dbID() == $end_exon_id ) { + $end_exon = $exon; + last if($start_exon); + } + } + + unless($start_exon && $end_exon) { + throw("Could not find start or end exon in transcript\n"); + } + + my $tl = Bio::EnsEMBL::Translation->new + (-dbID => $translation_id, + -seq_start => $seq_start, + -seq_end => $seq_end, + -start_exon => $start_exon, + -end_exon => $end_exon, + -stable_id => $stable_id, + -version => $version, + -created_date => $created_date || undef, + -modified_date => $modified_date || undef); + + $tl->adaptor($self); + my $canonical_translation_id = $canonical_lookup->{$transcript_id}; + $tr->translation($tl) if $translation_id == $canonical_translation_id; + + push @out, $tl; + } + } + + return \@out; +} + + + +=head2 fetch_all_by_DBEntry + + Description: DEPRECATED, this has been renames fetch_all_by_external_name + +=cut + +sub fetch_all_by_DBEntry { + my $self = shift; + deprecate("Use fetch_all_by_external_name instead."); + return $self->fetch_all_by_external_name(@_); +} + +=head2 get_stable_entry_info + + Description: DEPRECATED - This method should no longer be needed. Stable + id info is fetched when the transcript is. + +=cut + +sub get_stable_entry_info { + my ($self,$translation) = @_; + + deprecate( "This method shouldnt be necessary any more" ); + + unless(defined $translation && ref $translation && + $translation->isa('Bio::EnsEMBL::Translation') ) { + throw("Needs a Translation object, not a [$translation]"); + } + + my $sth = $self->prepare("SELECT stable_id, version + FROM translation + WHERE translation_id = ?"); + $sth->bind_param(1,$translation->dbID,SQL_INTEGER); + $sth->execute(); + + my @array = $sth->fetchrow_array(); + $translation->{'_stable_id'} = $array[0]; + $translation->{'_version'} = $array[1]; + + return 1; +} + +=head2 fetch_all + + Example : $translations = $translation_adaptor->fetch_all(); + Description : Retrieves all canonical and alternative translations + stored in the database. + Returntype : listref of Bio::EnsEMBL::Translation + Caller : general + Status : At Risk + +=cut + +sub fetch_all { + my ($self) = @_; + my $transcript_adaptor = $self->db()->get_TranscriptAdaptor(); + + my @translations; + foreach my $transcript (@{$transcript_adaptor->fetch_all}) { + my $translation = $self->fetch_by_Transcript($transcript); + if ($translation) { + push @translations, $translation; + } + foreach my $alt_translation (@{$self->fetch_all_alternative_by_Transcript($transcript)}) { + push @translations, $alt_translation; + } + } + return \@translations; +} + +1;
