Bio-EnsEMBL
view release on metacpan or search on metacpan
lib/Bio/EnsEMBL/DBSQL/TranscriptAdaptor.pm view on Meta::CPAN
foreach my $exon ( @{$transcript->get_all_Exons()} ) {
# get the number of transcript references to this exon
# only remove the exon if this is the last transcript to
# reference it
my $sth = $self->prepare( "SELECT count(*)
FROM exon_transcript
WHERE exon_id = ?" );
$sth->bind_param(1, $exon->dbID, SQL_INTEGER);
$sth->execute();
my ($count) = $sth->fetchrow_array();
$sth->finish();
if($count == 1){
$exonAdaptor->remove( $exon );
}
}
my $sth = $self->prepare( "DELETE FROM exon_transcript
WHERE transcript_id = ?" );
$sth->bind_param(1, $transcript->dbID, SQL_INTEGER);
$sth->execute();
$sth->finish();
my $gene = $transcript->get_Gene;
$sth = $self->prepare( "DELETE FROM transcript
WHERE transcript_id = ?" );
$sth->bind_param(1, $transcript->dbID, SQL_INTEGER);
$sth->execute();
$sth->finish();
if ($update) {
$gene->remove_Transcript($transcript);
}
$transcript->dbID(undef);
$transcript->adaptor(undef);
return;
}
=head2 update
Arg [1] : Bio::EnsEMBL::Transcript $transcript
The transcript to update
Example : $tr_adaptor->update($transcript);
Description: Updates a transcript in the database.
Returntype : None
Exceptions : thrown if the $transcript is not a Bio::EnsEMBL::Transcript.
warn if the method is called on a transcript that does not exist
in the database.
Should warn if trying to update the number of attached exons, but
this is a far more complex process and is not yet implemented.
Caller : general
Status : Stable
=cut
sub update {
my ( $self, $transcript ) = @_;
if ( !defined($transcript)
|| !ref($transcript)
|| !$transcript->isa('Bio::EnsEMBL::Transcript') )
{
throw("Must update a transcript object, not a $transcript");
}
my $update_transcript_sql =
sprintf "UPDATE transcript SET stable_id = ?, analysis_id = ?, display_xref_id = ?, description = ?,%s biotype = ?, is_current = ?, canonical_translation_id = ?, version = ? WHERE transcript_id = ?", ($self->schema_version > 74)?" source = ?,":''...
my $display_xref = $transcript->display_xref();
my $display_xref_id;
if ( defined($display_xref) && $display_xref->dbID() ) {
$display_xref_id = $display_xref->dbID();
} else {
$display_xref_id = undef;
}
my $sth = $self->prepare($update_transcript_sql);
my $i = 0;
$sth->bind_param( ++$i, $transcript->stable_id(), SQL_VARCHAR );
$sth->bind_param( ++$i, $transcript->analysis()->dbID(), SQL_INTEGER );
$sth->bind_param( ++$i, $display_xref_id, SQL_INTEGER );
$sth->bind_param( ++$i, $transcript->description(), SQL_LONGVARCHAR );
$self->schema_version > 74 and
$sth->bind_param( ++$i, $transcript->source(), SQL_VARCHAR );
$sth->bind_param( ++$i, $transcript->get_Biotype->name, SQL_VARCHAR );
$sth->bind_param( ++$i, $transcript->is_current(), SQL_TINYINT );
$sth->bind_param( ++$i, (
defined( $transcript->translation() )
? $transcript->translation()->dbID()
: undef ),
SQL_INTEGER );
$sth->bind_param( ++$i, $transcript->version(), SQL_INTEGER );
$sth->bind_param( ++$i, $transcript->dbID(), SQL_INTEGER );
$sth->execute();
# Check if transcript is canonical
if ($transcript->is_canonical()) {
my $gene = $transcript->get_Gene();
my $gene_adaptor = $self->db()->get_GeneAdaptor();
$gene->canonical_transcript($transcript);
$gene_adaptor->update($gene);
}
} ## end sub update
=head2 list_dbIDs
Example : @transcript_ids = @{ $t_adaptor->list_dbIDs };
Description: Gets a list of internal ids for all transcripts in the db.
Arg[1] : <optional> int. not 0 for the ids to be sorted by the seq_region. Returntype : Listref of Ints
Exceptions : none
Caller : general
Status : Stable
=cut
sub list_dbIDs {
my ($self, $ordered) = @_;
return $self->_list_dbIDs("transcript",undef, $ordered);
}
=head2 list_stable_ids
Example : @stable_trans_ids = @{ $transcript_adaptor->list_stable_ids };
Description: Gets a list of stable ids for all transcripts in the current
database.
Returntype : Listref of Strings
Exceptions : none
Caller : general
Status : Stable
=cut
sub list_stable_ids {
my ($self) = @_;
return $self->_list_dbIDs("transcript", "stable_id");
}
#_objs_from_sth
# Arg [1] : StatementHandle $sth
# Arg [2] : Bio::EnsEMBL::AssemblyMapper $mapper
# Arg [3] : Bio::EnsEMBL::Slice $dest_slice
# Description: PROTECTED implementation of abstract superclass method.
# Responsible for the creation of Transcripts.
# Returntype : Listref of Bio::EnsEMBL::Transcripts in target coord system
# Exceptions : none
# Caller : internal
# Status : Stable
sub _objs_from_sth {
my ($self, $sth, $mapper, $dest_slice) = @_;
#
# This code is ugly because an attempt has been made to remove as many
# function calls as possible for speed purposes. Thus many caches and
# a fair bit of gymnastics is used.
#
lib/Bio/EnsEMBL/DBSQL/TranscriptAdaptor.pm view on Meta::CPAN
Description: Gets all the transcripts with evidence from a specified hit_name on a particular type of feature, stored in the
transcript_supporting_feature table. Optionally filter by analysis. For hits stored in the supporting_feature
table (linked to exons) use fetch_all_by_exon_supporting_evidence instead.
Returntype : Listref of Bio::EnsEMBL::Transcript objects
Exceptions : If feature_type is not of correct type.
Caller : general
Status : Stable
=cut
sub fetch_all_by_transcript_supporting_evidence {
my ($self, $hit_name, $feature_type, $analysis) = @_;
if($feature_type !~ /(dna)|(protein)_align_feature/) {
throw("feature type must be dna_align_feature or protein_align_feature");
}
my $anal_from = "";
$anal_from = ", analysis a " if ($analysis);
my $anal_where = "";
$anal_where = "AND a.analysis_id = f.analysis_id AND a.analysis_id=? "
if ($analysis);
my $sql = qq(
SELECT DISTINCT(t.transcript_id)
FROM transcript t,
transcript_supporting_feature sf,
$feature_type f
$anal_from
WHERE t.transcript_id = sf.transcript_id
AND t.is_current = 1
AND sf.feature_id = f.${feature_type}_id
AND sf.feature_type = ?
AND f.hit_name=?
$anal_where
);
my $sth = $self->prepare($sql);
$sth->bind_param(1, $feature_type, SQL_VARCHAR);
$sth->bind_param(2, $hit_name, SQL_VARCHAR);
$sth->bind_param(3, $analysis->dbID(), SQL_INTEGER) if ($analysis);
$sth->execute();
my @transcripts;
while( my $id = $sth->fetchrow_array ) {
my $transcript = $self->fetch_by_dbID( $id );
push(@transcripts, $transcript) if $transcript;
}
return \@transcripts;
}
sub _final_clause {
return ' ORDER BY t.transcript_id'
}
sub update_canonical_attribute {
my ($self, $transcript_id, $old_transcript_id) = @_;
# Get canonical attribute id
my $db = $self->db();
my $attr_adaptor = $db->get_AttributeAdaptor();
my $canonical_attrib_id = @{$attr_adaptor->fetch_by_code('is_canonical')}[0];
throw("No attrib_type_id found for 'is_canonical' attribute in attrib_type table.") if (!defined($canonical_attrib_id));
# Check if new canonical transcript attribute exists
my $sth = $self->prepare("SELECT value FROM transcript_attrib WHERE transcript_id=? AND attrib_type_id=?");
$sth->execute($transcript_id, $canonical_attrib_id);
if (my ($exists) = $sth->fetchrow_array()) {
$sth->finish();
$sth = $self->prepare("UPDATE transcript_attrib SET value=? WHERE transcript_id=? AND attrib_type_id=?");
$sth->execute('1', $transcript_id, $canonical_attrib_id);
} else {
$sth->finish();
$sth = $self->prepare("INSERT INTO transcript_attrib (transcript_id, attrib_type_id, value) values(?,?,?)");
$sth->execute($transcript_id, $canonical_attrib_id, '1');
}
$sth->finish();
# Delete old canonical transcript attribute
if (defined($old_transcript_id) && $old_transcript_id ne $transcript_id) {
$sth = $self->prepare("DELETE FROM transcript_attrib WHERE transcript_id=? AND attrib_type_id=?");
$sth->execute($old_transcript_id, $canonical_attrib_id);
$sth->finish();
}
}
1;
( run in 1.040 second using v1.01-cache-2.11-cpan-f56aa216473 )