diff --git a/modules/Bio/EnsEMBL/DBSQL/GeneAdaptor.pm b/modules/Bio/EnsEMBL/DBSQL/GeneAdaptor.pm index e4fd2b20a95c63fcc3bbca82983ad54860270a02..c6887e3db71da6f212bd56ea89f4323b310c3c6e 100644 --- a/modules/Bio/EnsEMBL/DBSQL/GeneAdaptor.pm +++ b/modules/Bio/EnsEMBL/DBSQL/GeneAdaptor.pm @@ -446,52 +446,69 @@ sub fetch_all_by_domain { =cut sub fetch_all_by_Slice_and_external_dbname_link { - my $self = shift; - my $slice = shift; - my $logic_name = shift; - my $load_transcripts = shift; - my $db_name = shift; - my @genes_passed; - my $external_db_id; - #get the external_db_id from the name + my ( $self, $slice, $logic_name, $load_transcripts, $db_name ) = @_; + + # Get the external_db_id(s) from the name. my $sth = $self->prepare( - "SELECT external_db_id from external_db where db_name = ?"); + "SELECT external_db_id FROM external_db WHERE db_name = ?"); - $sth->bind_param(1,$db_name,SQL_VARCHAR); + $sth->bind_param( 1, $db_name, SQL_VARCHAR ); $sth->execute(); - $sth->bind_columns(\$external_db_id); - $sth->fetch; - if(!defined($external_db_id) || $external_db_id == 0){ - warn "Could not find external database $db_name in the external_db table\navailable are:-\n"; - $sth = $self->prepare( - "SELECT db_name from external_db"); + + my $external_db_id; + $sth->bind_columns( \$external_db_id ); + + my @external_db_ids; + while ( $sth->fetch() ) { + push( @external_db_ids, $external_db_id ); + } + + if ( scalar(@external_db_id) == 0 ) { + warn sprintf( "Could not find external database " + . "'%s' in the external_db table\n" + . "Available are:\n", + $db_name ); + + $sth = $self->prepare("SELECT DISTINCT db_name FROM external_db"); + $sth->execute(); - $sth->bind_columns(\$external_db_id); - while($sth->fetch){ + $sth->bind_columns( \$external_db_id ); + + while ( $sth->fetch() ) { warn "\t$external_db_id\n"; } - return @genes_passed; + return []; } - - # get the gene_ids for those with links + + # Get the gene_ids for those with links. my $dbe_adaptor = $self->db()->get_DBEntryAdaptor(); - my %linked_genes= $dbe_adaptor->list_gene_ids_by_external_db_id($external_db_id); - # get all the genes on the slice + my %linked_genes; + foreach $external_db_id (@external_db_ids) { + my @linked_genes = + q + $dbe_adaptor->list_gene_ids_by_external_db_id($external_db_id); - my $genes = $self->SUPER::fetch_all_by_Slice_constraint($slice, - 'g.is_current = 1', $logic_name); + foreach my $gene_id (@linked_genes) { + $linked_genes{$gene_id} = 1; + } + } + + # Get all the genes on the slice. + my $genes = $self->SUPER::fetch_all_by_Slice_constraint( $slice, + 'g.is_current = 1', $logic_name ); - # create a list of those that are in the gene_ids list - foreach my $gene (@$genes){ - if($linked_genes{$gene->dbID}){ - push @genes_passed, $gene; + # Create a list of those that are in the gene_ids list. + my @genes_passed; + foreach my $gene (@$genes) { + if ( exists( $linked_genes{ $gene->dbID() } ) ) { + push( @genes_passed, $gene ); } } - #return the list of those that passed + # Return the list of those that passed. return \@genes_passed; -} +} ## end sub fetch_all_by_Slice_and_external_dbname_link =head2 fetch_all_by_Slice