From 235fd637a5e2d925a24d632614506ce18d0fee49 Mon Sep 17 00:00:00 2001 From: Jonathan Druart Date: Thu, 2 Dec 2021 17:27:43 +0100 Subject: [PATCH] Bug 29623: Cache circulation rules Signed-off-by: Nick Clemens Signed-off-by: Martin Renvoize --- C4/Circulation.pm | 10 +++++----- Koha/CirculationRules.pm | 35 +++++++++++++++++++++++++++++++++-- t/db_dependent/Circulation.t | 5 +++++ 3 files changed, 43 insertions(+), 7 deletions(-) diff --git a/C4/Circulation.pm b/C4/Circulation.pm index d92cdcc0b2..8b58a5d3c2 100644 --- a/C4/Circulation.pm +++ b/C4/Circulation.pm @@ -1428,7 +1428,7 @@ sub checkHighHolds { my $orig_due = C4::Circulation::CalcDateDue( $issuedate, $itype, $branchcode, $patron->unblessed ); - my $rule = Koha::CirculationRules->get_effective_rule( + my $rule = Koha::CirculationRules->get_effective_rule_value( { categorycode => $patron->categorycode, itemtype => $item->effective_itemtype, @@ -1438,9 +1438,9 @@ sub checkHighHolds { ); my $duration; - if ( defined($rule) && $rule->rule_value ne '' ){ + if ( defined($rule) && $rule ne '' ){ # overrides decreaseLoanHighHoldsDuration syspref - $duration = $rule->rule_value; + $duration = $rule; } else { $duration = C4::Context->preference('decreaseLoanHighHoldsDuration'); } @@ -1616,7 +1616,7 @@ sub AddIssue { # If automatic renewal wasn't selected while issuing, set the value according to the issuing rule. unless ($auto_renew) { - my $rule = Koha::CirculationRules->get_effective_rule( + my $rule = Koha::CirculationRules->get_effective_rule_value( { categorycode => $borrower->{categorycode}, itemtype => $item_object->effective_itemtype, @@ -1625,7 +1625,7 @@ sub AddIssue { } ); - $auto_renew = $rule->rule_value if $rule; + $auto_renew = $rule if defined $rule && $rule ne ''; } my $issue_attributes = { diff --git a/Koha/CirculationRules.pm b/Koha/CirculationRules.pm index fbfbe2e6ec..b781138fb3 100644 --- a/Koha/CirculationRules.pm +++ b/Koha/CirculationRules.pm @@ -22,6 +22,8 @@ use Carp qw( croak ); use Koha::Exceptions; use Koha::CirculationRule; +use Koha::Caches; +use Koha::Cache::Memory::Lite; use base qw(Koha::Objects); @@ -250,6 +252,28 @@ sub get_effective_rule { return $rule; } +sub get_effective_rule_value { + my ( $self, $params ) = @_; + + my $rule_name = $params->{rule_name}; + my $categorycode = $params->{categorycode}; + my $itemtype = $params->{itemtype}; + my $branchcode = $params->{branchcode}; + + my $memory_cache = Koha::Cache::Memory::Lite->get_instance; + my $cache_key = sprintf "CircRules:%s:%s:%s:%s", $rule_name // q{}, + $categorycode // q{}, $branchcode // q{}, $itemtype // q{}; + + my $cached = $memory_cache->get_from_cache($cache_key); + return $cached if $cached; + + my $rule = $self->get_effective_rule($params); + + my $value= $rule ? $rule->rule_value : undef; + $memory_cache->set_in_cache( $cache_key, $value ); + return $value; +} + =head3 get_effective_rules =cut @@ -264,7 +288,7 @@ sub get_effective_rules { my $r; foreach my $rule (@$rules) { - my $effective_rule = $self->get_effective_rule( + my $effective_rule = $self->get_effective_rule_value( { rule_name => $rule, categorycode => $categorycode, @@ -273,7 +297,7 @@ sub get_effective_rules { } ); - $r->{$rule} = $effective_rule->rule_value if $effective_rule; + $r->{$rule} = $effective_rule if defined $effective_rule; } return $r; @@ -352,6 +376,12 @@ sub set_rule { } } + my $memory_cache = Koha::Cache::Memory::Lite->get_instance; + my $cache_key = sprintf "CircRules:%s:%s:%s:%s", $rule_name // q{}, + $categorycode // q{}, $branchcode // q{}, $itemtype // q{}; + + Koha::Cache::Memory::Lite->flush(); + return $rule; } @@ -380,6 +410,7 @@ sub set_rules { push( @$rule_objects, $rule_object ); } + Koha::Cache::Memory::Lite->flush(); return $rule_objects; } diff --git a/t/db_dependent/Circulation.t b/t/db_dependent/Circulation.t index 1322e54fbb..274ba2d2f8 100755 --- a/t/db_dependent/Circulation.t +++ b/t/db_dependent/Circulation.t @@ -54,6 +54,7 @@ use Koha::Account::Lines; use Koha::Account::Offsets; use Koha::ActionLogs; use Koha::Notice::Messages; +use Koha::Cache::Memory::Lite; sub set_userenv { my ( $library ) = @_; @@ -830,6 +831,7 @@ subtest "CanBookBeRenewed tests" => sub { is( $renewokay, 0, 'Still should not be able to renew' ); is( $error, 'on_reserve', 'returned code is on_reserve, auto_too_soon limit is overridden' ); $dbh->do('UPDATE circulation_rules SET rule_value = 0 where rule_name = "norenewalbefore"'); + Koha::Cache::Memory::Lite->flush(); ( $renewokay, $error ) = CanBookBeRenewed( $renewing_borrowernumber, $item_4->itemnumber, 1 ); is( $renewokay, 0, 'Still should not be able to renew' ); is( $error, 'on_reserve', 'returned code is on_reserve, auto_renew only happens if not on reserve' ); @@ -880,6 +882,7 @@ subtest "CanBookBeRenewed tests" => sub { # Change policy so that loans can only be renewed exactly on due date (0 days prior to due date) # and test automatic renewal again $dbh->do(q{UPDATE circulation_rules SET rule_value = '0' WHERE rule_name = 'norenewalbefore'}); + Koha::Cache::Memory::Lite->flush(); ( $renewokay, $error, $info ) = CanBookBeRenewed( $renewing_borrowernumber, $item_4->itemnumber ); is( $renewokay, 0, 'Bug 14101: Cannot renew, renewal is automatic and premature' ); @@ -898,6 +901,7 @@ subtest "CanBookBeRenewed tests" => sub { # Change policy so that loans can be renewed 99 days prior to the due date # and test automatic renewal again $dbh->do(q{UPDATE circulation_rules SET rule_value = '99' WHERE rule_name = 'norenewalbefore'}); + Koha::Cache::Memory::Lite->flush(); ( $renewokay, $error ) = CanBookBeRenewed( $renewing_borrowernumber, $item_4->itemnumber ); is( $renewokay, 0, 'Bug 14101: Cannot renew, renewal is automatic' ); @@ -1241,6 +1245,7 @@ subtest "CanBookBeRenewed tests" => sub { $dbh->do(q{UPDATE circulation_rules SET rule_value = '10' WHERE rule_name = 'norenewalbefore'}); $dbh->do(q{UPDATE circulation_rules SET rule_value = '15' WHERE rule_name = 'no_auto_renewal_after'}); $dbh->do(q{UPDATE circulation_rules SET rule_value = NULL WHERE rule_name = 'no_auto_renewal_after_hard_limit'}); + Koha::Cache::Memory::Lite->flush(); Koha::CirculationRules->set_rules( { categorycode => undef, -- 2.20.1