Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 36
0.00% covered (danger)
0.00%
0 / 9
CRAP
0.00% covered (danger)
0.00%
0 / 1
SpecialDeadendPages
0.00% covered (danger)
0.00%
0 / 35
0.00% covered (danger)
0.00%
0 / 9
110
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
2
 getPageHeader
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 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
 sortDescending
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getQueryInfo
0.00% covered (danger)
0.00%
0 / 18
0.00% covered (danger)
0.00%
0 / 1
2
 getRecacheDB
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 getOrderFields
0.00% covered (danger)
0.00%
0 / 3
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 * @license GPL-2.0-or-later
4 * @file
5 */
6
7namespace MediaWiki\Specials;
8
9use MediaWiki\Deferred\LinksUpdate\PageLinksTable;
10use MediaWiki\Languages\LanguageConverterFactory;
11use MediaWiki\Page\LinkBatchFactory;
12use MediaWiki\SpecialPage\PageQueryPage;
13use MediaWiki\Title\NamespaceInfo;
14use Wikimedia\Rdbms\IConnectionProvider;
15
16/**
17 * List of pages that contain no links to other pages.
18 *
19 * @ingroup SpecialPage
20 */
21class SpecialDeadendPages extends PageQueryPage {
22
23    private NamespaceInfo $namespaceInfo;
24
25    public function __construct(
26        NamespaceInfo $namespaceInfo,
27        IConnectionProvider $dbProvider,
28        LinkBatchFactory $linkBatchFactory,
29        LanguageConverterFactory $languageConverterFactory
30    ) {
31        parent::__construct( 'Deadendpages' );
32        $this->namespaceInfo = $namespaceInfo;
33        $this->setDatabaseProvider( $dbProvider );
34        $this->setLinkBatchFactory( $linkBatchFactory );
35        $this->setLanguageConverter( $languageConverterFactory->getLanguageConverter( $this->getContentLanguage() ) );
36    }
37
38    /** @inheritDoc */
39    protected function getPageHeader() {
40        return $this->msg( 'deadendpagestext' )->parseAsBlock();
41    }
42
43    /**
44     * LEFT JOIN is expensive
45     *
46     * @return bool
47     */
48    public function isExpensive() {
49        return true;
50    }
51
52    /** @inheritDoc */
53    public function isSyndicated() {
54        return false;
55    }
56
57    /**
58     * @return bool
59     */
60    protected function sortDescending() {
61        return false;
62    }
63
64    /** @inheritDoc */
65    public function getQueryInfo() {
66        return [
67            'tables' => [ 'page', 'pagelinks' ],
68            'fields' => [
69                'namespace' => 'page_namespace',
70                'title' => 'page_title',
71            ],
72            'conds' => [
73                'pl_from' => null,
74                'page_namespace' => $this->namespaceInfo->getContentNamespaces(),
75                'page_is_redirect' => 0
76            ],
77            'join_conds' => [
78                'pagelinks' => [
79                    'LEFT JOIN',
80                    [ 'page_id=pl_from' ]
81                ]
82            ]
83        ];
84    }
85
86    /** @inheritDoc */
87    protected function getRecacheDB() {
88        return $this->getDatabaseProvider()->getReplicaDatabase(
89            PageLinksTable::VIRTUAL_DOMAIN,
90            'vslow'
91        );
92    }
93
94    /** @inheritDoc */
95    protected function getOrderFields() {
96        // For some crazy reason ordering by a constant
97        // causes a filesort
98        if ( count( $this->namespaceInfo->getContentNamespaces() ) > 1 ) {
99            return [ 'page_namespace', 'page_title' ];
100        } else {
101            return [ 'page_title' ];
102        }
103    }
104
105    /** @inheritDoc */
106    protected function getGroupName() {
107        return 'maintenance';
108    }
109}
110
111/** @deprecated class alias since 1.41 */
112class_alias( SpecialDeadendPages::class, 'SpecialDeadendPages' );