Bug 26725: (QA follow-up) Add line break and 'the' for readability
[koha.git] / Koha / BiblioUtils / Iterator.pm
blobf8a4e41019d8128f36f3453d5f038974aa0ebfa4
1 package Koha::BiblioUtils::Iterator;
3 # This contains an iterator over biblio records
5 # Copyright 2014 Catalyst IT
7 # This file is part of Koha.
9 # Koha is free software; you can redistribute it and/or modify it
10 # under the terms of the GNU General Public License as published by
11 # the Free Software Foundation; either version 3 of the License, or
12 # (at your option) any later version.
14 # Koha is distributed in the hope that it will be useful, but
15 # WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 # GNU General Public License for more details.
19 # You should have received a copy of the GNU General Public License
20 # along with Koha; if not, see <http://www.gnu.org/licenses>.
22 =head1 NAME
24 Koha::BiblioUtils::Iterator - iterates over biblios provided by a DBIx::Class::ResultSet
26 =head1 DESCRIPTION
28 This provides an iterator over a L<DBIx::Class::ResultSet> that contains a
29 biblionumber column.
30 Returns a MARC::Record in scalar context.
31 Returns biblionumber and marc in list context.
33 =head1 SYNOPSIS
35 use Koha::BiblioUtils::Iterator;
36 my $rs = $schema->resultset('biblioitems');
37 my $iterator = Koha::BiblioUtils::Iterator->new($rs);
38 while (my $record = $iterator->next()) {
39 // do something with $record
42 =head1 METHODS
44 =cut
46 use C4::Biblio; # :( - for EmbedItemsInMarcBiblio
48 use Carp;
49 use MARC::Record;
50 use MARC::File::XML;
51 use Modern::Perl;
53 =head2 new
55 my $it = new($sth, option => $value, ...);
57 Takes a ResultSet to iterate over, and gives you an iterator on it. Optional
58 options may be specified.
60 =head3 Options
62 =over 4
64 =item items
66 Set to true to include item data in the resulting MARC record.
68 =back
70 =cut
72 sub new {
73 my ( $class, $rs, %options ) = @_;
75 bless {
76 rs => $rs,
77 %options,
78 }, $class;
81 =head2 next()
83 In a scalar context, provides the next MARC::Record from the ResultSet, or
84 C<undef> if there are no more.
86 In a list context it will provide ($biblionumber, $record).
88 =cut
90 sub next {
91 my ($self) = @_;
93 my $marc;
94 my $row = $self->{rs}->next();
95 return if !$row;
96 my $marcxml = C4::Biblio::GetXmlBiblio( $row->get_column('biblionumber') );
97 if ( $marcxml ) {
98 $marc = MARC::Record->new_from_xml( $marcxml, 'UTF-8' );
100 else {
101 confess "No marcxml column returned in the request.";
104 my $bibnum;
105 if ( $self->{items} ) {
106 $bibnum = $row->get_column('biblionumber');
107 confess "No biblionumber column returned in the request."
108 if ( !defined($bibnum) );
110 # TODO this should really be in Koha::BiblioUtils or something similar.
111 C4::Biblio::EmbedItemsInMarcBiblio({
112 marc_record => $marc,
113 biblionumber => $bibnum });
116 if (wantarray) {
117 $bibnum //= $row->get_column('biblionumber');
118 confess "No biblionumber column returned in the request."
119 if ( !defined($bibnum) );
120 return ( $bibnum, $marc );
122 else {
123 return $marc;