From 996c21fa61eff3e21c8380e7cbd9e52e93b102f4 Mon Sep 17 00:00:00 2001 From: miker Date: Thu, 8 Feb 2007 17:39:58 +0000 Subject: [PATCH] Adding support for field-specific searches. Syntax for use in OpenSearch is {class}[|field]:{term} git-svn-id: svn://svn.open-ils.org/ILS/trunk@6921 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- .../perlmods/OpenILS/Application/Search/Biblio.pm | 7 +- .../Application/Storage/Publisher/metabib.pm | 78 ++++++++++++---------- Open-ILS/src/perlmods/OpenILS/WWW/SuperCat.pm | 3 +- 3 files changed, 44 insertions(+), 44 deletions(-) diff --git a/Open-ILS/src/perlmods/OpenILS/Application/Search/Biblio.pm b/Open-ILS/src/perlmods/OpenILS/Application/Search/Biblio.pm index 1dcf503f60..ccd23a5dca 100644 --- a/Open-ILS/src/perlmods/OpenILS/Application/Search/Biblio.pm +++ b/Open-ILS/src/perlmods/OpenILS/Application/Search/Biblio.pm @@ -465,12 +465,7 @@ sub the_quest_for_knowledge { # do some simple sanity checking if(!$searchhash->{searches} or - ( - !$searchhash->{searches}->{title} and - !$searchhash->{searches}->{author} and - !$searchhash->{searches}->{subject} and - !$searchhash->{searches}->{series} and - !$searchhash->{searches}->{keyword} ) ) { + ( !grep { /^(?:title|author|subject|series|keyword)/ } keys %{$searchhash->{searches}} ) ) { return { count => 0 }; } diff --git a/Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/metabib.pm b/Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/metabib.pm index 5e16e9280c..5077ee3ee5 100644 --- a/Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/metabib.pm +++ b/Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/metabib.pm @@ -1511,24 +1511,26 @@ sub postfilter_search_multi_class_fts { my @bonus_lists; my @bonus_values; - my $prev_search_class; - my $curr_search_class; + my $prev_search_group; + my $curr_search_group; my $search_class; my $search_field; my $metabib_field; for my $search_group (sort keys %{$args{searches}}) { + (my $search_group_name = $search_group) =~ s/\|/_/gso; ($search_class,$search_field) = split /\|/, $search_group; + $log->debug("Searching class [$search_class] and field [$search_field]",DEBUG); if ($search_field) { - unless ( ($metabib_field) = config::metabib_field->search( field_class => $search_class, name => $search_field ) ) { - $log->debug("Requested class [$search_class] or field [$search_field] does not exist!", WARN); - next; + unless ( $metabib_field = config::metabib_field->search( field_class => $search_class, name => $search_field )->next ) { + $log->warn("Requested class [$search_class] or field [$search_field] does not exist!"); + return undef; } } - $prev_search_class = $curr_search_class if ($curr_search_class); + $prev_search_group = $curr_search_group if ($curr_search_group); - $curr_search_class = $search_class; + $curr_search_group = $search_group_name; my $class = $_cdbi->{$search_class}; my $search_table = $class->table; @@ -1537,7 +1539,7 @@ sub postfilter_search_multi_class_fts { $index_col ||= 'value'; - my $fts = OpenILS::Application::Storage::FTS->compile($args{searches}{$search_class}{term}, $search_class.'.value', "$search_class.$index_col"); + my $fts = OpenILS::Application::Storage::FTS->compile($args{searches}{$search_group}{term}, $search_group_name.'.value', "$search_group_name.$index_col"); my $fts_where = $fts->sql_where_clause; my @fts_ranks = $fts->fts_rank; @@ -1546,16 +1548,16 @@ sub postfilter_search_multi_class_fts { my $REstring = '^' . join('\s+',map { lc($_) } $fts->words) . '\W*$'; my $first_word = lc(($fts->words)[0]).'%'; - $_.=" * (SELECT weight FROM $field_table WHERE $search_class.field = id)" for (@fts_ranks); + $_.=" * (SELECT weight FROM $field_table WHERE $search_group_name.field = id)" for (@fts_ranks); my $rank = join(' + ', @fts_ranks); my %bonus = (); - $bonus{'keyword'} = [ { "CASE WHEN $search_class.value LIKE ? THEN 10 ELSE 1 END" => $SQLstring } ]; - $bonus{'author'} = [ { "CASE WHEN $search_class.value ILIKE ? THEN 10 ELSE 1 END" => $first_word } ]; + $bonus{'keyword'} = [ { "CASE WHEN $search_group_name.value LIKE ? THEN 10 ELSE 1 END" => $SQLstring } ]; + $bonus{'author'} = [ { "CASE WHEN $search_group_name.value ILIKE ? THEN 10 ELSE 1 END" => $first_word } ]; $bonus{'series'} = [ - { "CASE WHEN $search_class.value LIKE ? THEN 1.5 ELSE 1 END" => $first_word }, - { "CASE WHEN $search_class.value ~ ? THEN 20 ELSE 1 END" => $REstring }, + { "CASE WHEN $search_group_name.value LIKE ? THEN 1.5 ELSE 1 END" => $first_word }, + { "CASE WHEN $search_group_name.value ~ ? THEN 20 ELSE 1 END" => $REstring }, ]; $bonus{'title'} = [ @{ $bonus{'series'} }, @{ $bonus{'keyword'} } ]; @@ -1569,17 +1571,17 @@ sub postfilter_search_multi_class_fts { #--------------------- - $search_table_list .= "$search_table $search_class, "; + $search_table_list .= "$search_table $search_group_name, "; push @rank_list,$rank; - $fts_list .= " AND $fts_where AND m.source = $search_class.source"; + $fts_list .= " AND $fts_where AND m.source = $search_group_name.source"; if ($metabib_field) { - $join_table_list .= " $curr_search_class.field = " . $metabib_field->id; + $join_table_list .= " AND $search_group_name.field = " . $metabib_field->id; $metabib_field = undef; } - if ($prev_search_class) { - $join_table_list .= " AND $prev_search_class.source = $curr_search_class.source"; + if ($prev_search_group) { + $join_table_list .= " AND $prev_search_group.source = $curr_search_group.source"; } } @@ -1988,24 +1990,26 @@ sub biblio_search_multi_class_fts { my @bonus_lists; my @bonus_values; - my $prev_search_class; - my $curr_search_class; + my $prev_search_group; + my $curr_search_group; my $search_class; my $search_field; my $metabib_field; for my $search_group (sort keys %{$args{searches}}) { + (my $search_group_name = $search_group) =~ s/\|/_/gso; ($search_class,$search_field) = split /\|/, $search_group; + $log->debug("Searching class [$search_class] and field [$search_field]",DEBUG); if ($search_field) { - unless ( ($metabib_field) = config::metabib_field->search( field_class => $search_class, name => $search_field ) ) { - $log->debug("Requested class [$search_class] or field [$search_field] does not exist!", WARN); - next; + unless ( $metabib_field = config::metabib_field->search( field_class => $search_class, name => $search_field )->next ) { + $log->warn("Requested class [$search_class] or field [$search_field] does not exist!"); + return undef; } } - $prev_search_class = $curr_search_class if ($curr_search_class); + $prev_search_group = $curr_search_group if ($curr_search_group); - $curr_search_class = $search_class; + $curr_search_group = $search_group_name; my $class = $_cdbi->{$search_class}; my $search_table = $class->table; @@ -2014,7 +2018,7 @@ sub biblio_search_multi_class_fts { $index_col ||= 'value'; - my $fts = OpenILS::Application::Storage::FTS->compile($args{searches}{$search_class}{term}, $search_class.'.value', "$search_class.$index_col"); + my $fts = OpenILS::Application::Storage::FTS->compile($args{searches}{$search_group}{term}, $search_group_name.'.value', "$search_group_name.$index_col"); my $fts_where = $fts->sql_where_clause; my @fts_ranks = $fts->fts_rank; @@ -2023,18 +2027,18 @@ sub biblio_search_multi_class_fts { my $REstring = '^' . join('\s+',map { lc($_) } $fts->words) . '\W*$'; my $first_word = lc(($fts->words)[0]).'%'; - $_.=" * (SELECT weight FROM $field_table WHERE $search_class.field = id)" for (@fts_ranks); + $_.=" * (SELECT weight FROM $field_table WHERE $search_group_name.field = id)" for (@fts_ranks); my $rank = join(' + ', @fts_ranks); my %bonus = (); $bonus{'subject'} = []; - $bonus{'author'} = [ { "CASE WHEN $search_class.value ILIKE ? THEN 1.5 ELSE 1 END" => $first_word } ]; + $bonus{'author'} = [ { "CASE WHEN $search_group_name.value ILIKE ? THEN 1.5 ELSE 1 END" => $first_word } ]; - $bonus{'keyword'} = [ { "CASE WHEN $search_class.value ILIKE ? THEN 10 ELSE 1 END" => $SQLstring } ]; + $bonus{'keyword'} = [ { "CASE WHEN $search_group_name.value ILIKE ? THEN 10 ELSE 1 END" => $SQLstring } ]; $bonus{'series'} = [ - { "CASE WHEN $search_class.value ILIKE ? THEN 1.5 ELSE 1 END" => $first_word }, - { "CASE WHEN $search_class.value ~ ? THEN 20 ELSE 1 END" => $REstring }, + { "CASE WHEN $search_group_name.value ILIKE ? THEN 1.5 ELSE 1 END" => $first_word }, + { "CASE WHEN $search_group_name.value ~ ? THEN 20 ELSE 1 END" => $REstring }, ]; $bonus{'title'} = [ @{ $bonus{'series'} }, @{ $bonus{'keyword'} } ]; @@ -2050,22 +2054,22 @@ sub biblio_search_multi_class_fts { my $bonus_list = join ' * ', map { keys %$_ } @{ $bonus{$search_class} }; $bonus_list ||= '1'; - push @bonus_lists, $bonus_list,; + push @bonus_lists, $bonus_list; push @bonus_values, map { values %$_ } @{ $bonus{$search_class} }; #--------------------- - $search_table_list .= "$search_table $search_class, "; + $search_table_list .= "$search_table $search_group_name, "; push @rank_list,$rank; - $fts_list .= " AND $fts_where AND b.id = $search_class.source"; + $fts_list .= " AND $fts_where AND b.id = $search_group_name.source"; if ($metabib_field) { - $join_table_list .= " $curr_search_class.field = " . $metabib_field->id; + $fts_list .= " AND $curr_search_group.field = " . $metabib_field->id; $metabib_field = undef; } - if ($prev_search_class) { - $join_table_list .= " AND $prev_search_class.source = $curr_search_class.source"; + if ($prev_search_group) { + $join_table_list .= " AND $prev_search_group.source = $curr_search_group.source"; } } diff --git a/Open-ILS/src/perlmods/OpenILS/WWW/SuperCat.pm b/Open-ILS/src/perlmods/OpenILS/WWW/SuperCat.pm index 92a03d4587..967a322e3a 100644 --- a/Open-ILS/src/perlmods/OpenILS/WWW/SuperCat.pm +++ b/Open-ILS/src/perlmods/OpenILS/WWW/SuperCat.pm @@ -967,7 +967,8 @@ sub opensearch_feed { my $cache_key = ''; my $searches = {}; - while ($term_copy =~ s/((?:keyword|title|author|subject|series|site|dir|sort|lang):[^:]+)$//so) { + while ($term_copy =~ s/((?:keyword(?:\|\w+)?|title(?:\|\w+)?|author(?:\|\w+)?|subject(?:\|\w+)?|series(?:\|\w+)?|site|dir|sort|lang):[^:]+)$//so) { + warn $1; my ($c,$t) = split ':' => $1; if ($c eq 'site') { $org = $t; -- 2.11.0