Mercurial > repos > mahtabm > ensembl
diff variant_effect_predictor/Bio/EnsEMBL/Storable.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/Storable.pm Thu Apr 11 02:01:53 2013 -0400 @@ -0,0 +1,240 @@ +=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::Storable + +=head1 SYNOPSIS + + my $dbID = $storable_object->dbID(); + my $adaptor = $storable_object->adaptor(); + if ( $storable_object->is_stored($db_adaptor) ) { ... } + +=head1 DESCRIPTION + +This is a storable base class. All objects which are storable +in the database should inherit from this class. It provides two +getter/setters: dbID() adaptor(). And a is_stored() method that can be +used to determine if an object is already stored in a database. + +=cut + +use strict; +use warnings; + +package Bio::EnsEMBL::Storable; + + +use Bio::EnsEMBL::Utils::Exception qw(throw warning); +use Bio::EnsEMBL::Utils::Argument qw(rearrange); +use Bio::EnsEMBL::Utils::Scalar qw(assert_ref); +use Scalar::Util qw(weaken); + +=head2 new + + Arg [-ADAPTOR] : Bio::EnsEMBL::DBSQL::BaseAdaptor + Arg [-dbID] : database internal id + Caller : internal calls + Description : create a new Storable object + Returntype : Bio::EnsEMBL::Storable + Exceptions : Adaptor not a Bio::EnsEMBL::DBSQL::BaseAdaptor + Status : Stable + +=cut + +sub new { + my $caller = shift; + my $class = ref($caller) || $caller; + + my ($adaptor, $dbID) = rearrange(['ADAPTOR', 'dbID'],@_); + + if($adaptor) { + if(!ref($adaptor) || !$adaptor->isa('Bio::EnsEMBL::DBSQL::BaseAdaptor')) { + throw('-ADAPTOR argument must be a Bio::EnsEMBL::DBSQL::BaseAdaptor'); + } + } + + my $self = bless({'dbID' => $dbID}, $class); + $self->adaptor($adaptor); + return $self; +} + + +=head2 dbID + + Arg [1] : int $dbID + Description: getter/setter for the database internal id + Returntype : int + Exceptions : none + Caller : general, set from adaptor on store + Status : Stable + +=cut + +sub dbID { + my $self = shift; + $self->{'dbID'} = shift if(@_); + return $self->{'dbID'}; +} + + + +=head2 adaptor + + Arg [1] : Bio::EnsEMBL::DBSQL::BaseAdaptor $adaptor + Description: get/set for this objects Adaptor + Returntype : Bio::EnsEMBL::DBSQL::BaseAdaptor + Exceptions : none + Caller : general, set from adaptor on store + Status : Stable + +=cut + +sub adaptor { + my ($self, $adaptor) = @_; + if(scalar(@_) > 1) { + if(defined $adaptor) { + assert_ref($adaptor, 'Bio::EnsEMBL::DBSQL::BaseAdaptor', 'adaptor'); + $self->{adaptor} = $adaptor; + weaken($self->{adaptor}); + } + else { + $self->{adaptor} = undef; + } + } + return $self->{adaptor} +} + + + +=head2 is_stored + + Arg [1] : Bio::EnsEMBL::DBSQL::DBConnection + : or Bio::EnsEMBL::DBSQL::DBAdaptor + Example : do_something if($object->is_stored($db)); + Description: Returns true if this object is stored in the provided database. + This works under the assumption that if the adaptor and dbID are + set and the database of the adaptor shares the port, dbname and + hostname with the provided database, this object is stored in + that database. + Returntype : 1 or 0 + Exceptions : throw if dbID is set but adaptor is not + throw if adaptor is set but dbID is not + throw if incorrect argument is passed + Caller : store methods + Status : Stable + +=cut + +my $message_only_once =1; + +sub is_stored { + my $self = shift; + my $db = shift; + + if($db and $db->isa('Bio::EnsEMBL::DBSQL::DBAdaptor')) { + $db = $db->dbc(); + } + if(!$db || !ref($db) || !$db->isa('Bio::EnsEMBL::DBSQL::DBConnection')) { + throw('db argument must be a Bio::EnsEMBL::DBSQL::DBConnection'); + } + + my $adaptor = $self->{'adaptor'}; + my $dbID = $self->{'dbID'}; + + if($dbID && !$adaptor) { + if($message_only_once){ + warning("Storable object has a dbID but not an adaptor.\n" . + 'Storable objects must have neither OR both.'); + $message_only_once = 0; + } + return 0; + } + + if($adaptor && !$dbID) { + if($message_only_once){ + warning("Storable object has an adaptor but not a dbID.\n". + "Storable objects must have neither OR both."); + $message_only_once = 0; + } + return 0; + } + + return 0 if (!$adaptor && !$dbID); + + my $cur_db = $adaptor->dbc(); + + # + # Databases are the same if they share the same port, host and username + # + if ( $db->port() eq $cur_db->port() + && $db->host() eq $cur_db->host() + && $db->dbname() eq $cur_db->dbname() ) + { + return 1; + } + + return 0; +} + +sub get_all_DAS_Features{ + my ($self, $slice) = @_; + + $self->{_das_features} ||= {}; # Cache + $self->{_das_styles} ||= {}; # Cache + $self->{_das_segments} ||= {}; # Cache + my %das_features; + my %das_styles; + my %das_segments; + + foreach my $dasfact( @{$self->get_all_DASFactories} ){ + my $dsn = $dasfact->adaptor->dsn; + my $name = $dasfact->adaptor->name; + my $url = $dasfact->adaptor->url; + + # Construct a cache key : SOURCE_URL/TYPE + # Need the type to handle sources that serve multiple types of features + + my ($type) = ref($dasfact->adaptor->mapping) eq 'ARRAY' ? @{$dasfact->adaptor->mapping} : $dasfact->adaptor->mapping; + $type ||=$dasfact->adaptor->type; + my $key = join('/', $name, $type); + + if( $self->{_das_features}->{$key} ){ # Use cached + $das_features{$name} = $self->{_das_features}->{$key}; + $das_styles{$name} = $self->{_das_styles}->{$key}; + $das_segments{$name} = $self->{_das_segments}->{$key}; + } else { # Get fresh data + + my ($featref, $styleref, $segref) = ($type =~ /^ensembl_location/) ? ($dasfact->fetch_all_Features( $slice, $type )) : $dasfact->fetch_all_by_ID( $self ); + + $self->{_das_features}->{$key} = $featref; + $self->{_das_styles}->{$key} = $styleref; + $self->{_das_segments}->{$key} = $segref; + $das_features{$name} = $featref; + $das_styles{$name} = $styleref; + $das_segments{$name} = $segref; + } + } + + return (\%das_features, \%das_styles, \%das_segments); +} + +1;