From ffece815baa33c5431a60e9d6abca4b245d4ae7c Mon Sep 17 00:00:00 2001 From: Tomas Cohen Arazi Date: Thu, 10 Oct 2019 13:17:18 -0300 Subject: [PATCH] Bug 23793: Add an EmbedItems RecordProcessor filter for MARC::Record objects This patch is work in progress. I submit early with the aim to provide people thinking about performance on the biblio/records/items front an idea of what I'm thinking. The synopsis on the new filter is self explanatory. The idea is that we calculate as much as we can outside the loops. And this simpe implementation is clean and light as well. Problems: - Filters are supposed to support passing multiple MARC records, this one doesn't, beacuse I didn't think enough of a way to pass all the items and biblionumbers in a way that is safe... --- Koha/Filter/MARC/EmbedItems.pm | 89 ++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 Koha/Filter/MARC/EmbedItems.pm diff --git a/Koha/Filter/MARC/EmbedItems.pm b/Koha/Filter/MARC/EmbedItems.pm new file mode 100644 index 0000000000..f49d74651e --- /dev/null +++ b/Koha/Filter/MARC/EmbedItems.pm @@ -0,0 +1,89 @@ +package Koha::Filter::MARC::EmbedItems; + +# Copyright 2019 Theke Solutions + +# 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 . + +=head1 NAME + +Koha::Filter::MARC::EmbedItems - Appends item information on MARC::Record objects. + +=head1 SYNOPSIS + +my $biblio = Koha::Biblios->find( + $biblio_id, + { prefetch => [ items, metadata ] } +); + +my $opachiddenitems_rules; +eval { + my $yaml = C4::Context->preference('OpacHiddenItems') . "\n\n"; + $opachiddenitems_rules = YAML::Load($yaml); +}; + +my @items = grep { !$_->hidden_in_opac({ rules => $opachiddenitems_rules }) @{$biblio->items}; +my $record = $biblio->metadata->record; + +my $processor = Koha::RecordProcessor->new( + { + filters => ('EmbedItems'), + options => { + items => \@items + } + } +); + +$processor->process( $record ); + +=head1 DESCRIPTION + +Filter to embed items information into MARC::Record objects. + +=cut + +use Modern::Perl; + +use C4::Items qw(Item2Marc); + +use base qw(Koha::RecordProcessor::Base); +our $NAME = 'EmbedItems'; + +=head2 filter + +Embed items into the MARC::Record object. + +=cut + +sub filter { + my $self = shift; + my $record = shift; + + return unless defined $record and ref($record) eq 'MARC::Record'; + + my $items = $self->{options}->{items}; + + my @item_fields; + + foreach my $item ( @{$items} ) { + push @item_fields, $item->as_marc_field; + } + + $record->append_fields(@item_fields); + + return $record; +} + +1; -- 2.23.0