Bug 25265: Prevent double reindex of the same item in batchmod
[srvgit] / tools / batchMod.pl
index 39df0f8..1d076c2 100755 (executable)
@@ -44,6 +44,7 @@ use Koha::DateUtils;
 use Koha::Items;
 use Koha::ItemTypes;
 use Koha::Patrons;
+use Koha::SearchEngine::Indexer;
 
 my $input = new CGI;
 my $dbh = C4::Context->dbh;
@@ -192,6 +193,8 @@ if ($op eq "action") {
             $ynhash->{'av'.$yn->authorised_value} = $yn->lib;
         }
 
+        my $upd_biblionumbers;
+        my $del_biblionumbers;
         try {
             my $schema = Koha::Database->new->schema;
             $schema->txn_do(
@@ -210,6 +213,7 @@ if ($op eq "action") {
                             my $return = $item->safe_delete;
                             if ( ref( $return ) ) {
                                 $deleted_items++;
+                                push @$upd_biblionumbers, $itemdata->{'biblionumber'};
                             }
                             else {
                                 $not_deleted_items++;
@@ -227,9 +231,10 @@ if ($op eq "action") {
                             if ($del_records) {
                                 my $itemscount = Koha::Biblios->find( $itemdata->{'biblionumber'} )->items->count;
                                 if ( $itemscount == 0 ) {
-                                    my $error = DelBiblio( $itemdata->{'biblionumber'} );
+                                    my $error = DelBiblio( $itemdata->{'biblionumber'}, { skip_record_index => 1 } );
                                     unless ($error) {
                                         $deleted_records++;
+                                        push @$del_biblionumbers, $itemdata->{'biblionumber'};
                                         if ( $src eq 'CATALOGUING' ) {
                                             # We are coming catalogue/detail.pl, there were items from a single bib record
                                             $template->param( biblio_deleted => 1 );
@@ -298,15 +303,21 @@ if ($op eq "action") {
                                             my $item = ModItemFromMarc(
                                                 $localmarcitem,
                                                 $itemdata->{biblionumber},
-                                                $itemnumber
+                                                $itemnumber,
+                                                { skip_modzebra_update => 1 },
                                             )
                                           )
                                         {
-                                            LostItem( $itemnumber, 'batchmod' )
-                                              if $item->{itemlost}
+                                            LostItem(
+                                                $itemnumber,
+                                                'batchmod',
+                                                undef,
+                                                { skip_modzebra_update => 1 }
+                                            ) if $item->{itemlost}
                                               and not $itemdata->{itemlost};
                                         }
                                     };
+                                    push @$upd_biblionumbers, $itemdata->{'biblionumber'};
                                 }
                             }
                             if ($runinbackground) {
@@ -336,7 +347,16 @@ if ($op eq "action") {
             }
             die "Something terrible has happened!"
                 if ($_ =~ /Rollback failed/); # Rollback failed
-        }
+        };
+        $upd_biblionumbers = [ uniq @$upd_biblionumbers ]; # Only update each bib once
+
+        # Don't send specialUpdate for records we are going to delete
+        my %del_bib_hash = map{ $_ => undef } @$del_biblionumbers;
+        @$upd_biblionumbers = grep( ! exists( $del_bib_hash{$_} ), @$upd_biblionumbers );
+
+        my $indexer = Koha::SearchEngine::Indexer->new({ index => $Koha::SearchEngine::BIBLIOS_INDEX });
+        $indexer->index_records( $upd_biblionumbers, 'specialUpdate', "biblioserver", undef ) if @$upd_biblionumbers;
+        $indexer->index_records( $del_biblionumbers, 'recordDelete', "biblioserver", undef ) if @$del_biblionumbers;
     }
 }
 #