Bug 13914 : Fix UNION in SQL request for reserves statistics
authorSophie Meynieux <sophie.meynieux@biblibre.com>
Wed, 10 Aug 2016 14:06:35 +0000 (16:06 +0200)
committerKyle M Hall <kyle@bywatersolutions.com>
Tue, 13 Sep 2016 17:12:38 +0000 (17:12 +0000)
Test plan
=========
On Reports > reservations, select all statuses as line, pickup library as column (empty) and a range of hold date. Keep the results
Run the same reports but with statuses as column and pickup library as line
You should get the same results on another display.

* Without patch, if you've got representative data, most of the time you can observe significant differences between both results

* With the patch, results are always the same (and right if you request directly your database)

Signed-off-by: Chris Cormack <chrisc@catalyst.net.nz>
Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
reports/reserves_stats.pl

index 40a231d..a444bc5 100755 (executable)
@@ -221,7 +221,7 @@ sub calculate {
                                ($process == 3) ? "(COUNT(DISTINCT reserves.itemnumber)) calculation"      : 
                                ($process == 4) ? "(COUNT(DISTINCT reserves.biblionumber)) calculation"    : '*';
        $strcalc .= "
-        FROM reserves
+        FROM (select * from reserves union select * from old_reserves) reserves
         LEFT JOIN borrowers USING (borrowernumber)
        ";
        $strcalc .= "LEFT JOIN biblio ON reserves.biblionumber=biblio.biblionumber "
@@ -266,14 +266,11 @@ sub calculate {
        $strcalc .= " WHERE ".join(" AND ",@sqlwhere) if (@sqlwhere);
        $strcalc .= " AND (".join(" OR ",@sqlor).")" if (@sqlor);
        $strcalc .= " GROUP BY line, col )";
-       my $strcalc_old=$strcalc;
-       $strcalc_old=~s/reserves/old_reserves/g;
-       $strcalc.=qq{ UNION $strcalc_old ORDER BY line, col};
        ($debug) and print STDERR $strcalc;
        my $dbcalc = $dbh->prepare($strcalc);
        push @loopfilter, {crit=>'SQL =', sql=>1, filter=>$strcalc};
        @sqlparams=(@sqlparams,@sqlorparams);
-       $dbcalc->execute(@sqlparams,@sqlparams);
+       $dbcalc->execute(@sqlparams);
        my ($emptycol,$emptyrow); 
        my $data = $dbcalc->fetchall_hashref([qw(line col)]);
        my %cols_hash;