X-Git-Url: https://scripts.mit.edu/gitweb/autoinstallsdev/mediawiki.git/blobdiff_plain/19e297c21b10b1b8a3acad5e73fc71dcb35db44a..6932310fd58ebef145fa01eb76edf7150284d8ea:/includes/specials/SpecialShortpages.php diff --git a/includes/specials/SpecialShortpages.php b/includes/specials/SpecialShortpages.php index 989e4c07..e9c15e7b 100644 --- a/includes/specials/SpecialShortpages.php +++ b/includes/specials/SpecialShortpages.php @@ -21,6 +21,9 @@ * @ingroup SpecialPage */ +use Wikimedia\Rdbms\ResultWrapper; +use Wikimedia\Rdbms\IDatabase; + /** * SpecialShortpages extends QueryPage. It is used to return the shortest * pages in the database. @@ -29,95 +32,147 @@ */ class ShortPagesPage extends QueryPage { - function getName() { - return 'Shortpages'; - } - - /** - * This query is indexed as of 1.5 - */ - function isExpensive() { - return true; + function __construct( $name = 'Shortpages' ) { + parent::__construct( $name ); } function isSyndicated() { return false; } - function getSQL() { - global $wgContentNamespaces; + public function getQueryInfo() { + $config = $this->getConfig(); + $blacklist = $config->get( 'ShortPagesNamespaceBlacklist' ); + $tables = [ 'page' ]; + $conds = [ + 'page_namespace' => array_diff( MWNamespace::getContentNamespaces(), $blacklist ), + 'page_is_redirect' => 0 + ]; + $joinConds = []; + $options = [ 'USE INDEX' => [ 'page' => 'page_redirect_namespace_len' ] ]; + + // Allow extensions to modify the query + Hooks::run( 'ShortPagesQuery', [ &$tables, &$conds, &$joinConds, &$options ] ); + + return [ + 'tables' => $tables, + 'fields' => [ + 'namespace' => 'page_namespace', + 'title' => 'page_title', + 'value' => 'page_len' + ], + 'conds' => $conds, + 'join_conds' => $joinConds, + 'options' => $options + ]; + } + + public function reallyDoQuery( $limit, $offset = false ) { + $fname = static::class . '::reallyDoQuery'; + $dbr = $this->getRecacheDB(); + $query = $this->getQueryInfo(); + $order = $this->getOrderFields(); + + if ( $this->sortDescending() ) { + foreach ( $order as &$field ) { + $field .= ' DESC'; + } + } + + $tables = isset( $query['tables'] ) ? (array)$query['tables'] : []; + $fields = isset( $query['fields'] ) ? (array)$query['fields'] : []; + $conds = isset( $query['conds'] ) ? (array)$query['conds'] : []; + $options = isset( $query['options'] ) ? (array)$query['options'] : []; + $join_conds = isset( $query['join_conds'] ) ? (array)$query['join_conds'] : []; + + if ( $limit !== false ) { + $options['LIMIT'] = intval( $limit ); + } - $dbr = wfGetDB( DB_SLAVE ); - $page = $dbr->tableName( 'page' ); - $name = $dbr->addQuotes( $this->getName() ); + if ( $offset !== false ) { + $options['OFFSET'] = intval( $offset ); + } - $forceindex = $dbr->useIndexClause("page_len"); + $namespaces = $conds['page_namespace']; + if ( count( $namespaces ) === 1 ) { + $options['ORDER BY'] = $order; + $res = $dbr->select( $tables, $fields, $conds, $fname, + $options, $join_conds + ); + } else { + unset( $conds['page_namespace'] ); + $options['INNER ORDER BY'] = $order; + $options['ORDER BY'] = [ 'value' . ( $this->sortDescending() ? ' DESC' : '' ) ]; + $sql = $dbr->unionConditionPermutations( + $tables, + $fields, + [ 'page_namespace' => $namespaces ], + $conds, + $fname, + $options, + $join_conds + ); + $res = $dbr->query( $sql, $fname ); + } - if ($wgContentNamespaces) - $nsclause = "page_namespace IN (" . $dbr->makeList($wgContentNamespaces) . ")"; - else - $nsclause = "page_namespace = " . NS_MAIN; + return $res; + } - return - "SELECT $name as type, - page_namespace as namespace, - page_title as title, - page_len AS value - FROM $page $forceindex - WHERE $nsclause AND page_is_redirect=0"; + function getOrderFields() { + return [ 'page_len' ]; } + /** + * @param IDatabase $db + * @param ResultWrapper $res + */ function preprocessResults( $db, $res ) { - # There's no point doing a batch check if we aren't caching results; - # the page must exist for it to have been pulled out of the table - if( $this->isCached() ) { - $batch = new LinkBatch(); - foreach ( $res as $row ) { - $batch->add( $row->namespace, $row->title ); - } - $batch->execute(); - if ( $db->numRows( $res ) > 0 ) { - $db->dataSeek( $res, 0 ); - } - } + $this->executeLBFromResultWrapper( $res ); } function sortDescending() { return false; } + /** + * @param Skin $skin + * @param object $result Result row + * @return string + */ function formatResult( $skin, $result ) { - global $wgLang, $wgContLang; - $dm = $wgContLang->getDirMark(); + $dm = $this->getLanguage()->getDirMark(); $title = Title::makeTitleSafe( $result->namespace, $result->title ); if ( !$title ) { - return ''; + return Html::element( 'span', [ 'class' => 'mw-invalidtitle' ], + Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) ); } - $hlink = $skin->linkKnown( + + $linkRenderer = $this->getLinkRenderer(); + $hlink = $linkRenderer->makeKnownLink( $title, - wfMsgHtml( 'hist' ), - array(), - array( 'action' => 'history' ) + $this->msg( 'hist' )->text(), + [], + [ 'action' => 'history' ] ); - $plink = $this->isCached() - ? $skin->link( $title ) - : $skin->linkKnown( $title ); - $size = wfMessage( 'nbytes', $wgLang->formatNum( $result->value ) )->escaped(); - - return $title->exists() - ? "({$hlink}) {$dm}{$plink} {$dm}[{$size}]" - : "({$hlink}) {$dm}{$plink} {$dm}[{$size}]"; - } -} + $hlinkInParentheses = $this->msg( 'parentheses' )->rawParams( $hlink )->escaped(); + + if ( $this->isCached() ) { + $plink = $linkRenderer->makeLink( $title ); + $exists = $title->exists(); + } else { + $plink = $linkRenderer->makeKnownLink( $title ); + $exists = true; + } -/** - * constructor - */ -function wfSpecialShortpages() { - list( $limit, $offset ) = wfCheckLimits(); + $size = $this->msg( 'nbytes' )->numParams( $result->value )->escaped(); - $spp = new ShortPagesPage(); + return $exists + ? "${hlinkInParentheses} {$dm}{$plink} {$dm}[{$size}]" + : "${hlinkInParentheses} {$dm}{$plink} {$dm}[{$size}]"; + } - return $spp->doQuery( $offset, $limit ); + protected function getGroupName() { + return 'maintenance'; + } }