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.
---
 C4/Search.pm                                       |   72 +++++++++++++-------
 catalogue/search.pl                                |    1 +
 .../intranet-tmpl/prog/en/includes/facets.inc      |    2 +-
 .../en/modules/admin/preferences/searching.pref    |   14 ++++
 .../opac-tmpl/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 a469948..a33e5e2 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 8cb737d..c2399be 100755
--- a/catalogue/search.pl
+++ b/catalogue/search.pl
@@ -641,6 +641,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 95d912d..ab0fb13 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 @@
 <!-- TMPL_IF NAME="type_label_Series" -->Series<!-- /TMPL_IF -->
 <!-- TMPL_IF NAME="type_label_Libraries" -->Libraries<!-- /TMPL_IF -->
 <ul>
-        <!-- TMPL_LOOP NAME="facets" --><li><a 
href="/cgi-bin/koha/catalogue/search.pl?<!-- TMPL_VAR NAME="query_cgi" 
ESCAPE="HTML" --><!-- TMPL_VAR NAME="limit_cgi" --><!-- TMPL_IF NAME="sort_by" 
-->&amp;sort_by=<!-- TMPL_VAR NAME="sort_by" --><!-- /TMPL_IF 
-->&amp;limit=<!-- TMPL_VAR NAME="type_link_value" -->:<!-- TMPL_VAR 
NAME="facet_link_value" -->" title="<!-- TMPL_VAR NAME="facet_title_value" 
-->"><!-- TMPL_VAR NAME="facet_label_value" --></a> <!-- (<!-- TMPL_VAR 
NAME="facet_count" -->) --></li><!-- /TMPL_LOOP --><!-- TMPL_IF 
NAME="expandable" -->
+        <!-- TMPL_LOOP NAME="facets" --><li><a 
href="/cgi-bin/koha/catalogue/search.pl?<!-- TMPL_VAR NAME="query_cgi" 
ESCAPE="HTML" --><!-- TMPL_VAR NAME="limit_cgi" --><!-- TMPL_IF NAME="sort_by" 
-->&amp;sort_by=<!-- TMPL_VAR NAME="sort_by" --><!-- /TMPL_IF 
-->&amp;limit=<!-- TMPL_VAR NAME="type_link_value" -->:<!-- TMPL_VAR 
NAME="facet_link_value" -->" title="<!-- TMPL_VAR NAME="facet_title_value" 
-->"><!-- TMPL_VAR NAME="facet_label_value" --></a> <!-- TMPL_IF 
NAME="displayFacetCount" -->(<!-- TMPL_VAR NAME="facet_count" -->)<!-- /TMPL_IF 
--></li><!-- /TMPL_LOOP --><!-- TMPL_IF NAME="expandable" -->
         <li class="showmore"><a href="/cgi-bin/koha/catalogue/search.pl?<!-- 
TMPL_VAR NAME="query_cgi" ESCAPE="HTML" --><!-- TMPL_VAR NAME="limit_cgi" 
--><!-- TMPL_IF NAME="sort_by" -->&amp;sort_by=<!-- TMPL_VAR NAME="sort_by" 
--><!-- /TMPL_IF -->&amp;expand=<!-- TMPL_VAR NAME="expand" -->#<!-- TMPL_VAR 
NAME="type_id" -->">Show More</a></li>
 <!-- /TMPL_IF -->
 </ul></li>
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 cd924dc..6994d43 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
@@ -92,6 +92,14 @@ Searching:
                   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
               class: integer
@@ -122,6 +130,12 @@ Searching:
               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
               class: integer
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 85719f3..241e66e 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 @@
 <!-- TMPL_IF NAME="type_label_Libraries" -->Libraries<!-- /TMPL_IF -->
 <!-- /TMPL_UNLESS -->
 <ul>
-        <!-- TMPL_LOOP NAME="facets" --><li><a 
href="/cgi-bin/koha/opac-search.pl?<!-- TMPL_VAR NAME="query_cgi" --><!-- 
TMPL_VAR NAME="limit_cgi" --><!-- TMPL_IF NAME="sort_by" -->&amp;sort_by=<!-- 
TMPL_VAR NAME="sort_by" --><!-- /TMPL_IF -->&amp;limit=<!-- TMPL_VAR 
NAME="type_link_value" -->:<!-- TMPL_VAR NAME="facet_link_value" -->" 
title="<!-- TMPL_VAR NAME="facet_title_value" ESCAPE="HTML" -->"><!-- TMPL_VAR 
NAME="facet_label_value" --></a> <!-- (<!-- TMPL_VAR NAME="facet_count" -->) 
--></li><!-- /TMPL_LOOP --><!-- TMPL_IF NAME="expandable" -->
+        <!-- TMPL_LOOP NAME="facets" --><li><a 
href="/cgi-bin/koha/opac-search.pl?<!-- TMPL_VAR NAME="query_cgi" --><!-- 
TMPL_VAR NAME="limit_cgi" --><!-- TMPL_IF NAME="sort_by" -->&amp;sort_by=<!-- 
TMPL_VAR NAME="sort_by" --><!-- /TMPL_IF -->&amp;limit=<!-- TMPL_VAR 
NAME="type_link_value" -->:<!-- TMPL_VAR NAME="facet_link_value" -->" 
title="<!-- TMPL_VAR NAME="facet_title_value" ESCAPE="HTML" -->"><!-- TMPL_VAR 
NAME="facet_label_value" --></a> <!-- TMPL_IF NAME="displayFacetCount">(<!-- 
TMPL_VAR NAME="facet_count" -->)<!-- /TMPL_IF --></li><!-- /TMPL_LOOP --><!-- 
TMPL_IF NAME="expandable" -->
         <li class="showmore"><a href="/cgi-bin/koha/opac-search.pl?<!-- 
TMPL_VAR NAME="query_cgi" --><!-- TMPL_VAR NAME="limit_cgi" --><!-- TMPL_IF 
NAME="sort_by" -->&amp;sort_by=<!-- TMPL_VAR NAME="sort_by" --><!-- /TMPL_IF 
-->&amp;offset=<!-- TMPL_VAR NAME="offset" -->&amp;expand=<!-- TMPL_VAR 
NAME="expand" -->#<!-- TMPL_VAR NAME="type_id" -->">Show More</a></li>
 <!-- /TMPL_IF -->
 </ul></li>
diff --git a/opac/opac-search.pl b/opac/opac-search.pl
index 0f52650..271f501 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,
 );
-- 
1.6.0.6

_______________________________________________
Koha-patches mailing list
Koha-patches@lists.koha-community.org
http://lists.koha-community.org/cgi-bin/mailman/listinfo/koha-patches
website : http://www.koha-community.org/
git : http://git.koha-community.org/
bugs : http://bugs.koha-community.org/

Reply via email to