DataReleaseInfoAdaptor.pm
Go to the documentation of this file.
00001 
00002 =head1 LICENSE
00003 
00004 Copyright [1999-2016] EMBL-European Bioinformatics Institute
00005 
00006 Licensed under the Apache License, Version 2.0 (the "License");
00007 you may not use this file except in compliance with the License.
00008 You may obtain a copy of the License at
00009 
00010      http://www.apache.org/licenses/LICENSE-2.0
00011 
00012 Unless required by applicable law or agreed to in writing, software
00013 distributed under the License is distributed on an "AS IS" BASIS,
00014 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00015 See the License for the specific language governing permissions and
00016 limitations under the License.
00017 
00018 =cut
00019 
00020 =pod
00021 
00022 =head1 NAME
00023 
00024 Bio::EnsEMBL::MetaData::DBSQL::GenomeInfoAdaptor
00025 
00026 =head1 SYNOPSIS
00027 
00028 # metadata_db is an instance of MetaDataDBAdaptor
00029 my $adaptor = $metadata_db->get_DataReleaseInfoAdaptor();
00030 # find the latest e! release
00031 my $release = $adaptor->fetch_current_ensembl_release();
00032 # find associated databases
00033 $adaptor->fetch_databases($release);
00034 
00035 =head1 DESCRIPTION
00036 
00037 Adaptor for storing and retrieving DataRelease objects from MySQL genome_info database
00038 
00039 =head1 AUTHOR
00040 
00041 Dan Staines
00042 
00043 =head1 SEE ALSO
00044 
00045 Bio::EnsEMBL::MetaData::DataReleaseInfo
00046 Bio::EnsEMBL::MetaData::DatabaseInfo
00047 Bio::EnsEMBL::MetaData::GenomeInfo
00048 
00049 =cut
00050 
00051 package Bio::EnsEMBL::MetaData::DBSQL::DataReleaseInfoAdaptor;
00052 
00053 use strict;
00054 use warnings;
00055 
00056 use base qw/Bio::EnsEMBL::MetaData::DBSQL::BaseInfoAdaptor/;
00057 
00058 use Carp qw(cluck croak);
00059 use Bio::EnsEMBL::Utils::Argument qw( rearrange );
00060 use Bio::EnsEMBL::MetaData::DataReleaseInfo;
00061 
00062 =head1 METHODS
00063 =head2 store
00064   Arg        : Bio::EnsEMBL::MetaData::DatabaseInfo
00065   Description: Store the supplied object
00066   Returntype : none
00067   Exceptions : none
00068   Caller     : general
00069   Status     : Stable
00070 =cut
00071 
00072 sub store {
00073   my ( $self, $data_release ) = @_;
00074   if ( !defined $data_release->dbID() ) {
00075     # find out if organism exists first
00076     my $dbID;
00077     if ( defined $data_release->ensembl_genomes_version() ) {
00078       ($dbID) =
00079         @{
00080         $self->dbc()->sql_helper()->execute_simple(
00081           -SQL =>
00082 "select data_release_id from data_release where ensembl_version=? and ensembl_genomes_version=?",
00083           -PARAMS => [ $data_release->ensembl_version(),
00084                        $data_release->ensembl_genomes_version() ] ) };
00085     }
00086     else {
00087       ($dbID) =
00088         @{
00089         $self->dbc()->sql_helper()->execute_simple(
00090           -SQL =>
00091 "select data_release_id from data_release where ensembl_version=? and ensembl_genomes_version is null",
00092           -PARAMS => [ $data_release->ensembl_version() ] ) };
00093     }
00094 
00095     if ( defined $dbID ) {
00096       $data_release->dbID($dbID);
00097       $data_release->adaptor($self);
00098     }
00099   } ## end if ( !defined $data_release...)
00100   if ( defined $data_release->dbID() ) {
00101     $self->update($data_release);
00102   }
00103   else {
00104     $self->dbc()->sql_helper()->execute_update(
00105       -SQL =>
00106 q/insert into data_release(ensembl_version,ensembl_genomes_version,release_date,is_current) values (?,?,?,?)/,
00107       -PARAMS => [ $data_release->ensembl_version(),
00108                    $data_release->ensembl_genomes_version(),
00109                    $data_release->release_date() ],
00110       -CALLBACK => sub {
00111         my ( $sth, $dbh, $rv ) = @_;
00112         $data_release->dbID( $dbh->{mysql_insertid} );
00113       } );
00114     $data_release->adaptor($self);
00115     $self->_store_databases($data_release);
00116     $self->_store_cached_obj($data_release);
00117   }
00118   return;
00119 } ## end sub store
00120 =head2 update
00121   Arg        : Bio::EnsEMBL::MetaData::DatabaseInfo
00122   Description: Update the supplied object (must be previously stored)
00123   Returntype : none
00124   Exceptions : none
00125   Caller     : general
00126   Status     : Stable
00127 =cut
00128 sub update {
00129   my ( $self, $data_release ) = @_;
00130   if ( !defined $data_release->dbID() ) {
00131     croak "Cannot update an object that has not already been stored";
00132   }
00133 
00134   $self->dbc()->sql_helper()->execute_update(
00135     -SQL =>
00136 q/update data_release set ensembl_version=?, ensembl_genomes_version=?, release_date=? where data_release_id=?/,
00137     -PARAMS => [ $data_release->ensembl_version(),
00138                  $data_release->ensembl_genomes_version(),
00139                  $data_release->release_date(),
00140                  $data_release->dbID() ] );
00141 
00142   $self->_store_databases($data_release);
00143   return;
00144 }
00145 
00146 =head2 fetch_by_ensembl_release
00147   Arg        : String - Ensembl Release
00148   Description: Retrieve details for the specified Ensembl release
00149   Returntype : Bio::EnsEMBL::MetaData::DataReleaseInfo
00150   Exceptions : none
00151   Caller     : general
00152   Status     : Stable
00153 =cut
00154 sub fetch_by_ensembl_release {
00155   my ( $self, $release ) = @_;
00156   return
00157     $self->_first_element(
00158              $self->_fetch_generic(
00159                _get_base_sql() .
00160                  ' where ensembl_version=? and ensembl_genomes_version is null',
00161                [$release] ) );
00162 }
00163 =head2 fetch_by_ensembl_genomes_release
00164   Arg        : String - Ensembl Genomes Release
00165   Description: Retrieve details for the specified Ensembl Genomes release
00166   Returntype : Bio::EnsEMBL::MetaData::DataReleaseInfo
00167   Exceptions : none
00168   Caller     : general
00169   Status     : Stable
00170 =cut
00171 sub fetch_by_ensembl_genomes_release {
00172   my ( $self, $release ) = @_;
00173   return
00174     $self->_first_element(
00175                          $self->_fetch_generic(
00176                            _get_base_sql() . ' where ensembl_genomes_version=?',
00177                            [$release] ) );
00178 }
00179 =head2 fetch_current_ensembl_release
00180   Description: Retrieve details for the current Ensembl release
00181   Returntype : Bio::EnsEMBL::MetaData::DataReleaseInfo
00182   Exceptions : none
00183   Caller     : general
00184   Status     : Stable
00185 =cut
00186 sub fetch_current_ensembl_release {
00187   my ($self) = @_;
00188   return
00189     $self->_first_element(
00190     $self->_fetch_generic(
00191       _get_base_sql() .
00192 ' where ensembl_genomes_version is null order by release_date desc limit 1' ) );
00193 }
00194 =head2 fetch_current_ensembl_genomes_release
00195   Description: Retrieve details for the current Ensembl Genomes release
00196   Returntype : Bio::EnsEMBL::MetaData::DataReleaseInfo
00197   Exceptions : none
00198   Caller     : general
00199   Status     : Stable
00200 =cut
00201 sub fetch_current_ensembl_genomes_release {
00202   my ($self) = @_;
00203   return
00204     $self->_first_element(
00205     $self->_fetch_generic(
00206       _get_base_sql() .
00207 ' where ensembl_genomes_version is not null order by release_date desc limit 1'
00208     ) );
00209 }
00210 =head2 
00211   Arg        : Bio::EnsEMBL::MetaData::DataReleaseInfo
00212   Arg        : String - (optional) division
00213   Description: Retrieve databases associated with the specified release
00214   Returntype : Arrayref of Bio::EnsEMBL::MetaData::DatabaseInfo
00215   Exceptions : none
00216   Caller     : general
00217   Status     : Stable
00218 =cut
00219 sub fetch_databases {
00220   my ( $self, $release, $division ) = @_;
00221   my $databases = $release->databases();
00222   if(defined $division) {
00223     $databases = [grep {$division eq $_->division()} @{$release->databases()}];
00224   }
00225   if ( defined $division ) {
00226     $databases = [ @$databases,
00227                    @{$self->db()->get_GenomeInfoAdaptor()
00228                        ->fetch_division_databases( $division, $release ) },
00229                    @{$self->db()->get_GenomeInfoAdaptor()
00230                        ->fetch_division_databases( $division, $release ) } ];
00231   }
00232   else {
00233     $databases = [ @$databases,
00234                    @{$self->db()->get_GenomeInfoAdaptor()
00235                        ->fetch_databases($release) },
00236                    @{$self->db()->get_GenomeInfoAdaptor()
00237                        ->fetch_databases($release) } ];
00238   }
00239   return $databases;
00240 } ## end sub fetch_databases
00241 
00242 =head1 INTERNAL METHODS
00243 =head2 _fetch_children
00244   Arg        : Arrayref of Bio::EnsEMBL::MetaData::GenomeInfo
00245   Description: Fetch all children of specified genome info object
00246   Returntype : none
00247   Exceptions : none
00248   Caller     : internal
00249   Status     : Stable
00250 =cut
00251 
00252 sub _fetch_children {
00253   my ( $self, $md ) = @_;
00254   $self->_fetch_databases($md);
00255   return;
00256 }
00257 
00258 =head2 _fetch_databases
00259   Arg        : Bio::EnsEMBL::MetaData::DataReleaseInfo 
00260   Description: Add databases to supplied object
00261   Returntype : none
00262   Exceptions : none
00263   Caller     : internal
00264   Status     : Stable
00265 =cut
00266 
00267 sub _fetch_databases {
00268   my ( $self, $release ) = @_;
00269   croak
00270 "Cannot fetch databases for a DataReleaseInfo object that has not been stored"
00271     if !defined $release->dbID();
00272   my $databases =
00273     $self->db()->get_DatabaseInfoAdaptor()
00274     ->fetch_databases($release);
00275   $release->databases($databases);
00276   return;
00277 }
00278 
00279 =head2 _store_databases
00280   Arg        : Bio::EnsEMBL::MetaData::DataReleaseInfo 
00281   Description: Store databases from supplied object
00282   Returntype : none
00283   Exceptions : none
00284   Caller     : internal
00285   Status     : Stable
00286 =cut
00287 
00288 sub _store_databases {
00289   my ( $self, $release ) = @_;
00290   $self->dbc()->sql_helper()->execute_update(
00291            -SQL => q/delete from data_release_database where data_release_id=?/,
00292            -PARAMS => [ $release->dbID() ] );
00293 
00294   for my $database ( @{ $release->databases() } ) {
00295     print "Storing database ".$database->dbname()."\n";
00296         $self->db()->get_DatabaseInfoAdaptor()->store($database);
00297   }
00298   return;
00299 }
00300 # internal implementation
00301 my $base_data_release_fetch_sql =
00302 q/select data_release_id as dbID, ensembl_version, ensembl_genomes_version, release_date from data_release/;
00303 
00304 sub _get_base_sql {
00305   return $base_data_release_fetch_sql;
00306 }
00307 
00308 sub _get_id_field {
00309   return 'data_release_id';
00310 }
00311 
00312 sub _get_obj_class {
00313   return 'Bio::EnsEMBL::MetaData::DataReleaseInfo';
00314 }
00315 
00316 1;