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:
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;