Skip to content

Commit bdece85

Browse files
committed
fix keyword search
1 parent 4cffd0d commit bdece85

File tree

1 file changed

+104
-108
lines changed

1 file changed

+104
-108
lines changed

lib/CXGN/Stock/SearchVector.pm

Lines changed: 104 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -476,137 +476,133 @@ sub search {
476476
$search_query->{'me.is_obsolete'} = 'f';
477477
}
478478

479-
my $skip_next = 0;
480479
if ( scalar(@stockprop_filtered_stock_ids)>0){
481480
$search_query->{'me.stock_id'} = {'in'=>\@stockprop_filtered_stock_ids};
482-
} elsif ($self->stockprops_values && scalar(keys %{$self->stockprops_values})>0 && scalar(@stockprop_filtered_stock_ids)<1){
483-
#skip since stockprop value privided and not found
484-
$skip_next = 1;
485481
}
486482

487483
#skip rest of query if no results
488484
my @result;
489485
my $records_total = 0;
490-
if ($skip_next < 1){
491-
my $rs = $schema->resultset("Stock::Stock")->search(
492-
$search_query,
493-
{
494-
join => ['type', 'organism', 'stockprops', $stock_join],
495-
'+select' => [ 'type.name' , 'organism.species' , 'organism.common_name', 'organism.genus'],
496-
'+as' => [ 'cvterm_name' , 'species', 'common_name', 'genus'],
497-
order_by => 'me.name',
498-
distinct=>1
499-
});
500486

501-
$records_total = $rs->count();
502-
if (defined($limit) && defined($offset)){
503-
$rs = $rs->slice($offset, $limit);
504-
}
487+
my $rs = $schema->resultset("Stock::Stock")->search(
488+
$search_query,
489+
{
490+
join => ['type', 'organism', 'stockprops', $stock_join],
491+
'+select' => [ 'type.name' , 'organism.species' , 'organism.common_name', 'organism.genus'],
492+
'+as' => [ 'cvterm_name' , 'species', 'common_name', 'genus'],
493+
order_by => 'me.name',
494+
distinct=>1
495+
});
496+
497+
$records_total = $rs->count();
498+
if (defined($limit) && defined($offset)){
499+
$rs = $rs->slice($offset, $limit);
500+
}
501+
502+
my $owners_hash;
503+
if (!$self->minimal_info){
504+
my $stock_lookup = CXGN::Stock::StockLookup->new({ schema => $schema} );
505+
$owners_hash = $stock_lookup->get_owner_hash_lookup();
506+
}
507+
508+
509+
my %result_hash;
510+
my @result_stock_ids;
511+
while (my $a = $rs->next()) {
512+
my $uniquename = $a->uniquename;
513+
my $stock_id = $a->stock_id;
514+
push @result_stock_ids, $stock_id;
505515

506-
my $owners_hash;
507516
if (!$self->minimal_info){
508-
my $stock_lookup = CXGN::Stock::StockLookup->new({ schema => $schema} );
509-
$owners_hash = $stock_lookup->get_owner_hash_lookup();
517+
# my $stock_object = CXGN::Stock::Accession->new({schema=>$self->bcs_schema, stock_id=>$stock_id});
518+
my @owners = $owners_hash->{$stock_id} ? @{$owners_hash->{$stock_id}} : ();
519+
my $type_id = $a->type_id ;
520+
my $type = $a->get_column('cvterm_name');
521+
my $organism_id = $a->organism_id;
522+
my $species = $a->get_column('species');
523+
my $stock_name = $a->name;
524+
my $common_name = $a->get_column('common_name');
525+
my $genus = $a->get_column('genus');
526+
527+
$result_hash{$stock_id} = {
528+
stock_id => $stock_id,
529+
uniquename => $uniquename,
530+
stock_name => $stock_name,
531+
stock_type => $type,
532+
stock_type_id => $type_id,
533+
species => $species,
534+
genus => $genus,
535+
common_name => $common_name,
536+
organism_id => $organism_id,
537+
owners => \@owners,
538+
};
539+
} else {
540+
$result_hash{$stock_id} = {
541+
stock_id => $stock_id,
542+
uniquename => $uniquename
543+
};
510544
}
545+
}
511546

512-
513-
my %result_hash;
514-
my @result_stock_ids;
515-
while (my $a = $rs->next()) {
516-
my $uniquename = $a->uniquename;
517-
my $stock_id = $a->stock_id;
518-
push @result_stock_ids, $stock_id;
519-
520-
if (!$self->minimal_info){
521-
# my $stock_object = CXGN::Stock::Accession->new({schema=>$self->bcs_schema, stock_id=>$stock_id});
522-
my @owners = $owners_hash->{$stock_id} ? @{$owners_hash->{$stock_id}} : ();
523-
my $type_id = $a->type_id ;
524-
my $type = $a->get_column('cvterm_name');
525-
my $organism_id = $a->organism_id;
526-
my $species = $a->get_column('species');
527-
my $stock_name = $a->name;
528-
my $common_name = $a->get_column('common_name');
529-
my $genus = $a->get_column('genus');
530-
531-
$result_hash{$stock_id} = {
532-
stock_id => $stock_id,
533-
uniquename => $uniquename,
534-
stock_name => $stock_name,
535-
stock_type => $type,
536-
stock_type_id => $type_id,
537-
species => $species,
538-
genus => $genus,
539-
common_name => $common_name,
540-
organism_id => $organism_id,
541-
owners => \@owners,
542-
};
543-
} else {
544-
$result_hash{$stock_id} = {
545-
stock_id => $stock_id,
546-
uniquename => $uniquename
547-
};
548-
}
549-
}
547+
# Comma separated list of query placeholders for the result stock ids
548+
my $id_ph = scalar(@result_stock_ids) > 0 ? join ",", ("?") x @result_stock_ids : "NULL";
549+
550+
# Get additional stock properties (pedigree, synonyms, donor info)
551+
my $stock_query = "SELECT stock_id, uniquename, organism_id, stock_synonym
552+
FROM materialized_stockprop
553+
WHERE stock_id IN ($id_ph);";
554+
my $sth = $schema->storage()->dbh()->prepare($stock_query);
555+
$sth->execute(@result_stock_ids);
556+
557+
# Add additional organism and stock properties to the result hash for each stock
558+
while (my @r = $sth->fetchrow_array()) {
559+
my $stock_id = $r[0];
560+
my $organism_id = $r[2];
561+
my $syn_json = $r[3] ? decode_json(encode("utf8",$r[3])) : {};
562+
my @synonyms = sort keys %{$syn_json};
563+
564+
# add stock props to the result hash
565+
$result_hash{$stock_id}{synonyms} = \@synonyms;
566+
}
550567

551-
# Comma separated list of query placeholders for the result stock ids
552-
my $id_ph = scalar(@result_stock_ids) > 0 ? join ",", ("?") x @result_stock_ids : "NULL";
553-
554-
# Get additional stock properties (pedigree, synonyms, donor info)
555-
my $stock_query = "SELECT stock_id, uniquename, organism_id, stock_synonym
556-
FROM materialized_stockprop
557-
WHERE stock_id IN ($id_ph);";
558-
my $sth = $schema->storage()->dbh()->prepare($stock_query);
559-
$sth->execute(@result_stock_ids);
560-
561-
# Add additional organism and stock properties to the result hash for each stock
562-
while (my @r = $sth->fetchrow_array()) {
563-
my $stock_id = $r[0];
564-
my $organism_id = $r[2];
565-
my $syn_json = $r[3] ? decode_json(encode("utf8",$r[3])) : {};
566-
my @synonyms = sort keys %{$syn_json};
567-
568-
# add stock props to the result hash
569-
$result_hash{$stock_id}{synonyms} = \@synonyms;
570-
}
568+
if ($self->stockprop_columns_view && scalar(keys %{$self->stockprop_columns_view})>0 && scalar(@result_stock_ids)>0){
569+
my @stockprop_view = keys %{$self->stockprop_columns_view};
570+
my $result_stock_ids_sql = join ",", @result_stock_ids;
571+
my $stockprop_where = "WHERE stock_id IN ($result_stock_ids_sql)";
572+
573+
$self->_refresh_materialized_stockprop(\@stockprop_view);
571574

572-
if ($self->stockprop_columns_view && scalar(keys %{$self->stockprop_columns_view})>0 && scalar(@result_stock_ids)>0){
573-
my @stockprop_view = keys %{$self->stockprop_columns_view};
574-
my $result_stock_ids_sql = join ",", @result_stock_ids;
575-
my $stockprop_where = "WHERE stock_id IN ($result_stock_ids_sql)";
576-
577-
$self->_refresh_materialized_stockprop(\@stockprop_view);
578-
579-
my $stockprop_select_sql .= ', "' . join ('","', @stockprop_view) . '"';
580-
my $stockprop_query = "SELECT stock_id $stockprop_select_sql FROM materialized_stockprop $stockprop_where;";
581-
my $h = $schema->storage->dbh()->prepare($stockprop_query);
582-
$h->execute();
583-
while (my ($stock_id, @stockprop_select_return) = $h->fetchrow_array()) {
584-
for my $s (0 .. scalar(@stockprop_view)-1){
585-
# my $stockprop_vals = $stockprop_select_return[$s] ? decode_json $stockprop_select_return[$s] : {};
586-
my $stockprop_vals = $stockprop_select_return[$s] ? decode_json(encode("utf8",$stockprop_select_return[$s])) : {};
587-
my @stockprop_vals_string;
588-
foreach (sort { $stockprop_vals->{$a} cmp $stockprop_vals->{$b} } (keys %$stockprop_vals) ){
589-
push @stockprop_vals_string, $_;
590-
}
591-
my $stockprop_vals_string = join ',', @stockprop_vals_string;
592-
$result_hash{$stock_id}->{$stockprop_view[$s]} = $stockprop_vals_string;
575+
my $stockprop_select_sql .= ', "' . join ('","', @stockprop_view) . '"';
576+
my $stockprop_query = "SELECT stock_id $stockprop_select_sql FROM materialized_stockprop $stockprop_where;";
577+
my $h = $schema->storage->dbh()->prepare($stockprop_query);
578+
$h->execute();
579+
while (my ($stock_id, @stockprop_select_return) = $h->fetchrow_array()) {
580+
for my $s (0 .. scalar(@stockprop_view)-1){
581+
# my $stockprop_vals = $stockprop_select_return[$s] ? decode_json $stockprop_select_return[$s] : {};
582+
my $stockprop_vals = $stockprop_select_return[$s] ? decode_json(encode("utf8",$stockprop_select_return[$s])) : {};
583+
my @stockprop_vals_string;
584+
foreach (sort { $stockprop_vals->{$a} cmp $stockprop_vals->{$b} } (keys %$stockprop_vals) ){
585+
push @stockprop_vals_string, $_;
593586
}
587+
my $stockprop_vals_string = join ',', @stockprop_vals_string;
588+
$result_hash{$stock_id}->{$stockprop_view[$s]} = $stockprop_vals_string;
594589
}
590+
}
595591

596-
while (my ($uniquename, $info) = each %result_hash){
597-
foreach (@stockprop_view){
598-
if (!$info->{$_}){
599-
$info->{$_} = '';
600-
}
592+
while (my ($uniquename, $info) = each %result_hash){
593+
foreach (@stockprop_view){
594+
if (!$info->{$_}){
595+
$info->{$_} = '';
601596
}
602597
}
603598
}
599+
}
604600

605-
foreach (sort keys %result_hash){
606-
push @result, $result_hash{$_};
607-
}
601+
foreach (sort keys %result_hash){
602+
push @result, $result_hash{$_};
608603
}
609604

605+
610606
print STDERR "CXGN::Stock::SearchVector search end\n";
611607
return (\@result, $records_total);
612608
}

0 commit comments

Comments
 (0)