From 1112a9df59e23f7c26d5da66edd3fda6cffcd082 Mon Sep 17 00:00:00 2001 From: David Gustafsson Date: Thu, 22 Nov 2018 19:01:04 +0100 Subject: [PATCH] Bug 21872: Fix some issues with record_batches.pl Fix behavior for case where no biblios or just one biblio exists. Improve performance by only selecting items greater than last end of range instead of increasing offset by batch size. Also don't use underscore for option names. --- misc/record_batches.pl | 61 ++++++++++++++++++++++++++++---------------------- 1 file changed, 34 insertions(+), 27 deletions(-) mode change 100644 => 100755 misc/record_batches.pl diff --git a/misc/record_batches.pl b/misc/record_batches.pl old mode 100644 new mode 100755 index e003c8ef5c..cbdce81bb6 --- a/misc/record_batches.pl +++ b/misc/record_batches.pl @@ -5,12 +5,12 @@ use C4::Context; use Getopt::Long; use Pod::Usage; -my $gt_biblionumber; +my $start_biblionumber; my $batch_size; my $help; GetOptions( - 'gt_biblionumber=i' => \$gt_biblionumber, - 'batch_size=i' => \$batch_size, + 'startbiblionumber=i' => \$start_biblionumber, + 'batchsize=i' => \$batch_size, 'h|help|?' => \$help ); if ($help) { @@ -18,31 +18,38 @@ if ($help) { } my $dbh = C4::Context->dbh; -my $step = $batch_size || 25000; -my $offset = 0; -my $prev_biblionumber; -my ($max_biblionumber) = @{ $dbh->selectcol_arrayref(qq{SELECT MAX(`biblionumber`) FROM `biblio`}) }; -my @ranges; -my $biblionumber; +$batch_size ||= 25000; # TODO: Assert positive number + +if (!$start_biblionumber) { + my ($min_biblionumber) = @{ $dbh->selectcol_arrayref(qq{SELECT MIN(`biblionumber`) FROM `biblio`}) }; + $start_biblionumber = $min_biblionumber; +} while (1) { - my $query = $gt_biblionumber ? - qq{SELECT `biblionumber` FROM `biblio` WHERE `biblionumber` >= $gt_biblionumber ORDER BY `biblionumber` ASC LIMIT 1 OFFSET $offset} : - qq{SELECT `biblionumber` FROM `biblio` ORDER BY `biblionumber` ASC LIMIT 1 OFFSET $offset}; - my ($biblionumber) = @{ $dbh->selectcol_arrayref($query) }; - if (!$biblionumber) { - push @ranges, [$prev_biblionumber, $max_biblionumber]; + my $offset = $batch_size - 1; + my $query = + qq{SELECT `biblionumber` FROM `biblio` WHERE `biblionumber` >= $start_biblionumber ORDER BY `biblionumber` ASC LIMIT 2 OFFSET $offset}; + my ($end_biblionumber, $next_biblionumber) = @{ $dbh->selectcol_arrayref($query) }; + if (!$end_biblionumber) { + if ($start_biblionumber) { + my ($max_biblionumber) = @{ $dbh->selectcol_arrayref(qq{SELECT MAX(`biblionumber`) FROM `biblio`}) }; + if($max_biblionumber >= $start_biblionumber) { + # @TODO: Option for argument and range separator? + print join(' ', ($start_biblionumber, $max_biblionumber)) . "\n"; + + } + } last; } - elsif ($prev_biblionumber) { - push @ranges, [$prev_biblionumber, $biblionumber - 1]; + else { + print join(' ', ($start_biblionumber, $end_biblionumber)) . "\n"; + } + if ($next_biblionumber) { + $start_biblionumber = $next_biblionumber; + } + else { + last; } - $prev_biblionumber = $biblionumber; - $offset += $step; -} - -foreach my $range (@ranges) { - print join(' ', @{$range}) . "\n"; # @TODO: Option for argument and range separtor? } =head1 NAME @@ -51,7 +58,7 @@ record batches - This script outputs ranges of biblionumbers =head1 SYNOPSIS -record_batches.pl [-h|--help] [--gt_biblionumber=BIBLIONUMBER] +record_batches.pl [-h|--help] [--start_biblionumber=BIBLIONUMBER] =head1 OPTIONS @@ -61,8 +68,8 @@ record_batches.pl [-h|--help] [--gt_biblionumber=BIBLIONUMBER] Print a brief help message. -=item B<--gt_biblionumber> +=item B<--startbiblionumber> - --gt_biblionumber=BIBLIONUMBER Output batches with biblionumber >= BIBLIONUMBER + --startbiblionumber=BIBLIONUMBER Output batches with biblionumber >= BIBLIONUMBER -=item B<--batch_size> +=item B<--batchsize> -- 2.11.0