Skip to content

Commit

Permalink
refactor to move some gene search code into GeneSearch util module fr…
Browse files Browse the repository at this point in the history
…om gene plugin module
  • Loading branch information
sajp committed Aug 22, 2012
1 parent 8c7bc75 commit d24fbe2
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 69 deletions.
76 changes: 7 additions & 69 deletions lib/LIMS2/Model/Plugin/Gene.pm
Expand Up @@ -4,12 +4,9 @@ use strict;
use warnings FATAL => 'all';

use Moose::Role;
use Const::Fast;
use Data::Dump 'pp';
use namespace::autoclean;

const my $MGI_ACCESSION_ID_RX => qr/^MGI:\d+$/;
const my $ENSEMBL_GENE_ID_RX => qr/^ENS[A-Z]*G\d+$/;
use LIMS2::Model::Util::GeneSearch qw( retrieve_solr_gene retrieve_ensembl_gene normalize_solr_result );

requires qw( schema check_params throw retrieve log trace );

Expand Down Expand Up @@ -45,11 +42,12 @@ sub search_genes {
my @genes;

if ( $species eq 'Mouse' ) {
@genes = map { $self->_normalize_solr_result( $_ ) }
@genes = map { normalize_solr_result( $_ ) }
@{ $self->solr_query( $validated_params->{search_term} ) };
}
elsif ( $species eq 'Human' ) {
@genes = ( $self->retrieve_gene( $validated_params ) || () );
my $genes = $self->retrieve_gene( $validated_params ) || [];
@genes = @{ $genes };
}
else {
LIMS2::Exception::Implementation->throw( "search_genes() for species '$species' not implemented" );
Expand Down Expand Up @@ -82,83 +80,23 @@ sub retrieve_gene {
if ( $species eq 'Mouse' ) {
return $self->_gene_cache_mouse->compute(
$validated_params->{search_term}, undef, sub {
$self->_retrieve_solr_gene( $validated_params );
retrieve_solr_gene( $self, $validated_params );
}
);
}

if ( $species eq 'Human' ) {
return $self->_gene_cache_human->compute(
$validated_params->{search_term}, undef, sub {
$self->_retrieve_ensembl_gene( $validated_params );
retrieve_ensembl_gene( $self, $validated_params );
}
);
}

$self->throw( Implementation => "retrieve_gene() for species $species not implemented" );
$self->throw( Implementation => "retrieve_gene() for species '$species' not implemented" );
}
## use critic

sub _retrieve_solr_gene {
my ( $self, $params ) = @_;

my $search_term = $params->{search_term};

my $genes;

if ( $search_term =~ $MGI_ACCESSION_ID_RX ) {
$genes = $self->solr_query( [ mgi_accession_id => $search_term ] );
}
elsif ( $search_term =~ $ENSEMBL_GENE_ID_RX ) {
$genes = $self->solr_query( [ ensembl_gene_id => $search_term ] );
}
else {
$genes = $self->solr_query( [ marker_symbol_str => $search_term ] );
}

if ( @{$genes} == 0 ) {
$self->throw( NotFound => { entity_class => 'Gene', search_params => $params } );
}

if ( @{$genes} > 1 ) {
$self->throw( Implementation => "Retrieval of gene Mouse/$search_term returned " . @{$genes} . " genes" );
}

return $self->_normalize_solr_result( shift @{$genes} );
}

sub _retrieve_ensembl_gene {
my ( $self, $params ) = @_;

if ( $params->{search_term} =~ $ENSEMBL_GENE_ID_RX ) {
my $gene = $self->ensembl_gene_adaptor( $params->{species} )->fetch_by_stable_id( $params->{search_term} )
or $self->throw( NotFound => { entity_class => 'Gene', search_params => $params } );
return { gene_id => $gene->stable_id, gene_symbol => $gene->external_name };
}

my $genes = $self->ensembl_gene_adaptor( $params->{species} )->fetch_all_by_external_name( $params->{search_term} );

if ( @{$genes} == 0 ) {
$self->throw( NotFound => { entity_class => 'Gene', search_params => $params } );
}

if ( @{$genes} > 1 ) {
$self->throw( Implementation => "Retrieval of gene $params->{species}/$params->{search_term} returned " . @{$genes} . " genes" );
}

return { gene_id => $genes->[0]->stable_id, gene_symbol => $genes->[0]->external_name };
}

sub _normalize_solr_result {
my ( $self, $solr_result ) = @_;

my %normalized = %{ $solr_result };

$normalized{gene_id} = delete $normalized{mgi_accession_id};
$normalized{gene_symbol} = delete $normalized{marker_symbol};

return \%normalized;
}

1;

Expand Down
94 changes: 94 additions & 0 deletions lib/LIMS2/Model/Util/GeneSearch.pm
@@ -0,0 +1,94 @@
package LIMS2::Model::Util::GeneSearch;

use strict;
use warnings FATAL => 'all';

use Sub::Exporter -setup => {
exports => [
qw(
retrieve_solr_gene
retrieve_ensembl_gene
normalize_solr_result
)
]
};

use Log::Log4perl qw( :easy );
use Const::Fast;
use LIMS2::Exception::NotFound;
use LIMS2::Exception::Implementation;

const my $MGI_ACCESSION_ID_RX => qr/^MGI:\d+$/;
const my $ENSEMBL_GENE_ID_RX => qr/^ENS[A-Z]*G\d+$/;

sub retrieve_solr_gene {
my ( $model, $params ) = @_;

my $search_term = $params->{search_term};

my $genes;

if ( $search_term =~ $MGI_ACCESSION_ID_RX ) {
$genes = $model->solr_query( [ mgi_accession_id => $search_term ] );
}
elsif ( $search_term =~ $ENSEMBL_GENE_ID_RX ) {
$genes = $model->solr_query( [ ensembl_gene_id => $search_term ] );
}
else {
$genes = $model->solr_query( [ marker_symbol_str => $search_term ] );
}

if ( @{$genes} == 0 ) {
LIMS2::Exception::NotFound->throw( { entity_class => 'Gene', search_params => $params } );
}

if ( @{$genes} > 1 ) {
LIMS2::Exception::Implementation->throw(
"Retrieval of gene Mouse/$search_term returned " . @{$genes} . " genes" );
}

return normalize_solr_result( shift @{$genes} );
}

sub retrieve_ensembl_gene {
my ( $model, $params ) = @_;

if ( $params->{search_term} =~ $ENSEMBL_GENE_ID_RX ) {
my $gene = $model->ensembl_gene_adaptor( $params->{species} )
->fetch_by_stable_id( $params->{search_term} )
or LIMS2::Exception::NotFound->throw( { entity_class => 'Gene', search_params => $params } );

return { gene_id => $gene->stable_id, gene_symbol => $gene->external_name };
}

my $genes = $model->ensembl_gene_adaptor( $params->{species} )
->fetch_all_by_external_name( $params->{search_term} );

if ( @{$genes} == 0 ) {
LIMS2::Exception::NotFound->throw( { entity_class => 'Gene', search_params => $params } );
}

if ( @{$genes} > 1 ) {
LIMS2::Exception::Implementation->throw(
"Retrieval of gene $params->{species}/$params->{search_term} returned "
. @{$genes} . " genes"
);
}

return { gene_id => $genes->[0]->stable_id, gene_symbol => $genes->[0]->external_name };
}

sub normalize_solr_result {
my ( $solr_result ) = @_;

my %normalized = %{ $solr_result };

$normalized{gene_id} = delete $normalized{mgi_accession_id};
$normalized{gene_symbol} = delete $normalized{marker_symbol};

return \%normalized;
}

1;

__END__

0 comments on commit d24fbe2

Please sign in to comment.