Mercurial > repos > mahtabm > ensembl
diff variant_effect_predictor/Bio/EnsEMBL/DBSQL/MiscSetAdaptor.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/MiscSetAdaptor.pm Thu Apr 11 02:01:53 2013 -0400 @@ -0,0 +1,317 @@ +=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::MiscSetAdaptor - Provides database interaction for +Bio::EnsEMBL::MiscSet objects. + +=head1 SYNOPSIS + + my $msa = $registry->get_adaptor( 'Human', 'Core', 'MiscSet' ); + + my $misc_set = $msa->fetch_by_dbID(1234); + + $misc_set = $msa->fetch_by_code('clone'); + +=head1 DESCRIPTION + +This class provides database interactivity for MiscSet objects. +MiscSets are used to classify MiscFeatures into groups. + +=head1 METHODS + +=cut + +package Bio::EnsEMBL::DBSQL::MiscSetAdaptor; + +use strict; +use warnings; + +use Bio::EnsEMBL::MiscSet; +use Bio::EnsEMBL::DBSQL::BaseAdaptor; + +use Bio::EnsEMBL::Utils::Exception qw(throw warning); + +use vars qw(@ISA); + +@ISA = qw(Bio::EnsEMBL::DBSQL::BaseAdaptor); + + +=head2 new + + Arg [...] : Superclass args. See Bio::EnsEMBL::DBSQL::BaseAdaptor + Description: Instantiates a Bio::EnsEMBL::DBSQL::MiscSetAdaptor and + caches the contents of the MiscSet table. + Returntype : Bio::EnsEMBL::MiscSet + Exceptions : none + Caller : MiscFeatureAdaptor + Status : Stable + +=cut + + +sub new { + my $class = shift; + + my $self = $class->SUPER::new(@_); + + $self->{'_id_cache'} = {}; + $self->{'_code_cache'} = {}; + + # cache the entire contents of the misc set table + # the table is small and it removes the need to repeatedly query the + # table or join to the table + + $self->fetch_all(); + + return $self; +} + + + + +=head2 fetch_all + + Arg [1] : none + Example : foreach my $ms (@{$msa->fetch_all()}) { + print $ms->code(), ' ', $ms->name(), "\n"; + } + Description: Retrieves every MiscSet defined in the DB. + NOTE: In a multi-species database, this method will + return all the entries matching the search criteria, not + just the ones associated with the current species. + Returntype : listref of Bio::EnsEMBL::MiscSets + Exceptions : none + Caller : general + Status : Stable + +=cut + +sub fetch_all { + my $self = shift; + + my $sth = $self->prepare + ('SELECT misc_set_id, code, name, description, max_length FROM misc_set'); + + $sth->execute(); + + my ($dbID, $code, $name, $desc, $max_len); + $sth->bind_columns(\$dbID, \$code, \$name, \$desc, \$max_len); + + my @all; + + while($sth->fetch()) { + my $ms = Bio::EnsEMBL::MiscSet->new + (-DBID => $dbID, + -ADAPTOR => $self, + -CODE => $code, + -NAME => $name, + -DESCRIPTION => $desc, + -LONGEST_FEATURE => $max_len); + + $self->{'_id_cache'}->{$dbID} = $ms; + $self->{'_code_cache'}->{lc($code)} = $ms; + push @all, $ms; + } + + $sth->finish(); + + return \@all; +} + + + +=head2 fetch_by_dbID + + Arg [1] : int $dbID + The internal identifier of the misc set to retrieve + Example : my $ms = $msa->fetch_by_dbID($dbID); + Description: Retrieves a misc set via its internal identifier + Returntype : Bio::EnsEMBL::MiscSet + Exceptions : none + Caller : general + Status : Stable + +=cut + +sub fetch_by_dbID { + my $self = shift; + my $dbID = shift; + + if(!$self->{'_id_cache'}->{$dbID}) { + # on a cache miss reread the whole table and reload the cache + $self->fetch_all(); + } + + return $self->{'_id_cache'}->{$dbID}; +} + + + +=head2 fetch_by_code + + Arg [1] : string $code + The unique code of the MiscSet to retrieve + Example : my $ms = $msa->fetch_by_code('clone'); + Description: Retrieves a MiscSet via its code + Returntype : Bio::EnsEMBL::MiscSet + Exceptions : none + Caller : general + Status : Stable + +=cut + +sub fetch_by_code { + my $self = shift; + my $code = shift; + + if(!$self->{'_code_cache'}->{lc($code)}) { + # on cache miss, reread whole table and reload cache + $self->fetch_all(); + } + + return $self->{'_code_cache'}->{lc($code)}; +} + + + +=head2 store + + Arg [1] : list of MiscSets @mist_sets + Example : $misc_set_adaptor->store(@misc_sets); + Description: Stores a list of MiscSets in the database, and sets the + dbID and adaptor attributes of the stored sets. + Returntype : none + Exceptions : throw on incorrect arguments + warning if a feature is already stored in this database + Caller : MiscFeatureAdaptor::store + Status : Stable + +=cut + +sub store { + my $self = shift; + my @misc_sets = @_; + + # we use 'insert ignore' so that inserts can occur safely on the farm + # otherwise 2 processes could try to insert at the same time and one + # would fail + + my $sth = $self->prepare + ("INSERT IGNORE INTO misc_set " . + "SET code = ?, " . + " name = ?, " . + " description = ?, " . + " max_length = ?"); + + my $db = $self->db(); + + SET: + foreach my $ms (@misc_sets) { + if(!ref($ms) || !$ms->isa('Bio::EnsEMBL::MiscSet')) { + throw("List of MiscSet arguments expected."); + } + + if($ms->is_stored($db)) { + warning("MiscSet [".$ms->dbID."] is already stored in this database."); + next SET; + } + + $sth->bind_param(1,$ms->code,SQL_VARCHAR); + $sth->bind_param(2,$ms->name,SQL_VARCHAR); + $sth->bind_param(3,$ms->description,SQL_LONGVARCHAR); + $sth->bind_param(4,$ms->longest_feature,SQL_INTEGER); + + my $num_inserted = $sth->execute(); + + my $dbID; + + if($num_inserted == 0) { + # insert failed because set with this code already exists + my $sth2 = $self->prepare("SELECT misc_set_id from misc_set " . + "WHERE code = ?"); + $sth2->bind_param(1,$ms->code,SQL_VARCHAR); + $sth2->execute(); + + if($sth2->rows() != 1) { + throw("Could not retrieve or store MiscSet, code=[".$ms->code."]\n". + "Wrong database user/permissions?"); + } + + ($dbID) = $sth2->fetchrow_array(); + } else { + $dbID = $sth->{'mysql_insertid'}; + } + + $ms->dbID($dbID); + $ms->adaptor($self); + + # update the internal caches + $self->{'_id_cache'}->{$dbID} = $ms; + $self->{'_code_cache'}->{lc($ms->code())} = $ms; + } + + return; +} + +=head2 update + + Arg [1] : Bio::EnsEMBL::MiscSet $miscset + Example : $adaptor->update($miscset) + Description: Updates this misc_set in the database + Returntype : int 1 if update is performed, undef if it is not + Exceptions : throw if arg is not an misc_set object + Caller : ? + Status : Stable + +=cut + +sub update { + my $self = shift; + my $m = shift; + + if (!ref($m) || !$m->isa('Bio::EnsEMBL::MiscSet')) { + throw("Expected Bio::EnsEMBL::MiscSet argument."); + } + + if(!$m->is_stored($self->db())) { + return undef; + } + + my $sth = $self->prepare("UPDATE misc_set ". + "SET code =?, name =?, description = ?, max_length = ? ". + "WHERE misc_set_id = ?"); + + $sth->bind_param(1,$m->code,SQL_VARCHAR); + $sth->bind_param(2,$m->name,SQL_VARCHAR); + $sth->bind_param(3,$m->description,SQL_VARCHAR); + $sth->bind_param(4,$m->longest_feature,SQL_INTEGER); + $sth->bind_param(5,$m->dbID,SQL_INTEGER); + + $sth->execute(); + $sth->finish(); + + # update the internal caches + $self->{'_id_cache'}->{$m->dbID} = $m; + $self->{'_code_cache'}->{lc($m->code())} = $m; +} + +1;
