foreach ( $catBatches as $catBatch ) {
$this->page->updateCategoryCounts( [], $catBatch, $id );
if ( count( $catBatches ) > 1 ) {
+ // Only sacrifice atomicity if necessary due to size
$lbFactory->commitAndWaitForReplication(
__METHOD__, $this->ticket, [ 'domain' => $dbw->getDomainID() ]
);
// Refresh counts on categories that should be empty now
if ( $title->getNamespace() === NS_CATEGORY ) {
- $row = $dbw->selectRow(
- 'category',
- [ 'cat_id', 'cat_title', 'cat_pages', 'cat_subcats', 'cat_files' ],
- [ 'cat_title' => $title->getDBkey(), 'cat_pages <= 100' ],
- __METHOD__
- );
- if ( $row ) {
- $cat = Category::newFromRow( $row, $title );
- // T166757: do the update after the main job DB commit
- DeferredUpdates::addCallableUpdate( function () use ( $cat ) {
- $cat->refreshCounts();
- } );
- }
+ // T166757: do the update after the main job DB commit
+ DeferredUpdates::addCallableUpdate( function () use ( $title ) {
+ $this->refreshCategoryIfEmpty( $title );
+ } );
}
$this->batchDeleteByPK(
ScopedCallback::consume( $scopedLock );
}
+ /**
+ * @param Title $title
+ */
+ private function refreshCategoryIfEmpty( Title $title ) {
+ $dbw = $this->getDB();
+
+ $row = $dbw->selectRow(
+ 'category',
+ [ 'cat_id', 'cat_title', 'cat_pages', 'cat_subcats', 'cat_files' ],
+ [ 'cat_title' => $title->getDBkey(), 'cat_pages <= 100' ],
+ __METHOD__
+ );
+
+ if ( !$row ) {
+ return; // nothing to delete
+ }
+
+ $cat = Category::newFromRow( $row, $title );
+ $hasLink = $dbw->selectField(
+ 'categorylinks',
+ '1',
+ [ 'cl_to' => $title->getDBkey() ],
+ __METHOD__
+ );
+ if ( !$hasLink ) {
+ $cat->refreshCounts(); // delete the category table entry
+ }
+ }
+
private function batchDeleteByPK( $table, array $conds, array $pk, $bSize ) {
$services = MediaWikiServices::getInstance();
$lbFactory = $services->getDBLoadBalancerFactory();