From 265ed53f12df70d0ef8a4f5af8add20507658a3a Mon Sep 17 00:00:00 2001 From: Marcel de Rooy Date: Wed, 16 Mar 2011 15:06:36 -0400 Subject: [PATCH] 3154 Preferences for building facets (functionality) Based on patch from Fridolyn Somers with input of Frederic Demians. Added new Searching preference maxRecordsForFacets. This pref contains number of result records used in facet building. Also added pref displayFacetCount (with thanks to Frederic). Follow up patch takes care of install issues; functionality can already be tested with this patch only. Updated on March 17 for changes in include files. Signed-off-by: Nicole C. Engard Signed-off-by: Chris Cormack --- C4/Search.pm | 72 ++++++++++++------- catalogue/search.pl | 1 + .../intranet-tmpl/prog/en/includes/facets.inc | 2 +- .../modules/admin/preferences/searching.pref | 14 ++++ .../prog/en/includes/opac-facets.inc | 2 +- opac/opac-search.pl | 1 + 6 files changed, 65 insertions(+), 27 deletions(-) diff --git a/C4/Search.pm b/C4/Search.pm index 53c83962c3..7c513913d9 100644 --- a/C4/Search.pm +++ b/C4/Search.pm @@ -309,6 +309,7 @@ sub getRecords { my $facets_counter = (); my $facets_info = (); my $facets = getFacets(); + my $facets_maxrecs = C4::Context->preference('maxRecordsForFacets')||20; my @facets_loop; # stores the ref to array of hashes for template facets loop @@ -418,7 +419,6 @@ sub getRecords { for ( my $j = $offset ; $j < $times ; $j++ ) { my $records_hash; my $record; - my $facet_record; ## Check if it's an index scan if ($scan) { @@ -451,33 +451,55 @@ sub getRecords { # warn "RECORD $j:".$record; $results_hash->{'RECORDS'}[$j] = $record; - - # Fill the facets while we're looping, but only for the biblioserver - $facet_record = MARC::Record->new_from_usmarc($record) - if $servers[ $i - 1 ] =~ /biblioserver/; - - #warn $servers[$i-1]."\n".$record; #.$facet_record->title(); - if ($facet_record) { - for ( my $k = 0 ; $k <= @$facets ; $k++ ) { - ($facets->[$k]) or next; - my @fields = map {$facet_record->field($_)} @{$facets->[$k]->{'tags'}} ; - for my $field (@fields) { - my @subfields = $field->subfields(); - for my $subfield (@subfields) { - my ( $code, $data ) = @$subfield; - ($code eq $facets->[$k]->{'subfield'}) or next; - $facets_counter->{ $facets->[$k]->{'link_value'} }->{$data}++; - } - } - $facets_info->{ $facets->[$k]->{'link_value'} }->{'label_value'} = - $facets->[$k]->{'label_value'}; - $facets_info->{ $facets->[$k]->{'link_value'} }->{'expanded'} = - $facets->[$k]->{'expanded'}; - } - } } + } $results_hashref->{ $servers[ $i - 1 ] } = $results_hash; + + # Fill the facets while we're looping, but only for the biblioserver and not for a scan + if ( !$scan && $servers[ $i - 1 ] =~ /biblioserver/ ) { + + my $jmax = $size>$facets_maxrecs? $facets_maxrecs: $size; + + for ( my $k = 0 ; $k <= @$facets ; $k++ ) { + ($facets->[$k]) or next; + my @fcodes = @{$facets->[$k]->{'tags'}}; + my $sfcode = $facets->[$k]->{'subfield'}; + + for ( my $j = 0 ; $j < $jmax ; $j++ ) { + my $render_record = $results[ $i - 1 ]->record($j)->render(); + my @used_datas = (); + + foreach my $fcode (@fcodes) { + + # avoid first line + my $field_pattern = '\n'.$fcode.' ([^\n]+)'; + my @field_tokens = ( $render_record =~ /$field_pattern/g ) ; + + foreach my $field_token (@field_tokens) { + my $subfield_pattern = '\$'.$sfcode.' ([^\$]+)'; + my @subfield_values = ( $field_token =~ /$subfield_pattern/g ); + + foreach my $subfield_value (@subfield_values) { + + my $data = $subfield_value; + $data =~ s/^\s+//; # trim left + $data =~ s/\s+$//; # trim right + + unless ( $data ~~ @used_datas ) { + $facets_counter->{ $facets->[$k]->{'link_value'} }->{$data}++; + push @used_datas, $data; + } + } # subfields + } # fields + } # field codes + } # records + + $facets_info->{ $facets->[$k]->{'link_value'} }->{'label_value'} = $facets->[$k]->{'label_value'}; + $facets_info->{ $facets->[$k]->{'link_value'} }->{'expanded'} = $facets->[$k]->{'expanded'}; + } # facets + } + # End PROGILONE } # warn "connection ", $i-1, ": $size hits"; diff --git a/catalogue/search.pl b/catalogue/search.pl index f920efe01d..b22837ad83 100755 --- a/catalogue/search.pl +++ b/catalogue/search.pl @@ -657,6 +657,7 @@ $template->param( total => $total, opacfacets => 1, facets_loop => $facets, + displayFacetCount=> C4::Context->preference('displayFacetCount')||0, scan => $scan, search_error => $error, ); diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/facets.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/facets.inc index b53bfb79eb..710dc23ddd 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/includes/facets.inc +++ b/koha-tmpl/intranet-tmpl/prog/en/includes/facets.inc @@ -17,7 +17,7 @@ Series Libraries diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/searching.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/searching.pref index 5ff267f6c7..d0a58e0e55 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/searching.pref +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/searching.pref @@ -98,6 +98,14 @@ Searching: dsc: descending. az: from A to Z. za: from Z to A. + - + - pref: displayFacetCount + type: boolean + default: no + choices: + yes: Show + no: "Don't show" + - facet counts. The relevance of these numbers highly depends on the value of the maxRecordsForFacets preference. Applies to OPAC and staff interface. - - By default, show - pref: numSearchResults @@ -128,6 +136,12 @@ Searching: - pref: maxItemsInSearchResults class: integer - items per biblio in the search results + - + - Build facets based on + - pref: maxRecordsForFacets + class: integer + default: 20 + - records from the search results. - - By default, show - pref: OPACnumSearchResults diff --git a/koha-tmpl/opac-tmpl/prog/en/includes/opac-facets.inc b/koha-tmpl/opac-tmpl/prog/en/includes/opac-facets.inc index cc6d23578c..57f0518ed9 100644 --- a/koha-tmpl/opac-tmpl/prog/en/includes/opac-facets.inc +++ b/koha-tmpl/opac-tmpl/prog/en/includes/opac-facets.inc @@ -18,7 +18,7 @@ Libraries diff --git a/opac/opac-search.pl b/opac/opac-search.pl index bf4e0db980..d22049f3fe 100755 --- a/opac/opac-search.pl +++ b/opac/opac-search.pl @@ -628,6 +628,7 @@ $template->param( total => $total, opacfacets => 1, facets_loop => $facets, + displayFacetCount=> C4::Context->preference('displayFacetCount')||0, scan => $scan, search_error => $error, ); -- 2.39.5