diff --git a/maintenance/removeOrphanedEvents.php b/maintenance/removeOrphanedEvents.php index dfbf23cc7..2a33f9df3 100644 --- a/maintenance/removeOrphanedEvents.php +++ b/maintenance/removeOrphanedEvents.php @@ -18,7 +18,8 @@ class RemoveOrphanedEvents extends LoggedUpdateMaintenance { public function __construct() { parent::__construct(); - $this->addDescription( "Remove rows from echo_event that don't have corresponding rows in echo_notification or echo_email_batch" ); + $this->addDescription( "Remove rows from echo_event and echo_target_page that don't have corresponding rows in " . + "echo_notification or echo_email_batch" ); $this->setBatchSize( 500 ); @@ -50,19 +51,41 @@ class RemoveOrphanedEvents extends LoggedUpdateMaintenance { $this->output( "Removing orphaned echo_event rows...\n" ); - $processed = 0; + $eventsProcessed = 0; + $targetsProcessed = 0; foreach ( $iterator as $batch ) { $ids = []; foreach ( $batch as $row ) { $ids[] = $row->event_id; } - $dbw->delete( - 'echo_event', - [ 'event_id' => $ids ] + $dbw->delete( 'echo_event', [ 'event_id' => $ids ] ); + $eventsProcessed += $dbw->affectedRows(); + $dbw->delete( 'echo_target_page', [ 'etp_event' => $ids ] ); + $targetsProcessed += $dbw->affectedRows(); + $this->output( "Deleted $eventsProcessed orphaned events and $targetsProcessed target_page rows.\n" ); + $dbFactory->waitForSlaves(); + } - ); + $this->output( "Removing any remaining orphaned echo_target_page rows...\n" ); + $iterator = new BatchRowIterator( + $dbr, + [ 'echo_target_page', 'echo_event' ], + 'etp_event', + $this->mBatchSize + ); + $iterator->addJoinConditions( [ 'echo_event' => [ 'LEFT JOIN', 'event_id=etp_event' ] ] ); + $iterator->addConditions( [ 'event_type' => null ] ); + $iterator->addOptions( [ 'DISTINCT' ] ); + + $processed = 0; + foreach ( $iterator as $batch ) { + $ids = []; + foreach ( $batch as $row ) { + $ids[] = $row->etp_event; + } + $dbw->delete( 'echo_target_page', [ 'etp_event' => $ids ] ); $processed += $dbw->affectedRows(); - $this->output( "Deleted $processed orphaned rows.\n" ); + $this->output( "Deleted $processed orphaned target_page rows.\n" ); $dbFactory->waitForSlaves(); }