Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
47.83% covered (danger)
47.83%
22 / 46
33.33% covered (danger)
33.33%
3 / 9
CRAP
0.00% covered (danger)
0.00%
0 / 1
SpecialMostLinked
47.83% covered (danger)
47.83%
22 / 46
33.33% covered (danger)
33.33%
3 / 9
24.20
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 isExpensive
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 isSyndicated
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getQueryInfo
100.00% covered (success)
100.00%
15 / 15
100.00% covered (success)
100.00%
1 / 1
1
 getRecacheDB
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 preprocessResults
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 makeWlhLink
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 formatResult
0.00% covered (danger)
0.00%
0 / 17
0.00% covered (danger)
0.00%
0 / 1
6
 getGroupName
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2/**
3 * Copyright © 2005 Ævar Arnfjörð Bjarmason, 2006 Rob Church
4 *
5 * @license GPL-2.0-or-later
6 * @file
7 */
8
9namespace MediaWiki\Specials;
10
11use MediaWiki\Deferred\LinksUpdate\PageLinksTable;
12use MediaWiki\Html\Html;
13use MediaWiki\Linker\Linker;
14use MediaWiki\Linker\LinksMigration;
15use MediaWiki\Page\LinkBatchFactory;
16use MediaWiki\Skin\Skin;
17use MediaWiki\SpecialPage\QueryPage;
18use MediaWiki\SpecialPage\SpecialPage;
19use MediaWiki\Title\Title;
20use stdClass;
21use Wikimedia\Rdbms\IConnectionProvider;
22use Wikimedia\Rdbms\IReadableDatabase;
23use Wikimedia\Rdbms\IResultWrapper;
24
25/**
26 * List of pages ordered by the number of pages linking to them.
27 *
28 * @ingroup SpecialPage
29 * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
30 * @author Rob Church <robchur@gmail.com>
31 */
32class SpecialMostLinked extends QueryPage {
33
34    public function __construct(
35        IConnectionProvider $dbProvider,
36        LinkBatchFactory $linkBatchFactory,
37        private readonly LinksMigration $linksMigration,
38    ) {
39        parent::__construct( 'Mostlinked' );
40        $this->setDatabaseProvider( $dbProvider );
41        $this->setLinkBatchFactory( $linkBatchFactory );
42    }
43
44    /** @inheritDoc */
45    public function isExpensive() {
46        return true;
47    }
48
49    /** @inheritDoc */
50    public function isSyndicated() {
51        return false;
52    }
53
54    /** @inheritDoc */
55    public function getQueryInfo() {
56        [ $ns, $title ] = $this->linksMigration->getTitleFields( 'pagelinks' );
57        $queryInfo = $this->linksMigration->getQueryInfo( 'pagelinks' );
58        return [
59            'tables' => $queryInfo['tables'],
60            'fields' => [
61                'namespace' => $ns,
62                'title' => $title,
63                'value' => 'COUNT(*)'
64            ],
65            'options' => [
66                'HAVING' => 'COUNT(*) > 1',
67                'GROUP BY' => [ $ns, $title ],
68            ],
69            'join_conds' => $queryInfo['joins'],
70        ];
71    }
72
73    /** @inheritDoc */
74    protected function getRecacheDB() {
75        return $this->getDatabaseProvider()->getReplicaDatabase(
76            PageLinksTable::VIRTUAL_DOMAIN,
77            'vslow'
78        );
79    }
80
81    /**
82     * Pre-fill the link cache
83     *
84     * @param IReadableDatabase $db
85     * @param IResultWrapper $res
86     */
87    public function preprocessResults( $db, $res ) {
88        $this->executeLBFromResultWrapper( $res );
89    }
90
91    /**
92     * Make a link to "what links here" for the specified title
93     *
94     * @param Title $title Title being queried
95     * @param string $caption Text to display on the link
96     * @return string
97     */
98    private function makeWlhLink( $title, $caption ) {
99        $wlh = SpecialPage::getTitleFor( 'Whatlinkshere', $title->getPrefixedDBkey() );
100
101        $linkRenderer = $this->getLinkRenderer();
102        return $linkRenderer->makeKnownLink( $wlh, $caption );
103    }
104
105    /**
106     * Make links to the page corresponding to the item,
107     * and the "what links here" page for it
108     *
109     * @param Skin $skin Skin to be used
110     * @param stdClass $result Result row
111     * @return string
112     */
113    public function formatResult( $skin, $result ) {
114        $title = Title::makeTitleSafe( $result->namespace, $result->title );
115        if ( !$title ) {
116            return Html::element(
117                'span',
118                [ 'class' => 'mw-invalidtitle' ],
119                Linker::getInvalidTitleDescription(
120                    $this->getContext(),
121                    $result->namespace,
122                    $result->title )
123            );
124        }
125
126        $linkRenderer = $this->getLinkRenderer();
127        $link = $linkRenderer->makeLink( $title );
128        $wlh = $this->makeWlhLink(
129            $title,
130            $this->msg( 'nlinks' )->numParams( $result->value )->text()
131        );
132
133        return $this->getLanguage()->specialList( $link, $wlh );
134    }
135
136    /** @inheritDoc */
137    protected function getGroupName() {
138        return 'highuse';
139    }
140}
141
142// @codeCoverageIgnoreStart
143/**
144 * Retain the old class name for backwards compatibility.
145 * @deprecated since 1.41
146 */
147class_alias( SpecialMostLinked::class, 'SpecialMostLinked' );
148// @codeCoverageIgnoreEnd