Koha/installer/data/mysql/backfill_statistics.pl
Jonathan Druart 31c29fd31f Bug 21206: Replace C4::Items::GetItem
Note: This is here for information purpose, feel free to test it if you
wan to play with it.

TODO: C4::Reserves::_get_itype is not longer in use

No more GetItem must be returned by:
git grep GetItem|grep -v GetItemsAvailableToFillHoldRequestsForBib|grep
-v GetItemsForInventory|grep -v GetItemsInfo|grep -v
GetItemsLocationInfo|grep -v GetItemsInCollection|grep -v
GetItemCourseReservesInfo|grep -v GetItemnumbersFromOrder|grep -v
GetItemSearchField|grep -v GetItemTypesCategorized|grep -v
GetItemNumbersFromImportBatch|cut -d':' -f1|sort|uniq

Signed-off-by: Josef Moravec <josef.moravec@gmail.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>

Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>

Signed-off-by: Nick Clemens <nick@bywatersolutions.com>
2019-02-26 13:24:07 +00:00

117 lines
4 KiB
Perl
Executable file

#!/usr/bin/perl
# Part of the Koha Library Software www.koha-community.org
# Licensed under the GPL.
use Modern::Perl;
# CPAN modules
use DBI;
use Getopt::Long;
# Koha modules
use C4::Context;
use C4::Items;
use C4::Debug;
use Data::Dumper;
use vars qw($debug $dbh);
$dbh = C4::Context->dbh;
sub get_counts() {
my $query = q(
SELECT
(SELECT count(*) FROM statistics WHERE branch="NO_LIBRARY" ) AS NO_LIBRARY,
(SELECT count(*) FROM statistics WHERE branch IS NULL) AS NULL_BRANCH,
(SELECT count(*) FROM statistics WHERE itemtype IS NULL AND itemnumber IS NOT NULL) AS NULL_ITEMTYPE,
(SELECT count(*) FROM statistics WHERE usercode IS NULL) AS NULL_USERCODE,
(SELECT count(*) FROM statistics WHERE borrowernumber IS NULL) AS NULL_BORROWERNUMBER,
(SELECT count(*) FROM statistics WHERE associatedborrower IS NULL) AS NULL_ASSOCIATEDBORROWER,
(SELECT count(*) FROM statistics ) AS Total
);
my $sth = $dbh->prepare($query);
$sth->execute;
return $sth->fetchrow_hashref;
}
sub itemnumber_array() {
my $query = q(
SELECT DISTINCT itemnumber
FROM statistics
WHERE itemtype IS NULL
AND itemnumber IS NOT NULL
);
my $sth = $dbh->prepare($query);
$sth->execute;
my @itemnumbers = map {shift @$_} @{$sth->fetchall_arrayref};
return @itemnumbers;
}
sub null_borrower_lines() {
my $query = "SELECT * FROM statistics WHERE borrowernumber IS NULL";
my $sth = $dbh->prepare($query);
$sth->execute;
print "Number of lines with NULL_BORROWERNUMBER: ", scalar($sth->rows), "\n";
return $sth->fetchall_arrayref({});
}
sub show_counts() {
print "\nThe following counts represent the number of (potential) errors in your statistics table:\n";
my $counts = get_counts;
foreach (sort keys %$counts) {
$_ eq 'Total' and next;
$counts->{Error_Total} += $counts->{$_};
print sprintf("%30s : %3d \n",$_ ,$counts->{$_});
}
print sprintf("%30s : %3d (potential) errors in %d lines\n",'Error_Total',$counts->{Error_Total}, $counts->{'Total'});
}
##### MAIN #####
print "This operation may take a while.\n";
(scalar @ARGV) or show_counts;
print "\nAttempting to populate missing data.\n";
my (@itemnumbers) = (scalar @ARGV) ? @ARGV : &itemnumber_array;
$debug and print "itemnumbers: ", Dumper(\@itemnumbers);
print "Number of distinct itemnumbers paired with NULL_ITEMTYPE: ", scalar(@itemnumbers), "\n";
my $query = "UPDATE statistics SET itemtype = ? WHERE itemnumber = ?";
my $update = $dbh->prepare($query);
# $debug and print "Update Query: $query\n";
foreach (@itemnumbers) {
my $item = Koha::Items->find($_);
unless ($item) {
print STDERR "\tNo item found for itemnumber $_\n";
next;
}
my $itemtype = $item->effective_itemtype;
$update->execute($itemtype,$_) or warn "Error in UPDATE execution";
printf "\titemnumber %5d : %7s (%s rows)\n", $_, $itemtype, $update->rows;
}
my $old_issues = $dbh->prepare("SELECT * FROM old_issues WHERE timestamp = ? AND itemnumber = ?");
my $issues = $dbh->prepare("SELECT * FROM issues WHERE timestamp = ? AND itemnumber = ?");
$update = $dbh->prepare("UPDATE statistics SET borrowernumber = ? WHERE datetime = ? AND itemnumber = ?");
my $nullborrs = null_borrower_lines;
$debug and print Dumper($nullborrs);
foreach (@$nullborrs) {
$old_issues->execute($_->{datetime},$_->{itemnumber});
my $issue;
if ($old_issues->rows != 1) {
print STDERR "Warning! Unexpected number of matches from old_issues: ",$old_issues->rows;
$issues->execute($_->{datetime},$_->{itemnumber});
if ($issues->rows != 1) {
print STDERR ", from issues: ",$issues->rows,"\tskipping this record\n";
next;
}
print STDERR "\n";
$issue = $issues->fetchrow_hashref;
} else {
$issue = $old_issues->fetchrow_hashref;
}
printf "\titemnumber: %5d at %20s -- borrowernumber: %5d\n", $_->{itemnumber}, $_->{datetime}, $issue->{borrowernumber};
$update->execute($issue->{borrowernumber},$_->{datetime},$_->{itemnumber});
}
print "\nOperations complete.\n";
(scalar @ARGV) or show_counts;