From c20baf8b4bcf9ad1455d2a8284d5252b740de56e Mon Sep 17 00:00:00 2001
From: Alex Arnaud <alex.arnaud@biblibre.com>
Date: Thu, 12 May 2022 17:29:52 +0200
Subject: [PATCH] Bug 30745: handle ES ranges for date of acquisition

Test plan:
  - Enable elasticsearch
  - git to labels/label-item-search.pl
  - search using after date only
    => check you get items with date-of-acquisition greater than after
date
  - search using before date only
    => check you get items with date-of-acquisition less than before
date
  - search using after and before date
    => check you get items with date-of-acquisition between after and
before
  - Combine this searches with a specified index
  - enable zebra and repeat these tests

Signed-off-by: Andrew Fuerste-Henry <andrew@bywatersolutions.com>

Signed-off-by: Katrin Fischer <katrin.fischer.83@web.de>

https://bugs.koha-community.org/show_bug.cgi?id=30845
---
 Koha/SearchEngine/Elasticsearch/QueryBuilder.pm | 17 +++++++++++++++++
 labels/label-item-search.pl                     | 14 ++++++++------
 2 files changed, 25 insertions(+), 6 deletions(-)

diff --git a/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm b/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm
index 35ab4b7f91..3cb6d9bab3 100644
--- a/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm
+++ b/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm
@@ -1081,6 +1081,7 @@ sub _fix_limit_special_cases {
     my ( $self, $limits ) = @_;
 
     my @new_lim;
+    my $ranges;
     foreach my $l (@$limits) {
 
         # This is set up by opac-search.pl
@@ -1149,6 +1150,16 @@ sub _fix_limit_special_cases {
                 push @new_lim, $term;
             }
         }
+        elsif ($l =~ /^acqdate,(ge|le),st-date-normalized=/ ) {
+            my ($fromdate) = ( $l =~ /^acqdate,ge,st-date-normalized=(.*)$/ );
+            my ($todate) = ( $l =~ /^acqdate,le,st-date-normalized=(.*)$/ );
+            $fromdate ||= '*';
+            $todate ||= '*';
+            $ranges->{'date-of-acquisition.raw'} = {
+                from => $fromdate,
+                to => $todate
+            }
+        }
         else {
             my ( $field, $term ) = $l =~ /^\s*([\w,-]*?):(.*)/;
             $field =~ s/,phr$//; #We are quoting all the limits as phrase, this prevents from quoting again later
@@ -1159,6 +1170,12 @@ sub _fix_limit_special_cases {
                 push @new_lim, $l;
             }
         }
+
+        if ( $ranges ) {
+            foreach my $index ( keys %$ranges ) {
+                push @new_lim, "$index:[$ranges->{$index}{from} TO $ranges->{$index}{to}]"
+            }
+        }
     }
     return \@new_lim;
 }
diff --git a/labels/label-item-search.pl b/labels/label-item-search.pl
index d0624e4e2d..b07e4e1c93 100755
--- a/labels/label-item-search.pl
+++ b/labels/label-item-search.pl
@@ -32,6 +32,7 @@ use C4::Creators::Lib qw( html_table );
 use Koha::Logger;
 use Koha::Items;
 use Koha::ItemTypes;
+use Koha::SearchEngine::QueryBuilder;
 use Koha::SearchEngine::Search;
 
 my $query = CGI->new;
@@ -76,20 +77,21 @@ if ( $op eq "do_search" ) {
         push(@limits, "acqdate,le,st-date-normalized=$dateto");
     }
 
-    my ( $error, $query, $simple_query, $query_cgi,
+    my ( $build_error, $query, $simple_query, $query_cgi,
         $query_desc, $limit, $limit_cgi, $limit_desc,
         $query_type )
         = $builder->build_query_compat( undef, [$ccl_textbox], [$idx], \@limits);
 
     my $offset = $startfrom > 1 ? $startfrom - 1 : 0;
 
-    my ( $error, $marcresults, $facets ) = $searcher->search_compat(
-        $query, $simple_query, undef, ['biblioserver'], $resultsperpage, $offset,
+    my ( $error, $results, $facets ) = $searcher->search_compat(
+        $query, $simple_query, [], ['biblioserver'], $resultsperpage, $offset,
         undef, undef, $query_type, undef
-   );
+    );
 
-    if (!defined $error && $marcresults->{biblioserver}{RECORDS} ) {
-        $show_results = $marcresults->{biblioserver}{RECORDS};
+    if (!defined $error && @{$results->{biblioserver}{RECORDS}} ) {
+        $show_results = @{$results->{biblioserver}{RECORDS}};
+        $marcresults = $results->{biblioserver}{RECORDS};
     }
     else {
         Koha::Logger->get->warn("ERROR label-item-search: no results from simple_search_compat");
-- 
2.34.1