Bugzilla – Attachment 62128 Details for
Bug 9988
Leave larger authority merges to merge_authorities cronjob (pref AuthorityMergeLimit)
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 9988: Add get_usage_count and linked_biblionumbers to Koha::Authority
Bug-9988-Add-getusagecount-and-linkedbiblionumbers.patch (text/plain), 9.65 KB, created by
Julian Maurice
on 2017-04-13 08:49:24 UTC
(
hide
)
Description:
Bug 9988: Add get_usage_count and linked_biblionumbers to Koha::Authority
Filename:
MIME Type:
Creator:
Julian Maurice
Created:
2017-04-13 08:49:24 UTC
Size:
9.65 KB
patch
obsolete
>From 7c8fed9129b432624fca3e44f728083f77f0130a Mon Sep 17 00:00:00 2001 >From: Marcel de Rooy <m.de.rooy@rijksmuseum.nl> >Date: Wed, 15 Feb 2017 15:48:17 +0100 >Subject: [PATCH] Bug 9988: Add get_usage_count and linked_biblionumbers to > Koha::Authority >MIME-Version: 1.0 >Content-Type: text/plain; charset=UTF-8 >Content-Transfer-Encoding: 8bit > >When replacing the Zebra code in sub merge, we actually need CountUsage >as well as the results it gets from SearchEngine. > >In order to get count and/or results, we now create: > >[1] instance methods get_usage_count and linked_biblionumbers in > Koha::Authority, >[2] class methods of the same name in Koha::Authorities. > >The instance method calls the class method. The class method can be used >for deleted authority records, and in 'legacy calls' before refactoring. > >Note: On BZ 18149 we will replace all CountUsage calls. > >Test plan: >Run t/db_dependent/Koha/Authorities.t > >Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl> > >Signed-off-by: Marc Véron <veron@veron.ch> >Signed-off-by: Jacek Ablewicz <abl@biblos.pk.edu.pl> >Signed-off-by: Julian Maurice <julian.maurice@biblibre.com> >--- > Koha/Authorities.pm | 57 ++++++++++++++++++++ > Koha/Authority.pm | 32 +++++++++++- > t/db_dependent/Koha/Authorities.t | 106 +++++++++++++++++++++++++++++++++++++- > 3 files changed, 192 insertions(+), 3 deletions(-) > >diff --git a/Koha/Authorities.pm b/Koha/Authorities.pm >index 22ce7a2ca3..ca150c4c8c 100644 >--- a/Koha/Authorities.pm >+++ b/Koha/Authorities.pm >@@ -35,8 +35,65 @@ Koha::Authorities - Koha Authority object set class > > =head2 Class Methods > >+=head3 get_usage_count >+ >+ $count = Koha::Authorities->get_usage_count({ authid => $i }); >+ >+ Returns the number of linked biblio records. >+ >+ Note: Code originates from C4::AuthoritiesMarc::CountUsage. >+ >+ This is a class method, since the authid may refer to a deleted record. >+ > =cut > >+sub get_usage_count { >+ my ( $class, $params ) = @_; >+ my $authid = $params->{authid} || return; >+ >+ my $searcher = Koha::SearchEngine::Search->new({ index => $Koha::SearchEngine::BIBLIOS_INDEX }); >+ my ( $err, $result, $count ) = $searcher->simple_search_compat( 'an:' . $authid, 0, 0 ); >+ if( $err ) { >+ warn "Error: $err from search for " . $authid; >+ return; >+ } >+ return $count; >+} >+ >+=head3 linked_biblionumbers >+ >+ my @biblios = Koha::Authorities->linked_biblionumbers({ >+ authid => $id, [ max_results => $max ], [ offset => $offset ], >+ }); >+ >+ Returns array of biblionumbers, as extracted from the result records of >+ the search engine. >+ >+ This is a class method, since the authid may refer to a deleted record. >+ >+=cut >+ >+sub linked_biblionumbers { >+ my ( $self, $params ) = @_; >+ my $authid = $params->{authid} || return; >+ >+ my $searcher = Koha::SearchEngine::Search->new({ index => $Koha::SearchEngine::BIBLIOS_INDEX }); >+ # if max_results is undefined, we will get all results >+ my ( $err, $result, $count ) = $searcher->simple_search_compat( 'an:' . $authid, $params->{offset} // 0, $params->{max_results} ); >+ >+ if( $err ) { >+ warn "Error: $err from search for " . $authid; >+ return; >+ } >+ >+ my @biblionumbers; >+ foreach my $res ( @$result ) { >+ my $bibno = $searcher->extract_biblionumber( $res ); >+ push @biblionumbers, $bibno if $bibno; >+ } >+ return @biblionumbers; >+} >+ > =head3 type > > =cut >diff --git a/Koha/Authority.pm b/Koha/Authority.pm >index b94d56024e..ac2b25c310 100644 >--- a/Koha/Authority.pm >+++ b/Koha/Authority.pm >@@ -20,6 +20,7 @@ package Koha::Authority; > use Modern::Perl; > > use base qw(Koha::Object); >+use Koha::SearchEngine::Search; > > =head1 NAME > >@@ -27,10 +28,39 @@ Koha::Authority - Koha Authority Object class > > =head1 API > >-=head2 Class Methods >+=head2 Instance Methods >+ >+=head3 get_usage_count >+ >+ $count = $self->get_usage_count; >+ >+ Returns the number of linked biblio records. > > =cut > >+sub get_usage_count { >+ my ( $self ) = @_; >+ return Koha::Authorities->get_usage_count({ authid => $self->authid }); >+} >+ >+=head3 linked_biblionumbers >+ >+ my @biblios = $self->linked_biblionumbers({ >+ [ max_results => $max ], [ offset => $offset ], >+ }); >+ >+ Returns an array of biblionumbers. >+ >+=cut >+ >+sub linked_biblionumbers { >+ my ( $self, $params ) = @_; >+ $params->{authid} = $self->authid; >+ return Koha::Authorities->linked_biblionumbers( $params ); >+} >+ >+=head2 Class Methods >+ > =head3 type > > =cut >diff --git a/t/db_dependent/Koha/Authorities.t b/t/db_dependent/Koha/Authorities.t >index 8bc98fdf54..a69066307b 100644 >--- a/t/db_dependent/Koha/Authorities.t >+++ b/t/db_dependent/Koha/Authorities.t >@@ -19,12 +19,16 @@ > > use Modern::Perl; > >-use Test::More tests => 5; >+use Test::More tests => 6; > use MARC::Field; > use MARC::File::XML; > use MARC::Record; > use Test::Deep; >+use Test::MockModule; >+use Test::MockObject; >+use Test::Warn; > >+use C4::Context; > use Koha::Authority; > use Koha::Authorities; > use Koha::Authority::MergeRequest; >@@ -33,12 +37,22 @@ use Koha::Authority::Type; > use Koha::Authority::Types; > use Koha::Database; > >+use t::lib::Mocks; > use t::lib::TestBuilder; > >+BEGIN { >+ #TODO Helpful as long as we have issues here >+ my $mock = Test::MockObject->new(); >+ $mock->fake_module( 'Catmandu::Store::ElasticSearch' ); >+} >+ > my $schema = Koha::Database->new->schema; > $schema->storage->txn_begin; > >-my $builder = t::lib::TestBuilder->new; >+# Globals >+our $search_compat_pars; >+our $builder = t::lib::TestBuilder->new; >+ > my $nb_of_authorities = Koha::Authorities->search->count; > my $nb_of_authority_types = Koha::Authority::Types->search->count; > my $new_authority_type_1 = Koha::Authority::Type->new( >@@ -110,4 +124,92 @@ subtest 'Testing reporting_tag_xml in MergeRequests' => sub { > ); > }; > >+subtest 'Trivial tests for get_count_usage and linked_biblionumbers' => sub { >+ plan tests => 5; >+ >+ # NOTE: We are not testing $searcher->simple_search_compat here. Suppose >+ # that should be done in t/db../Koha/SearchEngine? >+ # So we're just testing the 'wrapper' here. >+ >+ my ( $mods, $koha_fields ); >+ t::lib::Mocks::mock_preference('SearchEngine', 'Zebra'); >+ $mods->{zebra} = Test::MockModule->new( 'Koha::SearchEngine::Zebra::Search' ); >+ $mods->{elastic} = Test::MockModule->new( 'Koha::SearchEngine::Elasticsearch::Search' ); >+ $mods->{biblio} = Test::MockModule->new( 'C4::Biblio' ); >+ $mods->{zebra}->mock( 'simple_search_compat', \&simple_search_compat ); >+ $mods->{elastic}->mock( 'simple_search_compat', \&simple_search_compat ); >+ $mods->{biblio}->mock( 'GetMarcFromKohaField', sub { return @$koha_fields; }); >+ >+ my $auth1 = $builder->build({ source => 'AuthHeader' }); >+ $auth1 = Koha::Authorities->find( $auth1->{authid} ); >+ >+ # Test error condition >+ my $count; >+ $search_compat_pars = [ 0, 'some_error' ]; >+ warning_like { $count = $auth1->get_usage_count } >+ qr/some_error/, 'Catch warn of simple_search_compat'; >+ is( $count, undef, 'Undef returned when error encountered' ); >+ >+ # Simple test with some results; one result discarded in the 2nd test >+ $search_compat_pars = [ 1 ]; >+ $koha_fields = [ '001', '' ]; >+ is( $auth1->get_usage_count, 3, 'Three results expected (Zebra)' ); >+ cmp_deeply( [ $auth1->linked_biblionumbers ], [ 1001, 3003 ], >+ 'linked_biblionumbers should ignore record without biblionumber' ); >+ >+ # And a simple test with Elastic >+ t::lib::Mocks::mock_preference('SearchEngine', 'Elasticsearch'); >+ cmp_deeply( [ $auth1->linked_biblionumbers ], [ 2001 ], >+ 'linked_biblionumbers with Elasticsearch' ); >+}; >+ >+sub simple_search_compat { >+ if( $search_compat_pars->[0] == 0 ) { >+ return ( $search_compat_pars->[1], [], 0 ); >+ } elsif( $search_compat_pars->[0] == 1 ) { >+ my $records = C4::Context->preference('SearchEngine') eq 'Zebra' >+ ? few_marcxml_records() >+ : few_marc_records(); >+ return ( undef, $records, scalar @$records ); >+ } >+} >+ >+sub few_marcxml_records { >+ return [ >+q|<?xml version="1.0" encoding="UTF-8"?> >+<record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.loc.gov/MARC21/slim" xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd"> >+ <controlfield tag="001">1001</controlfield> >+ <datafield tag="110" ind1=" " ind2=" "> >+ <subfield code="9">102</subfield> >+ <subfield code="a">My Corporation</subfield> >+ </datafield> >+</record>|, >+q|<?xml version="1.0" encoding="UTF-8"?> >+<record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.loc.gov/MARC21/slim" xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd"> >+ <!-- No biblionumber here --> >+ <datafield tag="610" ind1=" " ind2=" "> >+ <subfield code="9">112</subfield> >+ <subfield code="a">Another Corporation</subfield> >+ </datafield> >+</record>|, >+q|<?xml version="1.0" encoding="UTF-8"?> >+<record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.loc.gov/MARC21/slim" xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd"> >+ <controlfield tag="001">3003</controlfield> >+ <datafield tag="110" ind1=" " ind2=" "> >+ <subfield code="9">102</subfield> >+ <subfield code="a">My Corporation</subfield> >+ </datafield> >+</record>| >+ ]; >+} >+ >+sub few_marc_records { >+ my $marc = MARC::Record->new; >+ $marc->append_fields( >+ MARC::Field->new( '001', '2001' ), >+ MARC::Field->new( '245', '', '', a => 'Title' ), >+ ); >+ return [ $marc ]; >+} >+ > $schema->storage->txn_rollback; >-- >2.11.0
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 9988
:
59158
|
59159
|
60256
|
60257
|
60258
|
60259
|
60594
|
60595
|
60596
|
60597
|
60598
|
60599
|
60600
|
60601
|
60602
|
60603
|
60604
|
60605
|
60606
|
60607
|
60668
|
60669
|
60670
|
60671
|
60672
|
60673
|
60674
|
60675
|
61306
|
61307
|
61308
|
61309
|
61779
|
61780
|
61781
|
61782
|
61783
|
61784
|
61785
|
61786
|
61787
|
61788
|
61789
|
61790
|
61791
|
61792
|
61890
|
61891
|
61892
|
61893
|
61894
|
61895
|
61897
|
61898
|
61899
|
61900
|
61901
|
61902
|
61903
|
61904
|
61912
|
61913
|
61914
|
61915
|
61916
|
61917
|
61918
|
61919
|
61920
|
61921
|
61922
|
61923
|
61924
|
61925
|
62055
|
62123
|
62124
|
62125
|
62126
|
62127
| 62128 |
62129
|
62130
|
62131
|
62132
|
62133
|
62134
|
62135
|
62136
|
62137