[Koha-bugs] [Bug 9011] Add the ability to store the last patron to return an item

bugzilla-daemon at bugs.koha-community.org bugzilla-daemon at bugs.koha-community.org
Mon Jun 29 17:09:54 CEST 2015


http://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=9011

Kyle M Hall <kyle at bywatersolutions.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|Failed QA                   |Signed Off

--- Comment #115 from Kyle M Hall <kyle at bywatersolutions.com> ---
(In reply to Jonathan Druart from comment #114)
> Comment on attachment 39815 [details] [review]
> Bug 9011 [QA Followup]
> 
> Review of attachment 39815 [details] [review]:
> -----------------------------------------------------------------
> 
> ::: C4/Circulation.pm
> @@ +3198,5 @@
> >      }
> >  
> >      if ( C4::Context->preference('StoreLastBorrower') ) {
> > +        # Do not delete the newest old_issue for any itemnumber
> > +        $query .= " AND issue_id NOT IN ( SELECT issue_id FROM ( SELECT * FROM old_issues ORDER BY issue_id DESC ) AS oi GROUP BY itemnumber ) ";
> 
> I think that the NOT IN clause should be avoid here.
> It can cause the query to be very slow.
> See bug 13740.

As far as I can tell there is no way around this. I tried to use a left join
but you cannot use a group by in an update statement.

Here is my proof of concept diff that doesn't work, for posterity:

diff --git a/C4/Circulation.pm b/C4/Circulation.pm
index b174a12..bc3e28e 100644
--- a/C4/Circulation.pm
+++ b/C4/Circulation.pm
@@ -3183,11 +3183,15 @@ sub AnonymiseIssueHistory {
     my $date           = shift;
     my $borrowernumber = shift;
     my $dbh            = C4::Context->dbh;
-    my $query          = "
-        UPDATE old_issues
-        SET    borrowernumber = ?
-        WHERE  returndate < ?
-          AND borrowernumber IS NOT NULL
+
+    my $StoreLastBorrower = C4::Context->preference('StoreLastBorrower');
+
+    my $query = "UPDATE old_issues";
+    $query .= " LEFT JOIN old_issues last_checkout_for_item USING ( itemnumber
)" if $StoreLastBorrower;
+    $query .= "
+        SET    old_issues.borrowernumber = ?
+        WHERE  old_issues.returndate < ?
+          AND  old_issues.borrowernumber IS NOT NULL
     ";

     # The default of 0 does not work due to foreign key constraints
@@ -3196,16 +3200,18 @@ sub AnonymiseIssueHistory {
     my @bind_params = ($anonymouspatron, $date);

     if (defined $borrowernumber) {
-       $query .= " AND borrowernumber = ?";
+       $query .= " AND old_issues.borrowernumber = ?";
        push @bind_params, $borrowernumber;
     } else {
        $query .= " AND (SELECT privacy FROM borrowers WHERE
borrowers.borrowernumber=old_issues.borrowernumber) <> 0";
     }

-    if ( C4::Context->preference('StoreLastBorrower') ) {
-        # Do not delete the newest old_issue for any itemnumber
-        $query .= " AND issue_id NOT IN ( SELECT issue_id FROM ( SELECT * FROM
old_issues ORDER BY issue_id DESC ) AS oi GROUP BY itemnumber ) ";
-    }
+    # Do not delete the newest old_issue for any itemnumber
+    $query .= "
+        AND old_issues.issue_id <> last_checkout_for_item.issue_id
+        GROUP BY last_checkout_for_item.itemnumber
+        ORDER BY last_checkout_for_item.issue_id DESC
+    " if $StoreLastBorrower;

     my $sth = $dbh->prepare($query);
     $sth->execute(@bind_params);

-- 
You are receiving this mail because:
You are watching all bug changes.


More information about the Koha-bugs mailing list