From e8d88560c4b320349136ebcdfb3a750282b2515f Mon Sep 17 00:00:00 2001 From: Ere Maijala Date: Thu, 24 Oct 2019 13:33:15 +0300 Subject: [PATCH] Bug 23887: Add support for sorting in Z3950Responder. Also enables sorting by any field that supports sorting and no longer ignores invalid or unsupported sorts. --- .../Elasticsearch/QueryBuilder.pm | 4 +-- Koha/Z3950Responder/GenericSession.pm | 30 +++++++++++++++++-- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm b/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm index 9bed437998..3fd516d3db 100644 --- a/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm +++ b/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm @@ -553,7 +553,7 @@ sub _convert_sort_fields { author => 'author', call_number => 'local-classification', popularity => 'issues', - relevance => undef, # default + relevance => '', # default title => 'title', pubdate => 'date-of-publication', ); @@ -564,7 +564,7 @@ sub _convert_sort_fields { grep { $_->{field} } map { my ( $f, $d ) = /(.+)_(.+)/; { - field => $sort_field_convert{$f}, + field => $sort_field_convert{$f} // $f, direction => $sort_order_convert{$d} } } @sort_by; diff --git a/Koha/Z3950Responder/GenericSession.pm b/Koha/Z3950Responder/GenericSession.pm index 0daf2258d4..445fc0baaf 100644 --- a/Koha/Z3950Responder/GenericSession.pm +++ b/Koha/Z3950Responder/GenericSession.pm @@ -2,7 +2,7 @@ package Koha::Z3950Responder::GenericSession; -# Copyright The National Library of Finland 2018 +# Copyright The National Library of Finland 2018-2019 # # This file is part of Koha. # @@ -63,7 +63,9 @@ sub start_search { my $query = $args->{RPN}->{'query'}->to_koha($self->{'attribute_mappings'}->{$database}); $self->log_debug(" parsed search: $query"); my @operands = $query; - (undef, $built_query) = $builder->build_query_compat( undef, \@operands, undef, undef, undef, 0); + my $sort = $self->_convert_sort_rules($args->{SRW_SORTKEYS} // ''); + + (undef, $built_query) = $builder->build_query_compat( undef, \@operands, undef, undef, $sort, 0); my ($error, $marcresults, $hits ) = $searcher->simple_search_compat($built_query, 0, $num_to_prefetch); if (defined $error) { @@ -110,4 +112,28 @@ sub fetch_record { return $resultset->{cached_results}[$offset - $resultset->{cached_offset}]; } +=head2 Internal methods + +=head3 _convert_sort_rules + + my $sort = $self->_convert_sort_rules($srw_sortkeys); + +Convert SRW_SORTKEYS from SimpleServer to Koha's format + +=cut + +sub _convert_sort_rules { + my ( $self, $srw_sortkeys ) = @_; + + my @result; + my @sortkeys = split(' ', $srw_sortkeys); + foreach my $sortkey (@sortkeys) { + my @parts = split(',', $sortkey); + my $field = $parts[0]; + my $direction = $parts[2] // 1 == 1 ? 'asc' : 'desc'; + push @result, $field . '_' . $direction; + } + return \ +} + 1; -- 2.17.1