From b782dbec4750c3827168a5ec983d99375f6361ec Mon Sep 17 00:00:00 2001 From: Kyle M Hall Date: Sat, 7 Nov 2020 07:22:15 -0500 Subject: [PATCH] Bug 26963: Koha::Template::Plugin::Branches::pickup_locations is very inefficient, causing timeouts on records with large numbers of holds/items If a record has a large number of holds ( > 50 I'd say ), and a large number of items, checking the pickup locations takes so long the script often times out. We need to find a way to cache the results so we don't have to spend so much time on expensive lookups. Test Plan: 1) Create a record with 100 items 2) Create 100 holds that are item level 3) You should start to see slow page loads as you create more holds 4) Apply this patch 5) Restart all the things! 6) Note the hold page now loads faster 7) Subsequent loads should be even faster due to the caching mechanism --- Koha/Template/Plugin/Branches.pm | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Koha/Template/Plugin/Branches.pm b/Koha/Template/Plugin/Branches.pm index 05932dac68..186db49959 100644 --- a/Koha/Template/Plugin/Branches.pm +++ b/Koha/Template/Plugin/Branches.pm @@ -99,12 +99,15 @@ sub InIndependentBranchesMode { return ( not C4::Context->preference("IndependentBranches") or C4::Context::IsSuperLibrarian ); } +our $cached_pickup_locations = {}; sub pickup_locations { my ( $self, $params ) = @_; my $search_params = $params->{search_params} || {}; my $selected = $params->{selected}; my @libraries; + my $cache_key; + if(defined $search_params->{item} || defined $search_params->{biblio}) { my $item = $search_params->{'item'}; my $biblio = $search_params->{'biblio'}; @@ -117,12 +120,20 @@ sub pickup_locations { if ($item) { $item = Koha::Items->find($item) unless ref($item) eq 'Koha::Item'; + + $cache_key = "I" . $item->homebranch . "-" . $patron->branchcode; + return $cached_pickup_locations->{$cache_key} if defined $cached_pickup_locations->{$cache_key}; + @libraries = @{ $item->pickup_locations( { patron => $patron } ) } if defined $item; } elsif ($biblio) { $biblio = Koha::Biblios->find($biblio) unless ref($biblio) eq 'Koha::Biblio'; + + $cache_key = "B" . $biblio->id . "-" . $patron->branchcode; + return $cached_pickup_locations->{$cache_key} if defined $cached_pickup_locations->{$cache_key}; + @libraries = @{ $biblio->pickup_locations( { patron => $patron } ) } if defined $biblio; } @@ -144,6 +155,7 @@ sub pickup_locations { } } + $cached_pickup_locations->{$cache_key} = \@libraries; return \@libraries; } -- 2.24.1 (Apple Git-126)