From fc6f84e5a3127db6da5034aeb48b0e536b6c03ad Mon Sep 17 00:00:00 2001 From: Andrew Yates <ayates@ebi.ac.uk> Date: Wed, 7 Aug 2013 23:04:51 +0000 Subject: [PATCH] reverting last change --- .../Bio/EnsEMBL/DBSQL/Support/FullIdCache.pm | 233 +++--------------- modules/t/fullIdCaching.t | 58 +---- 2 files changed, 34 insertions(+), 257 deletions(-) diff --git a/modules/Bio/EnsEMBL/DBSQL/Support/FullIdCache.pm b/modules/Bio/EnsEMBL/DBSQL/Support/FullIdCache.pm index a9f0cb7cfb..9d0b9f7edf 100644 --- a/modules/Bio/EnsEMBL/DBSQL/Support/FullIdCache.pm +++ b/modules/Bio/EnsEMBL/DBSQL/Support/FullIdCache.pm @@ -33,8 +33,6 @@ An implementation of caching which uses a raw hash to hold all available values from an adaptor. Useful for working with a controlled vocabulary table where cardinality is low. -Provides extra functionality to compute additional lookup keys. - =head1 METHODS =cut @@ -61,228 +59,63 @@ sub build_cache { my ($self) = @_; my $adaptor = $self->adaptor(); my %cache; - my $objects = $adaptor->generic_fetch(); - my $support_additional_lookups = $self->support_additional_lookups(); - foreach my $object (@{$objects}) { - my $key = $object->dbID(); - $cache{$key} = $object; - #Add to additional lookup - $self->add_to_additional_lookups($key, $object); + my $objs = $adaptor->generic_fetch(); + foreach my $obj (@{$objs}) { + $cache{$obj->dbID()} = $obj; } return \%cache; } -########### Additional lookup code +=head2 clear_cache -sub put { - my ($self, $key, $object) = @_; - my $old = $self->SUPER::put($key, $object); - #Add to additional lookup - $self->add_to_additional_lookups($key, $object); - return $old if $old; - return; -} + Description: Delegates to C<delete_cache()> in order to clear all values + and on the next cache request will force a C<build_cache()> + call + Returntype : None + Exceptions : None + Caller : BaseAdaptors + Status : Beta -sub remove { - my ($self, $key) = @_; - my $old = $self->SUPER::remove($key); - if($old) { - #Remove it from the additional lookup - $self->remove_from_additional_lookup($key, $old); - return $old; - } - return; -} +=cut sub clear_cache { my ($self) = @_; $self->delete_cache(); - #Remove the additional lookup hash contents - delete $self->{_additional_lookup}; return; } -=head2 get_by_additional_lookup - - Arg [1] : String key of the lookup to search for the value in - Arg [2] : String value to search for. We expect exact lookups in the hash - Description : Returns the object linked to the value in the specified lookup. - Example : my $analysis = $cache->get_by_additional_lookup('logic_name', 'xrefchecksum'); - Returntype : Object a single object - Exceptions : Throws an exception if there are more than one ID linked to the - value lookup. Also thrown if additional lookups are not supported - Caller : BaseAdaptors - Status : Beta - -=cut - -sub get_by_additional_lookup { - my ($self, $key, $value) = @_; - my $additional_lookup = $self->_additional_lookup(); - if(exists $additional_lookup->{$key}) { - if(exists $additional_lookup->{$key}->{$value}) { - my $ids = $additional_lookup->{$key}->{$value}; - my $size = scalar(@{$ids}); - if($size > 1) { - throw "The lookup $key and search value $value has more than one value attached. Use get_all_by_additional_lookup() instead to fetch"; - } - elsif($size == 1) { - return $self->get($ids->[0]); - } - } - } - return; -} - -=head2 get_all_by_additional_lookup - - Arg [1] : String key of the lookup to search for the value in - Arg [2] : String value to search for. We expect exact lookups in the hash - Description : Returns an array of all the objects linked to the value - in the specified lookup. - Example : my $array = $cache->get_all_by_additional_lookup('logic_name', 'xrefchecksum'); - Returntype : ArrayRef of objects keyed agains the second argument - Exceptions : Throws an exception if there are more than one ID linked to the - value lookup. Also thrown if additional lookups are not supported - Caller : BaseAdaptors - Status : Beta - -=cut - -sub get_all_by_additional_lookup { - my ($self, $key, $value) = @_; - my $additional_lookup = $self->_additional_lookup(); - if(exists $additional_lookup->{$key}) { - if(exists $additional_lookup->{$key}->{$value}) { - my $ids = $additional_lookup->{$key}->{$value}; - return $self->get_by_list($ids); - } - } - return []; -} - -=head2 remove_from_additional_lookup +=head2 put - Arg [1] : String The lookup key to remove from the additional lookup hash - Arg [2] : Object The object to remove from the additional lookup hash - Description : Re-computes the additional keys for this object - Example : $cache->remove_Object_from_additional_lookup($lookup_key, $object); - Returntype : None - Exceptions : Thrown if we do not support additional lookups - Caller : BaseAdaptors - Status : Beta + Description: Unsupported operation since this cache is read only apart from + during the build process + Returntype : None + Exceptions : Thrown if ever called + Caller : BaseAdaptors + Status : Beta =cut -sub remove_from_additional_lookup { - my ($self, $lookup_key, $object) = @_; - - my $additional_lookup = $self->_additional_lookup(); - - # Compute the keys - my $keys = $self->compute_keys($object); - - foreach my $key (keys %{$keys}) { - my $value = $keys->{$key}; - - #Only remove if we had originally stored this as an - #additional lookup - if(exists $additional_lookup->{$key}) { - if(exists $additional_lookup->{$key}->{$value}) { - - #Get the object ID & lookup the array of DBIDs - my $lookup_keys = $additional_lookup->{$key}->{$value}; - my $length = scalar(@{$lookup_keys}); - for(my $i = 0; $i < $length; $i++) { - if($lookup_keys->[$i] == $lookup_key) { - #remove the 1 lookup key from the array and then terminate the - #loop as we found our value - splice(@{$lookup_keys}, $i, 1); - last; - } - } - - #If the size has hit 0 then delete the array - if(scalar(@{$lookup_keys}) == 0) { - delete $additional_lookup->{$key}->{$value}; - } - } - } - } - +sub put { + my ($self) = @_; + throw 'Unsupported operation'; return; } -=head2 compute_keys - - Arg [1] : Object The object to compute keys from - Description : Override to provide support for additional key lookup. The - keys of the hash should represent the lookup name and the - value is the computed key. - Example : Example of returning hash not of its usage. Proposed Analysis encoding - { logic_name => 'xrefalignment', display_label => 'Xref Alignment'} - Returntype : HashRef key is the lookup name and value is the computed key - Exceptions : none - Caller : BaseAdaptors - Status : Beta - -=cut - -sub compute_keys { - my ($self, $object) = @_; - return {}; -} +=head2 remove -=head2 add_to_additional_lookups - - Arg [1] : String The key used in the primary lookup hash. Normally - a DB identifier - Arg [2] : Object The object to add to the additional lookups - Description : Internally calls the C<compute_keys()> method and adds - the object to the C<_additional_lookup()> hash. - Returntype : None - Exceptions : Thrown if additional lookups are not supported - Caller : BaseAdaptors - Status : Beta - -=cut - -sub add_to_additional_lookups { - my ($self, $lookup_key, $object) = @_; - my $keys = $self->compute_keys($object); - my $additional_lookup = $self->_additional_lookup(); - foreach my $key (keys %{$keys}) { - my $value = $keys->{$key}; - push(@{$additional_lookup->{$key}->{$value}}, $lookup_key); - } - return; -} - -=head2 _additional_lookup - - Description : Returns the additional lookup hash - Example : Example of additional hash structure (key is - lookup name, second key is value to search for - and value is an array of dbIDs) - { - logic_name => { - xrefalignment => [1] - }, - display_label => { - 'Xref Alignment' => [1] - } - } - Returntype : HashRef - Exceptions : none - Caller : BaseAdaptors - Status : Beta + Description: Unsupported operation since this cache is read only apart from + during the build process + Returntype : None + Exceptions : Thrown if ever called + Caller : BaseAdaptors + Status : Beta =cut -sub _additional_lookup { +sub remove { my ($self) = @_; - $self->{_additional_lookup} ||= {}; - return $self->{_additional_lookup}; + throw 'Unsupported operation'; + return; } -1; \ No newline at end of file +1; diff --git a/modules/t/fullIdCaching.t b/modules/t/fullIdCaching.t index acfc16512b..764b7819b0 100644 --- a/modules/t/fullIdCaching.t +++ b/modules/t/fullIdCaching.t @@ -1,26 +1,3 @@ -package TemporaryGeneCache; - -use base qw/Bio::EnsEMBL::DBSQL::Support::FullIdCache/; -use strict; -use warnings; - -sub support_additional_lookups { - return 1; -} - -sub compute_keys { - my ($self, $object) = @_; - return { - biotype => $object->biotype(), - logic_name => $object->analysis()->logic_name(), - dbID => $object->dbID() - }; -} - -1; - -####################### - package main; use strict; @@ -44,7 +21,7 @@ sub BEGIN { no strict 'refs'; ## no critic *Bio::EnsEMBL::DBSQL::GeneAdaptor::_build_id_cache = sub { my ($self) = @_; - return TemporaryGeneCache->new($self); + return Bio::EnsEMBL::DBSQL::Support::FullIdCache->new($self); }; no warnings 'redefine'; my $original_store = \&Bio::EnsEMBL::DBSQL::GeneAdaptor::store; @@ -87,39 +64,6 @@ sub BEGIN { is_deeply($first_gene_refetch, $refetched_cached_ids->[0], 'fetch_by_dbID() should return the same object as fetch_all_by_dbID_list()'); ok(! defined $adaptor->fetch_by_dbID(1), 'Fetching with a bad ID returns nothing'); is(scalar(@{$adaptor->fetch_all_by_dbID_list([1])}), 0, 'Fetching with a bad ID returns an empty array'); - - ############ Test additional lookup code - { - my $protein_coding_genes = $cache->get_all_by_additional_lookup('biotype', 'protein_coding'); - is_deeply([sort map { $_->dbID() } @{$protein_coding_genes} ], [sort map { $_->dbID() } @{$genes} ], 'Protein coding lookup returns all genes'); - - my $wibble_genes = $cache->get_all_by_additional_lookup('biotype', 'wibble'); - is_deeply([], $wibble_genes, 'biotype is a valid lookup but wibble is a bad key. Empty array return'); - - my $bad_lookup = $cache->get_all_by_additional_lookup('wibble', 'wibble'); - is_deeply([], $wibble_genes, 'wibble is a bad lookup. Empty array return'); - - my $individual_gene = $cache->get_by_additional_lookup('dbID', $gene_ids->[0]); - is($individual_gene->dbID, $gene_ids->[0], 'Lookup of dbID returns a single value'); - is($cache->get($gene_ids->[0]), $individual_gene, 'Same object is returned from the main get() method and the lookup'); - - dies_ok { $cache->get_by_additional_lookup('biotype', 'protein_coding') } 'Expect to die as the query will return more than one value'; - - $cache->remove($individual_gene->dbID()); - my $new_protein_coding_genes = $cache->get_all_by_additional_lookup('biotype', 'protein_coding'); - - ok(! defined $cache->get_by_additional_lookup('dbID', $gene_ids->[0]), 'Removed gene so lookups can no longer return an object'); - ok(! exists $cache->_additional_lookup()->{dbID}->{$gene_ids->[0]}, 'Removed the resulting array from the lookup hash'); - ok(exists $cache->_additional_lookup()->{biotype}->{protein_coding}, 'Biotype lookup still exists for protein_coding'); - is(scalar(@{$new_protein_coding_genes}), (scalar(@{$protein_coding_genes}) -1), 'Reduced the returned number of protein coding genes by one'); - - $cache->put($individual_gene->dbID(), $individual_gene); - ok(defined $cache->get_by_additional_lookup('dbID', $gene_ids->[0]), 'Added the gene back in. Everything is OK again'); - - #Checking DBSQL based lookup works - my $sql_protein_coding_genes = $cache->get_by_sql('select gene_id from gene where biotype =?', ['protein_coding']); - is_deeply([sort map { $_->dbID() } @{$sql_protein_coding_genes} ], [sort map { $_->dbID() } @{$protein_coding_genes} ], 'SQL based protein_coding lookup returns all genes'); - } #Turn off caching; we should get a fresh object out of the cache my $cached_obj = $adaptor->fetch_by_dbID($gene_ids->[0]); -- GitLab