package LIMS::Controller::Roles::SearchConstraint;
use Moose::Role;
use LIMS::Local::Search;
sub generate_search_constraints {
my ($self, $data) = @_; # $self->debug($data);
# need to do specimen code lookup if search includes specimen:
if ( my $specimen_code = $data->{specimen_code} ) { # warn $sample_code;
$data->{specimen_id}
= $self->model('Specimen')->get_specimen_id($specimen_code);
# delete specimen_code key - no field to match against:
delete $data->{specimen_code};
}
my $user_profile = $self->user_profile;
# args for search object:
my %args = (
form_fields => $data,
user_profile => $user_profile,
);
# create search object:
my $search = LIMS::Local::Search->new(\%args);
# generate query from form fields as hashref:
my $query = $search->generate_query; # $self->debug($query);
if (%$query) {
return $query; # return hashref
}
else {
$self->stash->{error_msg} = $self->messages('search')->{empty_submission};
return 0;
}
}
sub quick_search_constraints {
my ($self, $var) = @_; # $self->debug($var);
# create hash in case multiple keys, then return array(ref):
my %data;
# all numbers = nhs number or patient number:
if ( $var =~ /^\d+$/ ) {
$data{unit_number} = $var;
$data{lab_ref} = $var if length $var < 6;
$data{nhs_number} = $var if length $var == 10;
}
# alphabetic probably name(s):
elsif ( $var =~ /\w+/ ) {
# all one word (with hyphen or apostrophe):
if ( $var =~ /^(\w|-|\')+$/ ) {
$data{first_name} = $var;
$data{last_name} = $var;
}
# comma separated:
elsif ( my ($cs1, $cs2) = split /,\s?/, $var ) {
$data{last_name} = $cs1;
$data{first_name} = $cs2;
}
# space separated:
elsif ( my ($ss1, $ss2) = split /\s+/, $var ) {
$data{first_name} = $ss1;
$data{last_name} = $ss2;
}
# one or more numbers:
elsif ( $var =~ /\d+/ ) {
$data{unit_number} = $var;
}
}
return \%data;
}
1;