From 6b896cecadcb6767e1b25e74f0ae738fff9a07be Mon Sep 17 00:00:00 2001 From: umherirrender Date: Fri, 10 Oct 2014 21:16:29 +0200 Subject: [PATCH] Add LinkBatch to Special:TrackingCategories When building the table, each cat and message link results in a database query. Avoid this by using a LinkBatch Change-Id: If9e39a94c94b0c2e07822a3fa6cce3a22875d7cf --- .../specials/SpecialTrackingCategories.php | 117 +++++++++++------- 1 file changed, 73 insertions(+), 44 deletions(-) diff --git a/includes/specials/SpecialTrackingCategories.php b/includes/specials/SpecialTrackingCategories.php index 552031f1c8..7684c05117 100644 --- a/includes/specials/SpecialTrackingCategories.php +++ b/includes/specials/SpecialTrackingCategories.php @@ -56,6 +56,71 @@ class SpecialTrackingCategories extends SpecialPage { " ); + $trackingCategories = $this->prepareTrackingCategoriesData(); + + $batch = new LinkBatch(); + foreach ( $trackingCategories as $catMsg => $data ) { + $batch->addObj( $data['msg'] ); + foreach ( $data['cats'] as $catTitle ) { + $batch->addObj( $catTitle ); + } + } + $batch->execute(); + + foreach ( $trackingCategories as $catMsg => $data ) { + $allMsgs = array(); + $catDesc = $catMsg . '-desc'; + + $catMsgTitleText = Linker::link( + $data['msg'], + htmlspecialchars( $catMsg ) + ); + + foreach ( $data['cats'] as $catTitle ) { + $catTitleText = Linker::link( + $catTitle, + htmlspecialchars( $catTitle->getText() ) + ); + $allMsgs[] = $catTitleText; + } + + # Extra message, when no category was found + if ( !count( $allMsgs ) ) { + $allMsgs[] = $this->msg( 'trackingcategories-disabled' )->parse(); + } + + /* + * Show category description if it exists as a system message + * as category-name-desc + */ + $descMsg = $this->msg( $catDesc ); + if ( $descMsg->isBlank() ) { + $descMsg = $this->msg( 'trackingcategories-nodesc' ); + } + + $this->getOutput()->addHTML( + Html::openElement( 'tr' ) . + Html::openElement( 'td', array( 'class' => 'mw-trackingcategories-name' ) ) . + $this->getLanguage()->commaList( array_unique( $allMsgs ) ) . + Html::closeElement( 'td' ) . + Html::openElement( 'td', array( 'class' => 'mw-trackingcategories-msg' ) ) . + $catMsgTitleText . + Html::closeElement( 'td' ) . + Html::openElement( 'td', array( 'class' => 'mw-trackingcategories-desc' ) ) . + $descMsg->parse() . + Html::closeElement( 'td' ) . + Html::closeElement( 'tr' ) + ); + } + $this->getOutput()->addHTML( Html::closeElement( 'table' ) ); + } + + /** + * Read the global and extract title objects from the corresponding messages + * @return array Array( 'msg' => Title, 'cats' => Title[] ) + */ + private function prepareTrackingCategoriesData() { + $trackingCategories = array(); foreach ( $this->getConfig()->get( 'TrackingCategories' ) as $catMsg ) { /* * Check if the tracking category varies by namespace @@ -63,16 +128,11 @@ class SpecialTrackingCategories extends SpecialPage { * If it does vary, show pages considering all namespaces */ $msgObj = $this->msg( $catMsg )->inContentLanguage(); - $allMsgs = array(); - $catDesc = $catMsg . '-desc'; + $allCats = array(); $catMsgTitle = Title::makeTitleSafe( NS_MEDIAWIKI, $catMsg ); if ( !$catMsgTitle ) { continue; } - $catMsgTitleText = Linker::link( - $catMsgTitle, - htmlspecialchars( $catMsg ) - ); // Match things like {{NAMESPACE}} and {{NAMESPACENUMBER}}. // False positives are ok, this is just an efficiency shortcut @@ -88,11 +148,7 @@ class SpecialTrackingCategories extends SpecialPage { if ( $catName !== '-' ) { $catTitle = Title::makeTitleSafe( NS_CATEGORY, $catName ); if ( $catTitle ) { - $catTitleText = Linker::link( - $catTitle, - htmlspecialchars( $catName ) - ); - $allMsgs[] = $catTitleText; + $allCats[] = $catTitle; } } } @@ -102,44 +158,17 @@ class SpecialTrackingCategories extends SpecialPage { if ( $catName !== '-' ) { $catTitle = Title::makeTitleSafe( NS_CATEGORY, $catName ); if ( $catTitle ) { - $catTitleText = Linker::link( - $catTitle, - htmlspecialchars( $catName ) - ); - $allMsgs[] = $catTitleText; + $allCats[] = $catTitle; } } } - - # Extra message, when no category was found - if ( !count( $allMsgs ) ) { - $allMsgs[] = $this->msg( 'trackingcategories-disabled' )->parse(); - } - - /* - * Show category description if it exists as a system message - * as category-name-desc - */ - $descMsg = $this->msg( $catDesc ); - if ( $descMsg->isBlank() ) { - $descMsg = $this->msg( 'trackingcategories-nodesc' ); - } - - $this->getOutput()->addHTML( - Html::openElement( 'tr' ) . - Html::openElement( 'td', array( 'class' => 'mw-trackingcategories-name' ) ) . - $this->getLanguage()->commaList( array_unique( $allMsgs ) ) . - Html::closeElement( 'td' ) . - Html::openElement( 'td', array( 'class' => 'mw-trackingcategories-msg' ) ) . - $catMsgTitleText . - Html::closeElement( 'td' ) . - Html::openElement( 'td', array( 'class' => 'mw-trackingcategories-desc' ) ) . - $descMsg->parse() . - Html::closeElement( 'td' ) . - Html::closeElement( 'tr' ) + $trackingCategories[$catMsg] = array( + 'cats' => $allCats, + 'msg' => $catMsgTitle, ); } - $this->getOutput()->addHTML( Html::closeElement( 'table' ) ); + + return $trackingCategories; } protected function getGroupName() { -- 2.20.1