Mercurial > repos > mahtabm > ensembl
diff variant_effect_predictor/Bio/EnsEMBL/DBSQL/BaseMetaContainer.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/BaseMetaContainer.pm Thu Apr 11 02:01:53 2013 -0400 @@ -0,0 +1,418 @@ +=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::BaseMetaContainer - Encapsulates all generic access +to database meta information + +=head1 SYNOPSIS + + my $meta_container = $db_adaptor->get_MetaContainer(); + + my @mapping_info = + @{ $meta_container->list_value_by_key('assembly.mapping') }; + +=head1 DESCRIPTION + + An object that encapsulates access to db meta data + +=head1 METHODS + +=cut + +package Bio::EnsEMBL::DBSQL::BaseMetaContainer; + +use vars qw(@ISA); +use strict; + +use Bio::EnsEMBL::DBSQL::BaseAdaptor; +use Bio::EnsEMBL::Utils::Exception qw(throw deprecate warning); + +@ISA = qw(Bio::EnsEMBL::DBSQL::BaseAdaptor); + +# new() is inherited from Bio::EnsEMBL::DBSQL::BaseAdaptor + +=head2 get_schema_version + + Arg [1] : none + Example : $schema_ver = $meta_container->get_schema_version(); + Description: Retrieves the schema version from the database meta table + Returntype : int + Exceptions : none + Caller : ? + Status : Medium risk + +=cut + +sub get_schema_version { + my $self = shift; + + my $arrRef = $self->list_value_by_key('schema_version'); + + if (@$arrRef) { + my ($ver) = ( $arrRef->[0] =~ /^\s*(\d+)\s*$/ ); + if ( !defined($ver) ) { # old style format + return 0; + } + return $ver; + } else { + warning( + sprintf( + "Please insert meta_key 'schema_version' " + . "in meta table on core database '%s'\n", + $self->dbc()->dbname() ) ); + } + + return 0; +} + + +=head2 list_value_by_key + + Arg [1] : string $key + the key to obtain values from the meta table with + Example : my @values = @{ $meta_container->list_value_by_key($key) }; + Description: gets a value for a key. Can be anything + Returntype : listref of strings + Exceptions : none + Caller : ? + Status : Stable + +=cut + +sub list_value_by_key { + my ( $self, $key ) = @_; + + $self->{'cache'} ||= {}; + + if ( exists $self->{'cache'}->{$key} ) { + return $self->{'cache'}->{$key}; + } + + my $sth; + + if ( !$self->_species_specific_key($key) ) { + $sth = + $self->prepare( "SELECT meta_value " + . "FROM meta " + . "WHERE meta_key = ? " + . "AND species_id IS NULL " + . "ORDER BY meta_id" ); + } else { + $sth = + $self->prepare( "SELECT meta_value " + . "FROM meta " + . "WHERE meta_key = ? " + . "AND species_id = ? " + . "ORDER BY meta_id" ); + $sth->bind_param( 2, $self->species_id(), SQL_INTEGER ); + } + + $sth->bind_param( 1, $key, SQL_VARCHAR ); + $sth->execute(); + + my @result; + while ( my $arrRef = $sth->fetchrow_arrayref() ) { + push( @result, $arrRef->[0] ); + } + + $sth->finish(); + $self->{'cache'}->{$key} = \@result; + + return \@result; +} ## end sub list_value_by_key + +=head2 single_value_by_key + + Arg [1] : string $key + the key to obtain values from the meta table with + Arg [2] : boolean $warn + If true will cause the code to warn the non-existence of a value + Example : my $value = $mc->single_value_by_key($key); + Description: Gets a value for a key. Can be anything + Returntype : Scalar + Exceptions : Raised if more than 1 meta item is returned + +=cut + +sub single_value_by_key { + my ($self, $key, $warn) = @_; + my $results = $self->list_value_by_key($key); + if(defined $results) { + my $count = scalar(@{$results}); + if($count == 1) { + my ($value) = @{$results}; + return $value; + } + elsif($count == 0) { + if($warn) { + my $group = $self->db()->group(); + my $msg = sprintf(qq{Please insert meta_key '%s' in meta table at %s db\n}, $key, $group); + warning($msg); + } + } + else { + my $values = join(q{,}, @{$results}); + throw sprintf(q{Found the values [%s] for the key '%s'}, $values, $key); + } + } + return; +} ## end sub single_value_by_key + +=head2 store_key_value + + Arg [1] : string $key + a key under which $value should be stored + Arg [2] : string $value + the value to store in the meta table + Example : $meta_container->store_key_value($key, $value); + Description: stores a value in the meta container, accessable by a key + Returntype : none + Exceptions : Thrown if the key/value already exists. + Caller : ? + Status : Stable + +=cut + +sub store_key_value { + my ( $self, $key, $value ) = @_; + + if ( $self->key_value_exists( $key, $value ) ) { + warn( "Key-value pair '$key'-'$value' " + . "already exists in the meta table; " + . "not storing duplicate" ); + return; + } + + my $sth; + + if ( !$self->_species_specific_key($key) ) { + $sth = $self->prepare( + 'INSERT INTO meta (meta_key, meta_value, species_id) ' + . 'VALUES(?, ?, \N)' ); + } else { + $sth = $self->prepare( + 'INSERT INTO meta (meta_key, meta_value, species_id) ' + . 'VALUES (?, ?, ?)' ); + $sth->bind_param( 3, $self->species_id(), SQL_INTEGER ); + } + + $sth->bind_param( 1, $key, SQL_VARCHAR ); + $sth->bind_param( 2, $value, SQL_VARCHAR ); + $sth->execute(); + + $self->{'cache'} ||= {}; + + delete $self->{'cache'}->{$key}; +} ## end sub store_key_value + +=head2 update_key_value + + Arg [1] : string $key + a key under which $value should be updated + Arg [2] : string $value + the value to update in the meta table + Example : $meta_container->update_key_value($key, $value); + Description: update a value in the meta container, accessable by a key + Returntype : none + Exceptions : none + Caller : ? + Status : Stable + +=cut + +sub update_key_value { + my ( $self, $key, $value ) = @_; + + my $sth; + + if ( !$self->_species_specific_key($key) ) { + $sth = + $self->prepare( 'UPDATE meta SET meta_value = ? ' + . 'WHERE meta_key = ?' + . 'AND species_id IS NULL' ); + } else { + $sth = + $self->prepare( 'UPDATE meta ' + . 'SET meta_value = ? ' + . 'WHERE meta_key = ? ' + . 'AND species_id = ?' ); + $sth->bind_param( 3, $self->species_id(), SQL_INTEGER ); + } + + $sth->bind_param( 1, $value, SQL_VARCHAR ); + $sth->bind_param( 2, $key, SQL_VARCHAR ); + $sth->execute(); + +} ## end sub update_key_value + + +=head2 delete_key + + Arg [1] : string $key + The key which should be removed from the database. + Example : $meta_container->delete_key('sequence.compression'); + Description: Removes all rows from the meta table which have a meta_key + equal to $key. + Returntype : none + Exceptions : none + Caller : dna_compress script, general + Status : Stable + +=cut + +sub delete_key { + my ( $self, $key ) = @_; + + my $sth; + + if ( !$self->_species_specific_key($key) ) { + $sth = + $self->prepare( 'DELETE FROM meta ' + . 'WHERE meta_key = ?' + . 'AND species_id IS NULL' ); + } else { + $sth = + $self->prepare( 'DELETE FROM meta ' + . 'WHERE meta_key = ? ' + . 'AND species_id = ?' ); + $sth->bind_param( 2, $self->species_id(), SQL_INTEGER ); + } + + $sth->bind_param( 1, $key, SQL_VARCHAR ); + $sth->execute(); + + delete $self->{'cache'}->{$key}; +} + +=head2 delete_key_value + + Arg [1] : string $key + The key which should be removed from the database. + Arg [2] : string $value + The value to be removed. + Example : $meta_container->delete_key('patch', 'patch_39_40_b.sql|xref_unique_constraint'); + Description: Removes all rows from the meta table which have a meta_key + equal to $key, AND a meta_value equal to $value. + Returntype : none + Exceptions : none + Caller : general + Status : Stable + +=cut + +sub delete_key_value { + my ( $self, $key, $value ) = @_; + + my $sth; + + if ( !$self->_species_specific_key($key) ) { + $sth = + $self->prepare( 'DELETE FROM meta ' + . 'WHERE meta_key = ? ' + . 'AND meta_value = ?' + . 'AND species_id IS NULL' ); + } else { + $sth = + $self->prepare( 'DELETE FROM meta ' + . 'WHERE meta_key = ? ' + . 'AND meta_value = ? ' + . 'AND species_id = ?' ); + $sth->bind_param( 3, $self->species_id(), SQL_INTEGER ); + } + + $sth->bind_param( 1, $key, SQL_VARCHAR ); + $sth->bind_param( 2, $value, SQL_VARCHAR ); + $sth->execute(); + + delete $self->{'cache'}->{$key}; +} ## end sub delete_key_value + +=head2 key_value_exists + + Arg [1] : string $key + the key to check + Arg [2] : string $value + the value to check + Example : if ($meta_container->key_value_exists($key, $value)) ... + Description: Return true (1) if a particular key/value pair exists, + false (0) otherwise. + Returntype : boolean + Exceptions : none + Caller : ? + Status : Stable + +=cut + +sub key_value_exists { + my ( $self, $key, $value ) = @_; + + my $sth; + + if ( !$self->_species_specific_key($key) ) { + $sth = + $self->prepare( 'SELECT meta_value ' + . 'FROM meta ' + . 'WHERE meta_key = ? ' + . 'AND meta_value = ?' + . 'AND species_id IS NULL' ); + } else { + $sth = + $self->prepare( 'SELECT meta_value ' + . 'FROM meta ' + . 'WHERE meta_key = ? ' + . 'AND meta_value = ? ' + . 'AND species_id = ?' ); + $sth->bind_param( 3, $self->species_id(), SQL_INTEGER ); + } + + $sth->bind_param( 1, $key, SQL_VARCHAR ); + $sth->bind_param( 2, $value, SQL_VARCHAR ); + $sth->execute(); + + while ( my $arrRef = $sth->fetchrow_arrayref() ) { + if ( $arrRef->[0] eq $value ) { + $sth->finish(); + return 1; + } + } + + return 0; +} ## end sub key_value_exists + +# This utility method determines whether the key is a species-specific +# meta key or not. If the key is either 'patch' or 'schema_version', +# then it is not species-specific. + +# FIXME variation team messed up in release 65 and added the ploidy +# entry without species_id - this will be corrected for release 66, +# for now, I've added it to the list of allowed non-species specific + +sub _species_specific_key { + my ( $self, $key ) = @_; + + return ( $key ne 'patch' + && $key ne 'schema_version' + && $key ne 'schema_type' + && $key ne 'ploidy'); +} + +1;