From d9637b9da6bfc79ad19cc7259b8c7ab30f9897d6 Mon Sep 17 00:00:00 2001 From: Ere Maijala Date: Wed, 21 Aug 2019 11:13:29 +0300 Subject: [PATCH] Bug 22592: Rebase, add UNIMARC support and fix tests. --- .../Elasticsearch/QueryBuilder.pm | 7 ++-- Koha/SearchEngine/Elasticsearch/Search.pm | 35 ++++++++++++------- .../SearchEngine/Elasticsearch/QueryBuilder.t | 24 +++++++++++-- .../Koha/SearchEngine/Elasticsearch/Search.t | 12 ++++++- 4 files changed, 58 insertions(+), 20 deletions(-) diff --git a/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm b/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm index 0bd756988d..f4234a52c7 100644 --- a/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm +++ b/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm @@ -209,7 +209,6 @@ sub build_query_compat { my %options; $options{fields} = \@fields; $options{sort} = \@sort_params; - $options{expanded_facet} = $params->{expanded_facet}; $query = $self->build_query( $query_str, %options ); } @@ -452,7 +451,7 @@ sub build_authorities_query_compat { =head2 _build_scan_query - my ($query, $query_str) = $builder->build_scan_query(\@operands, \@indexes) + my ($query, $query_str) = $builder->_build_scan_query(\@operands, \@indexes) This will build an aggregation scan query that can be issued to elasticsearch from the provided string input. @@ -471,7 +470,7 @@ sub _build_scan_query { my ( $self, $operands, $indexes ) = @_; my $term = scalar( @$operands ) == 0 ? '' : $operands->[0]; - my $index = scalar( @$indexes ) == 0 ? 'title' : $indexes->[0]; + my $index = scalar( @$indexes ) == 0 ? 'subject' : $indexes->[0]; my ( $f, $d ) = split( /,/, $index); $index = $scan_field_convert{$f} || $f; @@ -496,7 +495,7 @@ sub _build_scan_query { =head2 _create_regex_filter - my $filter = $builder->create_regex_filter('term') + my $filter = $builder->_create_regex_filter('term') This will create a regex filter that can be used with an aggregation query. diff --git a/Koha/SearchEngine/Elasticsearch/Search.pm b/Koha/SearchEngine/Elasticsearch/Search.pm index 6ec37fe639..609b3c486a 100644 --- a/Koha/SearchEngine/Elasticsearch/Search.pm +++ b/Koha/SearchEngine/Elasticsearch/Search.pm @@ -132,8 +132,8 @@ sub count { my ( $error, $results, $facets ) = $search->search_compat( $query, $simple_query, \@sort_by, \@servers, - $results_per_page, $offset, $branches, $query_type, - $scan + $results_per_page, $offset, undef, $item_types, + $query_type, $scan ) A search interface somewhat compatible with LgetRecords>. Anything @@ -144,9 +144,9 @@ get ignored here, along with some other things (like C<@servers>.) sub search_compat { my ( - $self, $query, $simple_query, $sort_by, - $servers, $results_per_page, $offset, $branches, - $query_type, $scan + $self, $query, $simple_query, $sort_by, + $servers, $results_per_page, $offset, $branches, + $item_types, $query_type, $scan ) = @_; if ( $scan ) { @@ -544,15 +544,26 @@ sub _aggregation_scan { my $count = scalar(@{$results->{aggregations}{$field}{buckets}}); for (my $index = $offset; $index - $offset < $results_per_page && $index < $count; $index++) { my $bucket = $results->{aggregations}{$field}{buckets}->[$index]; - # Scan values are expressed as 100 a (count) and 245a (term) + # Scan values are expressed as: + # - MARC21: 100a (count) and 245a (term) + # - UNIMARC: 200f (count) and 200a (term) my $marc = MARC::Record->new; $marc->encoding('UTF-8'); - $marc->append_fields( - MARC::Field->new((100, ' ', ' ', 'a' => $bucket->{doc_count})) - ); - $marc->append_fields( - MARC::Field->new((245, ' ', ' ', 'a' => $bucket->{key})) - ); + if (C4::Context->preference('marcflavour') eq 'UNIMARC') { + $marc->append_fields( + MARC::Field->new((200, ' ', ' ', 'f' => $bucket->{doc_count})) + ); + $marc->append_fields( + MARC::Field->new((200, ' ', ' ', 'a' => $bucket->{key})) + ); + } else { + $marc->append_fields( + MARC::Field->new((100, ' ', ' ', 'a' => $bucket->{doc_count})) + ); + $marc->append_fields( + MARC::Field->new((245, ' ', ' ', 'a' => $bucket->{key})) + ); + } $records[$index] = $marc->as_usmarc(); }; # consumers of this expect a namespaced result, we provide the default diff --git a/t/db_dependent/Koha/SearchEngine/Elasticsearch/QueryBuilder.t b/t/db_dependent/Koha/SearchEngine/Elasticsearch/QueryBuilder.t index 0ae40d780f..d5c9db65f6 100644 --- a/t/db_dependent/Koha/SearchEngine/Elasticsearch/QueryBuilder.t +++ b/t/db_dependent/Koha/SearchEngine/Elasticsearch/QueryBuilder.t @@ -170,7 +170,7 @@ subtest 'build_authorities_query_compat() tests' => sub { }; subtest 'build_query tests' => sub { - plan tests => 40; + plan tests => 48; my $qb; @@ -419,7 +419,25 @@ subtest 'build_query tests' => sub { is($query_desc, 'title:"donald duck"', 'query desc ok'); # Scan queries - ( undef, $query, $simple_query, $query_cgi, $query_desc ) = $qb->build_query_compat( undef, ['new'], ['su'], undef, undef, 1 ); + ( undef, $query, $simple_query, $query_cgi, $query_desc ) = $qb->build_query_compat( undef, ['new'], ['au'], undef, undef, 1 ); + is( + $query->{query}{query_string}{query}, + '*', + "scan query is properly formed" + ); + is_deeply( + $query->{aggregations}{'author'}{'terms'}, + { + field => 'author__facet', + order => { '_term' => 'asc' }, + include => '[nN][eE][wW].*' + }, + "scan aggregation request is properly formed" + ); + is($query_cgi, 'idx=au&q=new&scan=1', 'query cgi'); + is($query_desc, 'new', 'query desc ok'); + + ( undef, $query, $simple_query, $query_cgi, $query_desc ) = $qb->build_query_compat( undef, ['new'], [], undef, undef, 1 ); is( $query->{query}{query_string}{query}, '*', @@ -434,7 +452,7 @@ subtest 'build_query tests' => sub { }, "scan aggregation request is properly formed" ); - is($query_cgi, 'idx=su&q=new&scan=1', 'query cgi'); + is($query_cgi, 'idx=&q=new&scan=1', 'query cgi'); is($query_desc, 'new', 'query desc ok'); }; diff --git a/t/db_dependent/Koha/SearchEngine/Elasticsearch/Search.t b/t/db_dependent/Koha/SearchEngine/Elasticsearch/Search.t index 8d73f14058..19c33bf6ec 100644 --- a/t/db_dependent/Koha/SearchEngine/Elasticsearch/Search.t +++ b/t/db_dependent/Koha/SearchEngine/Elasticsearch/Search.t @@ -17,7 +17,7 @@ use Modern::Perl; -use Test::More tests => 11; +use Test::More tests => 13; use t::lib::Mocks; use Koha::SearchEngine::Elasticsearch::QueryBuilder; @@ -100,6 +100,16 @@ SKIP: { ok ($results = $searcher->search_compat( $query ), 'Test search_compat' ); + my ( undef, $scan_query ) = $builder->build_query_compat( undef, ['easy'], [], undef, undef, 1 ); + ok ((undef, $results) = $searcher->search_compat( $scan_query, undef, [], [], 20, 0, undef, undef, undef, 1 ), 'Test search_compat scan query' ); + my $expected = { + biblioserver => { + hits => 0, + RECORDS => [] + } + }; + is_deeply($results, $expected, 'Scan query results ok'); + ok (($results,$count) = $searcher->search_auth_compat ( $query ), 'Test search_auth_compat' ); is ( $count = $searcher->count_auth_use($searcher,1), 0, 'Testing count_auth_use'); -- 2.17.1