Koha/Koha/AuthorisedValues.pm
David Cook 78c0e8df8d
Bug 35579: Cache authorised value lookup by MARC field
This patch adds a "get_descriptions_by_marc_field" method
which caches AuthorisedValue descriptions when searched by
MARC field, which is used when exporting MARC to CSV.

Test plan:
0. Do not apply the patch yet!
1. Go to http://localhost:8081/cgi-bin/koha/tools/csv-profiles.pl
2. Add a CSV profile with the default values and using the following for the "Profile MARC fields":
000|001|003|005|006|007|008|010|015|016|020|022|040|050|082|100|110|111|130|240|243|245|246|247|250|260|300|336|337|338|440|490|500|501|505|520|530|600|610|611|630|648|650|651|690|700|710|711|856|887|942|995|952|952$c
3. Create a new List
4. Add all the database's bibs to that list using SQL like the following (where the shelfnumber equals the number for your list):
insert into virtualshelfcontents (shelfnumber,biblionumber,borrowernumber) select 1,biblionumber,51 from biblio;
5. Go to that list in the staff interface
6. Download that list using your CSV profile
7. Apply the patch
8. koha-plack --reload kohadev
9. Download that list using your CSV profile
10. Note that the output is the same, but that the output completes much more quickly after applying the patch

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Julian Maurice <julian.maurice@biblibre.com>
Signed-off-by: Katrin Fischer <katrin.fischer@bsz-bw.de>
2023-12-28 12:16:09 +01:00

207 lines
6 KiB
Perl

package Koha::AuthorisedValues;
# Copyright ByWater Solutions 2014
#
# 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 Koha::Database;
use Koha::AuthorisedValue;
use Koha::MarcSubfieldStructures;
use Koha::Cache::Memory::Lite;
use base qw(Koha::Objects Koha::Objects::Limit::Library);
=head1 NAME
Koha::AuthorisedValues - Koha Authorised value Object set class
=head1 API
=head2 Class Methods
=cut
sub search_by_marc_field {
my ( $self, $params ) = @_;
my $frameworkcode = $params->{frameworkcode} || '';
my $tagfield = $params->{tagfield};
my $tagsubfield = $params->{tagsubfield};
return unless $tagfield or $tagsubfield;
return $self->SUPER::search(
{ 'marc_subfield_structures.frameworkcode' => $frameworkcode,
( defined $tagfield ? ( 'marc_subfield_structures.tagfield' => $tagfield ) : () ),
( defined $tagsubfield ? ( 'marc_subfield_structures.tagsubfield' => $tagsubfield ) : () ),
},
{
join => { category => 'marc_subfield_structures' },
order_by => [ 'category', 'lib', 'lib_opac' ],
}
);
}
sub search_by_koha_field {
my ( $self, $params ) = @_;
my $frameworkcode = $params->{frameworkcode} || '';
my $kohafield = $params->{kohafield};
my $category = $params->{category};
return unless $kohafield;
return $self->SUPER::search(
{ 'marc_subfield_structures.frameworkcode' => $frameworkcode,
'marc_subfield_structures.kohafield' => $kohafield,
( defined $category ? ( category_name => $category ) : () ),
},
{ join => { category => 'marc_subfield_structures' },
distinct => 1,
order_by => [ 'category', 'lib', 'lib_opac' ],
}
);
}
sub find_by_koha_field {
my ( $self, $params ) = @_;
my $frameworkcode = $params->{frameworkcode} || '';
my $kohafield = $params->{kohafield};
my $authorised_value = $params->{authorised_value};
my $av = $self->SUPER::search(
{ 'marc_subfield_structures.frameworkcode' => $frameworkcode,
'marc_subfield_structures.kohafield' => $kohafield,
'me.authorised_value' => $authorised_value,
},
{ join => { category => 'marc_subfield_structures' },
distinct => 1,
}
);
return $av->count ? $av->next : undef;
}
sub get_description_by_koha_field {
my ( $self, $params ) = @_;
my $frameworkcode = $params->{frameworkcode} || '';
my $kohafield = $params->{kohafield};
my $authorised_value = $params->{authorised_value};
return {} unless defined $authorised_value;
my $memory_cache = Koha::Cache::Memory::Lite->get_instance;
my $cache_key = "AV_descriptions:$frameworkcode:$kohafield:$authorised_value";
my $cached = $memory_cache->get_from_cache($cache_key);
return $cached if $cached;
my $av = $self->find_by_koha_field($params);
if ( ! defined $av ){
$memory_cache->set_in_cache( $cache_key, {} );
return {};
}
my $descriptions = { lib => $av->lib, opac_description => $av->opac_description };
$memory_cache->set_in_cache( $cache_key, $descriptions );
return $descriptions;
}
sub get_descriptions_by_koha_field {
my ( $self, $params ) = @_;
my $frameworkcode = $params->{frameworkcode} || '';
my $kohafield = $params->{kohafield};
my $memory_cache = Koha::Cache::Memory::Lite->get_instance;
my $cache_key = "AV_descriptions:$frameworkcode:$kohafield";
my $cached = $memory_cache->get_from_cache($cache_key);
return @$cached if $cached;
my @avs = $self->search_by_koha_field($params)->as_list;
my @descriptions = map {
{
authorised_value => $_->authorised_value,
lib => $_->lib,
opac_description => $_->opac_description
}
} @avs;
$memory_cache->set_in_cache( $cache_key, \@descriptions );
return @descriptions;
}
=head3 get_descriptions_by_marc_field
Return cached descriptions when looking up by MARC field/subfield
=cut
sub get_descriptions_by_marc_field {
my ( $self, $params ) = @_;
my $frameworkcode = $params->{frameworkcode} || '';
my $tagfield = $params->{tagfield};
my $tagsubfield = $params->{tagsubfield};
return {} unless defined $params->{tagfield};
my $memory_cache = Koha::Cache::Memory::Lite->get_instance;
my $cache_key = "AV_descriptions_by_MARC:$frameworkcode:$tagfield";
if ($tagsubfield) {
$cache_key .= ":$tagsubfield";
}
my $cached = $memory_cache->get_from_cache($cache_key);
return $cached if $cached;
my $descriptions = {};
my @avs = $self->search_by_marc_field($params)->as_list;
foreach my $av (@avs) {
$descriptions->{ $av->authorised_value } = $av->lib;
}
$memory_cache->set_in_cache( $cache_key, $descriptions );
return $descriptions;
}
sub categories {
my ( $self ) = @_;
my $rs = $self->_resultset->search(
undef,
{
select => ['category'],
distinct => 1,
order_by => 'category',
},
);
return map $_->get_column('category'), $rs->all;
}
=head3 type
=cut
sub _type {
return 'AuthorisedValue';
}
sub object_class {
return 'Koha::AuthorisedValue';
}
=head1 AUTHOR
Kyle M Hall <kyle@bywatersolutions.com>
=cut
1;