From 96d79ed01e70ad68065ce39545c59381f93573d6 Mon Sep 17 00:00:00 2001
From: Martin Renvoize <martin.renvoize@ptfs-europe.com>
Date: Fri, 6 Aug 2021 12:44:23 +0100
Subject: [PATCH] Bug 11175: (QA follow-up) Move get_component_part_query

This patch removes Koha::Util::Search in preference to embedding the
search query builder in Koha::Biblio as get_analytics_query.

Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
Signed-off-by: Andrew Nugged <nugged@gmail.com>
---
 C4/XSLT.pm                   |  5 +--
 Koha/Biblio.pm               | 54 +++++++++++++++++++++++---
 Koha/Util/Search.pm          | 73 ------------------------------------
 t/Koha/Util/Search.t         | 54 --------------------------
 t/db_dependent/Koha/Biblio.t | 42 +++++++++++++++++----
 5 files changed, 84 insertions(+), 144 deletions(-)
 delete mode 100644 Koha/Util/Search.pm
 delete mode 100755 t/Koha/Util/Search.t

diff --git a/C4/XSLT.pm b/C4/XSLT.pm
index fd5a644389..2dccde22ed 100644
--- a/C4/XSLT.pm
+++ b/C4/XSLT.pm
@@ -29,7 +29,6 @@ use C4::Koha qw( xml_escape );
 use C4::Biblio qw( GetAuthorisedValueDesc GetFrameworkCode GetMarcStructure );
 use Koha::AuthorisedValues;
 use Koha::ItemTypes;
-use Koha::Util::Search;
 use Koha::XSLT::Base;
 use Koha::Libraries;
 
@@ -286,7 +285,7 @@ sub XSLTParse4Display {
     # possibly insert component records into Detail views
     if ($xslsyspref =~ m/Details/) {
         my $biblio = Koha::Biblios->find( $biblionumber );
-        my $components = $biblio->get_marc_components(300);
+        my $components = $biblio->get_marc_analytics(300);
         $variables->{show_analytics_link} = ( scalar @{$components} == 0 ) ? 0 : 1;
 
         my $showcomp = C4::Context->preference('ShowComponentRecords');
@@ -300,7 +299,7 @@ sub XSLTParse4Display {
 
              $variables->{show_analytics_link} = 0;
 
-             my $search_query = Koha::Util::Search::get_component_part_query($biblionumber);
+             my $search_query = $biblio->get_analytics_query;
              $variables->{ComponentPartQuery} = $search_query;
 
              my @componentPartRecordXML = ('<componentPartRecords>');
diff --git a/Koha/Biblio.pm b/Koha/Biblio.pm
index 57a195a6ba..7183a452eb 100644
--- a/Koha/Biblio.pm
+++ b/Koha/Biblio.pm
@@ -43,7 +43,6 @@ use Koha::Suggestions;
 use Koha::Subscriptions;
 use Koha::SearchEngine;
 use Koha::SearchEngine::Search;
-use Koha::Util::Search;
 
 =head1 NAME
 
@@ -479,21 +478,21 @@ sub suggestions {
     return Koha::Suggestions->_new_from_dbic( $suggestions_rs );
 }
 
-=head3 get_marc_components
+=head3 get_marc_analytics
 
-  my $components = $self->get_marc_components();
+  my $analytics = $self->get_marc_analytics();
 
-Returns an array of MARCXML data, which are component parts of
+Returns an array of MARCXML data, which are analytic parts of
 this object (MARC21 773$w points to this)
 
 =cut
 
-sub get_marc_components {
+sub get_marc_analytics {
     my ($self, $max_results) = @_;
 
     return [] if (C4::Context->preference('marcflavour') ne 'MARC21');
 
-    my $searchstr = Koha::Util::Search::get_component_part_query($self->id);
+    my $searchstr = $self->get_analytics_query;
 
     if (defined($searchstr)) {
         my $searcher = Koha::SearchEngine::Search->new({index => $Koha::SearchEngine::BIBLIOS_INDEX});
@@ -504,6 +503,49 @@ sub get_marc_components {
     return $self->{_components} || [];
 }
 
+=head2 get_analytics_query
+
+Returns a query which can be used to search for all component parts of MARC21 biblios
+
+=cut
+
+sub get_analytics_query {
+    my ($self) = @_;
+
+    my $marc = $self->metadata->record;
+
+    my $searchstr;
+    if ( C4::Context->preference('UseControlNumber') ) {
+        my $pf001 = $marc->field('001') || undef;
+
+        if ( defined($pf001) ) {
+            my $pf003 = $marc->field('003') || undef;
+
+            if ( !defined($pf003) ) {
+                # search for 773$w='Host001'
+                $searchstr = "rcn:" . $pf001->data();
+            }
+            else {
+                $searchstr  = "(";
+                # search for (773$w='Host001' and 003='Host003') or 773$w='Host003 Host001')
+                $searchstr .= "(rcn:" . $pf001->data() . " AND cni:" . $pf003->data() . ")";
+                $searchstr .= " OR rcn:" . $pf003->data() . " " . $pf001->data();
+                $searchstr .= ")";
+            }
+
+            # limit to monograph and serial component part records
+            $searchstr .= " AND (bib-level:a OR bib-level:b)";
+        }
+    }
+    else {
+        my $cleaned_title = $marc->title;
+        $cleaned_title =~ tr|/||;
+        $searchstr = "Host-item:($cleaned_title)";
+    }
+
+    return $searchstr;
+}
+
 =head3 subscriptions
 
 my $subscriptions = $self->subscriptions
diff --git a/Koha/Util/Search.pm b/Koha/Util/Search.pm
deleted file mode 100644
index 99ff38e77f..0000000000
--- a/Koha/Util/Search.pm
+++ /dev/null
@@ -1,73 +0,0 @@
-package Koha::Util::Search;
-
-# Copyright 2020 University of Helsinki
-#
-# This file is part of Koha.
-#
-# Koha is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#
-# Koha is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with Koha; if not, see <http://www.gnu.org/licenses>.
-
-use Modern::Perl;
-
-use C4::Biblio qw( GetMarcBiblio );
-
-=head1 NAME
-
-Koha::Util::Search - functions to build complex search queries
-
-=head1 FUNCTIONS
-
-=head2 get_component_part_query
-
-Returns a query which can be used to search for all component parts of MARC21 biblios
-
-=cut
-
-sub get_component_part_query {
-    my ($biblionumber) = @_;
-
-    my $marc = GetMarcBiblio( { biblionumber => $biblionumber } );
-
-    my $searchstr;
-    if ( C4::Context->preference('UseControlNumber') ) {
-        my $pf001 = $marc->field('001') || undef;
-
-        if ( defined($pf001) ) {
-            my $pf003 = $marc->field('003') || undef;
-
-            if ( !defined($pf003) ) {
-                # search for 773$w='Host001'
-                $searchstr = "rcn:" . $pf001->data();
-            }
-            else {
-                $searchstr  = "(";
-                # search for (773$w='Host001' and 003='Host003') or 773$w='Host003 Host001')
-                $searchstr .= "(rcn:" . $pf001->data() . " AND cni:" . $pf003->data() . ")";
-                $searchstr .= " OR rcn:" . $pf003->data() . " " . $pf001->data();
-                $searchstr .= ")";
-            }
-
-            # limit to monograph and serial component part records
-            $searchstr .= " AND (bib-level:a OR bib-level:b)";
-        }
-    }
-    else {
-        my $cleaned_title = $marc->title;
-        $cleaned_title =~ tr|/||;
-        $searchstr = "Host-item:($cleaned_title)";
-    }
-
-    return $searchstr;
-}
-
-1;
diff --git a/t/Koha/Util/Search.t b/t/Koha/Util/Search.t
deleted file mode 100755
index 30008db150..0000000000
--- a/t/Koha/Util/Search.t
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/usr/bin/perl
-#
-# Copyright 2020 University of Helsinki
-#
-# This file is part of Koha.
-#
-# Koha is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#
-# Koha is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with Koha; if not, see <http://www.gnu.org/licenses>.
-
-use Modern::Perl;
-
-use Test::More tests => 1;
-
-use t::lib::Mocks;
-use t::lib::TestBuilder;
-
-use C4::Biblio qw( GetMarcBiblio ModBiblioMarc );
-use Koha::Util::Search;
-use MARC::Field;
-
-my $builder = t::lib::TestBuilder->new;
-
-subtest 'get_component_part_query' => sub {
-    plan tests => 3;
-
-    my $biblio = $builder->build_sample_biblio();
-    my $biblionumber = $biblio->biblionumber;
-    my $record = GetMarcBiblio({ biblionumber => $biblionumber });
-
-    t::lib::Mocks::mock_preference( 'UseControlNumber', '0' );
-    is(Koha::Util::Search::get_component_part_query($biblionumber), "Host-item:(Some boring read)", "UseControlNumber disabled");
-
-    t::lib::Mocks::mock_preference( 'UseControlNumber', '1' );
-    my $marc_001_field = MARC::Field->new('001', $biblionumber);
-    $record->append_fields($marc_001_field);
-    ModBiblioMarc($record, $biblionumber);
-
-    is(Koha::Util::Search::get_component_part_query($biblionumber), "rcn:$biblionumber AND (bib-level:a OR bib-level:b)", "UseControlNumber enabled without MarcOrgCode");
-
-    my $marc_003_field = MARC::Field->new('003', 'OSt');
-    $record->append_fields($marc_003_field);
-    ModBiblioMarc($record, $biblionumber);
-    is(Koha::Util::Search::get_component_part_query($biblionumber), "((rcn:$biblionumber AND cni:OSt) OR rcn:OSt $biblionumber) AND (bib-level:a OR bib-level:b)", "UseControlNumber enabled with MarcOrgCode");
-};
diff --git a/t/db_dependent/Koha/Biblio.t b/t/db_dependent/Koha/Biblio.t
index 2a9e49e136..1cd50f5836 100755
--- a/t/db_dependent/Koha/Biblio.t
+++ b/t/db_dependent/Koha/Biblio.t
@@ -17,9 +17,9 @@
 
 use Modern::Perl;
 
-use Test::More tests => 17;
+use Test::More tests => 18;
 
-use C4::Biblio qw( AddBiblio ModBiblio );
+use C4::Biblio qw( AddBiblio ModBiblio ModBiblioMarc );
 use Koha::Database;
 use Koha::Caches;
 use Koha::Acquisition::Orders;
@@ -507,7 +507,7 @@ subtest 'suggestions() tests' => sub {
     $schema->storage->txn_rollback;
 };
 
-subtest 'get_marc_components() tests' => sub {
+subtest 'get_marc_analytics() tests' => sub {
 
     plan tests => 3;
 
@@ -519,13 +519,13 @@ subtest 'get_marc_components() tests' => sub {
     my $search_mod = Test::MockModule->new( 'Koha::SearchEngine::Zebra::Search' );
     $search_mod->mock( 'simple_search_compat', \&search_component_record2 );
 
-    my @components = $host_biblio->get_marc_components;
+    my @components = $host_biblio->get_marc_analytics;
     is( ref(\@components), 'ARRAY', 'Return type is correct' );
 
     is_deeply(
         [@components],
-        [()],
-        '->get_marc_components returns an empty ARRAY'
+        [[]],
+        '->get_marc_analytics returns an empty ARRAY'
     );
 
     $search_mod->unmock( 'simple_search_compat');
@@ -533,15 +533,41 @@ subtest 'get_marc_components() tests' => sub {
     my $component_record = component_record1()->as_xml();
 
     is_deeply(
-        $host_biblio->get_marc_components,
+        $host_biblio->get_marc_analytics,
         [($component_record)],
-        '->get_marc_components returns the related component part record'
+        '->get_marc_analytics returns the related component part record'
     );
     $search_mod->unmock( 'simple_search_compat');
 
     $schema->storage->txn_rollback;
 };
 
+subtest 'get_analytics_query' => sub {
+    plan tests => 3;
+
+    my $biblio = $builder->build_sample_biblio();
+    my $biblionumber = $biblio->biblionumber;
+    my $record = $biblio->metadata->record;
+
+    t::lib::Mocks::mock_preference( 'UseControlNumber', '0' );
+    is($biblio->get_analytics_query, "Host-item:(Some boring read)", "UseControlNumber disabled");
+
+    t::lib::Mocks::mock_preference( 'UseControlNumber', '1' );
+    my $marc_001_field = MARC::Field->new('001', $biblionumber);
+    $record->append_fields($marc_001_field);
+    C4::Biblio::ModBiblio( $record, $biblio->biblionumber );
+    $biblio = Koha::Biblios->find( $biblio->biblionumber);
+
+    is($biblio->get_analytics_query, "rcn:$biblionumber AND (bib-level:a OR bib-level:b)", "UseControlNumber enabled without MarcOrgCode");
+
+    my $marc_003_field = MARC::Field->new('003', 'OSt');
+    $record->append_fields($marc_003_field);
+    C4::Biblio::ModBiblio( $record, $biblio->biblionumber );
+    $biblio = Koha::Biblios->find( $biblio->biblionumber);
+
+    is($biblio->get_analytics_query, "((rcn:$biblionumber AND cni:OSt) OR rcn:OSt $biblionumber) AND (bib-level:a OR bib-level:b)", "UseControlNumber enabled with MarcOrgCode");
+};
+
 subtest 'orders() and active_orders() tests' => sub {
 
     plan tests => 5;
-- 
2.20.1