Bug 14007: Filter search result values to remove OpacHiddenItems values
This change filters the values from the OpacHiddenItems syspref out of their corresponding search results facets. Note: This does not mean that all values from hidden items are filtered out of facets. Rather, it just means that facet data that matches OpacHiddenItems is filtered out. This is an imperfect fix, but it is a practical fix that has been requested by more than one library. Test plan: 0. Apply the patch and koha-plack --restart kohadev 1. Go to http://localhost:8081/cgi-bin/koha/catalogue/detail.pl?biblionumber=29 2. Add an item with an item type of "Maps" 3. Go to http://localhost:8081/cgi-bin/koha/admin/preferences.pl?op=search&searchfield=OpacHiddenItems 4. Fill in OpacHiddenItems with the following: itype: ['MP'] 5. Go to http://localhost:8080/cgi-bin/koha/opac-search.pl?idx=&q=test&weight_search=1 6. Note that "Maps" does not appear in the "Item types" facet 7. Go to http://localhost:8081/cgi-bin/koha/catalogue/search.pl?q=test 8. Note that "Maps" does appear in the "Item types" facet 9. ***Repeat this test plan using both Elasticsearch and Zebra indexing*** 10. prove -v t/Koha/SearchEngine/Search.t Signed-off-by: David Nind <david@davidnind.com> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Signed-off-by: Katrin Fischer <katrin.fischer@bsz-bw.de>
This commit is contained in:
parent
738c641bcc
commit
474148538f
|
|
@ -183,7 +183,13 @@ sub search_compat {
|
|||
my %result;
|
||||
$result{biblioserver}{hits} = $hits->{'total'};
|
||||
$result{biblioserver}{RECORDS} = \@records;
|
||||
return (undef, \%result, $self->_convert_facets($results->{aggregations}));
|
||||
|
||||
my $facets = $self->_convert_facets( $results->{aggregations} );
|
||||
if ( C4::Context->interface eq 'opac' ) {
|
||||
my $rules = C4::Context->yaml_preference('OpacHiddenItems');
|
||||
$facets = Koha::SearchEngine::Search->post_filter_opac_facets( { facets => $facets, rules => $rules } );
|
||||
}
|
||||
return (undef, \%result, $facets);
|
||||
}
|
||||
|
||||
=head2 search_auth_compat
|
||||
|
|
|
|||
|
|
@ -179,4 +179,54 @@ sub pagination_bar {
|
|||
|
||||
}
|
||||
|
||||
=head2 post_filter_opac_facets
|
||||
|
||||
if ( C4::Context->interface eq 'opac' ) {
|
||||
my $rules = C4::Context->yaml_preference('OpacHiddenItems');
|
||||
$facets = Koha::SearchEngine::Search->post_filter_facets({ facets => $facets, rules => $rules });
|
||||
}
|
||||
|
||||
=cut
|
||||
|
||||
sub post_filter_opac_facets {
|
||||
my ( $class, $args ) = @_;
|
||||
my $facets = $args->{facets};
|
||||
my $rules = $args->{rules};
|
||||
if ( $rules && $facets ) {
|
||||
|
||||
#Build a hashmap of the rules to provide efficient lookups
|
||||
my $rule_map = {};
|
||||
my @keys = keys %$rules;
|
||||
foreach my $key (@keys) {
|
||||
$rule_map->{$key} = {};
|
||||
foreach my $rule_value ( @{ $rules->{$key} } ) {
|
||||
$rule_map->{$key}->{$rule_value} = 1;
|
||||
}
|
||||
}
|
||||
|
||||
#Iterate through the facets
|
||||
foreach my $facet_type (@$facets) {
|
||||
my $type_link_value = $facet_type->{type_link_value};
|
||||
my $rule_map_by_type = $rule_map->{$type_link_value};
|
||||
|
||||
#If the facet type has a rule map, process the facets
|
||||
if ($rule_map_by_type) {
|
||||
|
||||
#Filter out any facet which has a value in the rule map
|
||||
my @filtered_facets = ();
|
||||
foreach my $facet ( @{ $facet_type->{facets} } ) {
|
||||
my $facet_link_value = $facet->{facet_link_value};
|
||||
if ($facet_link_value) {
|
||||
if ( !$rule_map_by_type->{$facet_link_value} ) {
|
||||
push( @filtered_facets, $facet );
|
||||
}
|
||||
}
|
||||
}
|
||||
$facet_type->{facets} = \@filtered_facets;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $facets;
|
||||
}
|
||||
|
||||
1;
|
||||
|
|
|
|||
|
|
@ -60,9 +60,14 @@ This passes straight through to C4::Search::getRecords.
|
|||
=cut
|
||||
|
||||
sub search_compat {
|
||||
shift; # get rid of $self
|
||||
shift; # get rid of $self
|
||||
|
||||
return C4::Search::getRecords(@_);
|
||||
my ( $error, $results_hashref, $facets ) = C4::Search::getRecords(@_);
|
||||
if ( C4::Context->interface eq 'opac' ) {
|
||||
my $rules = C4::Context->yaml_preference('OpacHiddenItems');
|
||||
$facets = Koha::SearchEngine::Search->post_filter_opac_facets( { facets => $facets, rules => $rules } );
|
||||
}
|
||||
return ( $error, $results_hashref, $facets );
|
||||
}
|
||||
|
||||
=head2 simple_search_compat
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
|
||||
use Modern::Perl;
|
||||
|
||||
use Test::More tests => 1;
|
||||
use Test::More tests => 2;
|
||||
use Test::Exception;
|
||||
|
||||
use t::lib::Mocks;
|
||||
|
|
@ -85,3 +85,76 @@ subtest "pagination_bar tests" => sub {
|
|||
is( @$PAGE_NUMBERS, 20, "If past first ten pages we show 20 pages" );
|
||||
|
||||
};
|
||||
|
||||
subtest "post_filter_opac_facets" => sub {
|
||||
plan tests => 4;
|
||||
|
||||
my $facets = _get_mock_facet_data();
|
||||
my $rules = { 'itype' => ['MP'] };
|
||||
|
||||
my $filtered_facets = Koha::SearchEngine::Search->post_filter_opac_facets( { facets => $facets, rules => $rules } );
|
||||
is( scalar @$filtered_facets, 2, 'Facet type length the same' );
|
||||
is( scalar @{ $filtered_facets->[0]->{facets} }, 3, 'author facet length the same' );
|
||||
is( scalar @{ $filtered_facets->[1]->{facets} }, 1, 'itype facet has been filtered' );
|
||||
is( $filtered_facets->[1]->{facets}->[0]->{facet_link_value}, 'BK', 'correct itype facet has been filtered' );
|
||||
};
|
||||
|
||||
sub _get_mock_facet_data {
|
||||
my $facets = [
|
||||
{
|
||||
'type_label_Authors' => 1,
|
||||
'facets' => [
|
||||
{
|
||||
'facet_link_value' => 'Farley, David',
|
||||
'type_link_value' => 'author',
|
||||
'facet_title_value' => 'Farley, David',
|
||||
'facet_count' => 1,
|
||||
'facet_label_value' => 'Farley, David'
|
||||
},
|
||||
{
|
||||
'facet_label_value' => 'Humble, Jez',
|
||||
'facet_count' => 1,
|
||||
'facet_title_value' => 'Humble, Jez',
|
||||
'type_link_value' => 'author',
|
||||
'facet_link_value' => 'Humble, Jez'
|
||||
},
|
||||
{
|
||||
'facet_count' => 1,
|
||||
'facet_title_value' => 'Martin, Robert C.',
|
||||
'facet_label_value' => 'Martin, Robert C.',
|
||||
'type_link_value' => 'author',
|
||||
'facet_link_value' => 'Martin, Robert C.'
|
||||
}
|
||||
],
|
||||
'av_cat' => '',
|
||||
'order' => 1,
|
||||
'label' => 'Authors',
|
||||
'type_id' => 'author_id',
|
||||
'type_link_value' => 'author'
|
||||
},
|
||||
{
|
||||
'type_label_Item types' => 1,
|
||||
'facets' => [
|
||||
{
|
||||
'type_link_value' => 'itype',
|
||||
'facet_link_value' => 'BK',
|
||||
'facet_count' => 4,
|
||||
'facet_title_value' => 'BK',
|
||||
'facet_label_value' => 'Books'
|
||||
},
|
||||
{
|
||||
'facet_title_value' => 'MP',
|
||||
'facet_count' => 1,
|
||||
'facet_label_value' => 'Maps',
|
||||
'type_link_value' => 'itype',
|
||||
'facet_link_value' => 'MP'
|
||||
}
|
||||
],
|
||||
'order' => 2,
|
||||
'av_cat' => undef,
|
||||
'type_id' => 'itype_id',
|
||||
'type_link_value' => 'itype',
|
||||
'label' => 'Item types'
|
||||
}
|
||||
];
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue