From b522f28347a89bd3d4d6b77692082ec54dbce447 Mon Sep 17 00:00:00 2001 From: Nick Clemens Date: Thu, 17 Mar 2022 10:50:02 +0000 Subject: [PATCH] Bug 17170: Handle search filters in query builders This patch updates the query building code to expand filters when searching and pass them back as part of the cgi and descriptive search strings --- C4/Search.pm | 12 ++++++++++++ Koha/SearchEngine/Elasticsearch/QueryBuilder.pm | 12 +++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/C4/Search.pm b/C4/Search.pm index 85a02bf5a2..ca522fa8b4 100644 --- a/C4/Search.pm +++ b/C4/Search.pm @@ -21,6 +21,7 @@ use C4::Biblio qw( TransformMarcToKoha GetMarcFromKohaField GetFrameworkCode Get use C4::Koha qw( getFacets GetVariationsOfISBN GetNormalizedUPC GetNormalizedEAN GetNormalizedOCLCNumber GetNormalizedISBN getitemtypeimagelocation ); use Koha::DateUtils; use Koha::Libraries; +use Koha::SearchEngine::QueryBuilder; use Lingua::Stem; use XML::Simple; use C4::XSLT qw( XSLTParse4Display ); @@ -33,6 +34,7 @@ use Koha::Logger; use Koha::Patrons; use Koha::Recalls; use Koha::RecordProcessor; +use Koha::SearchFilters; use URI::Escape; use Business::ISBN; use MARC::Record; @@ -1507,6 +1509,16 @@ sub buildQuery { } $limit .= "$this_limit"; $limit_desc .= " $this_limit"; + } elsif ( $this_limit =~ '^search_filter:' ) { + $limit_cgi .= "&limit=" . uri_escape_utf8($this_limit); + my ($filter_id) = ( $this_limit =~ /^search_filter:(.*)$/ ); + my $search_filter = Koha::SearchFilters->find( $filter_id ); + next unless $search_filter; + my $expanded = $search_filter->expand_filter; + my ( $error, undef, undef, undef, undef, $fixed_limit, undef, undef, undef ) = buildQuery ( undef, undef, undef, $expanded, undef, undef, $lang); + $limit .= " and " if $limit || $query; + $limit .= "$fixed_limit"; + $limit_desc .= " $limit"; } # Regular old limits diff --git a/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm b/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm index 3e2cb1b784..aefe17270b 100644 --- a/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm +++ b/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm @@ -796,7 +796,7 @@ sub _convert_index_strings_freeform { # Lower case field names $search =~ s/($field_name_pattern)(?:,[\w-]*)?($multi_field_pattern):/\L$1\E$2:/og; # Resolve possible field aliases - $search =~ s/($field_name_pattern)($multi_field_pattern):/(exists $index_field_convert{$1} ? $index_field_convert{$1} : $1)."$2:"/oge; + $search =~ s/($field_name_pattern)($multi_field_pattern):/(exists $index_field_convert{$1} ? $index_field_convert{$1} : $1).($1 eq 'kw' ? "$2" : "$2:")/oge; return $search; } @@ -1059,6 +1059,16 @@ sub _fix_limit_special_cases { next unless defined($start) && defined($end); push @new_lim, "date-of-publication:[$start TO $end]"; } + elsif( $l =~ /^search_filter:/ ){ + my ($filter_id) = ( $l =~ /^search_filter:(.*)$/ ); + my $search_filter = Koha::SearchFilters->find( $filter_id ); + next unless $search_filter; + my $expanded = $search_filter->expand_filter; + foreach my $e ( @{$self->_fix_limit_special_cases($expanded)} ) { + push @new_lim, $self->clean_search_term( $e ); + } +# push @new_lim, @{$self->_fix_limit_special_cases($expanded)}; + } elsif ( $l =~ /^yr,st-numeric=/ ) { my ($date) = ( $l =~ /^yr,st-numeric=(.*)$/ ); next unless defined($date); -- 2.30.2