Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 35
0.00% covered (danger)
0.00%
0 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
SpecialPagesWithoutScans
0.00% covered (danger)
0.00%
0 / 35
0.00% covered (danger)
0.00%
0 / 5
30
0.00% covered (danger)
0.00%
0 / 1
 __construct
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
 getQueryInfo
0.00% covered (danger)
0.00%
0 / 31
0.00% covered (danger)
0.00%
0 / 1
2
 getGroupName
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace ProofreadPage\Special;
4
5use MediaWiki\SpecialPage\PageQueryPage;
6use ProofreadPage\Context;
7
8/**
9 * @license GPL-2.0-or-later
10 *
11 * Special page that lists the texts that have no transclusions
12 */
13class SpecialPagesWithoutScans extends PageQueryPage {
14
15    /**
16     * @param string $name
17     */
18    public function __construct( $name = 'PagesWithoutScans' ) {
19        parent::__construct( $name );
20    }
21
22    /** @inheritDoc */
23    public function isExpensive() {
24        return true;
25    }
26
27    /** @inheritDoc */
28    public function isSyndicated() {
29        return false;
30    }
31
32    /**
33     * @return mixed[]
34     */
35    public function getQueryInfo() {
36        $context = Context::getDefaultContext();
37        $queryBuilder = $this->getRecacheDB()->newSelectQueryBuilder()
38            ->select( [
39                'namespace' => 'page_namespace',
40                'title' => 'page_title',
41                'value' => 'page_len'
42            ] )
43            ->from( 'page' )
44            ->leftJoin( 'page_props', 'pp_disambig', [
45                'page_id = pp_disambig.pp_page',
46                'pp_disambig.pp_propname' => 'disambiguation'
47            ] )
48            ->leftJoin( 'page_props', 'pp_withoutscans', [
49                'page_id = pp_withoutscans.pp_page',
50                'pp_withoutscans.pp_propname' => 'expectwithoutscans'
51            ] )
52            ->where( [
53                'pp_disambig.pp_page' => null,
54                'pp_withoutscans.pp_page' => null,
55                'page_namespace' => NS_MAIN,
56                'page_is_redirect' => 0,
57                ] );
58        $subQuery = $queryBuilder->newSubquery()
59            ->select( 'page_id' )
60            ->from( 'page' )
61            ->join( 'templatelinks', null, 'page_id = tl_from' )
62            ->join( 'linktarget', null, 'tl_target_id = lt_id' )
63            ->where( [ 'lt_namespace' => $context->getPageNamespaceId(), 'page_namespace' => NS_MAIN,
64                'page_is_redirect' => 0, ] );
65        $queryBuilder->where( 'page_id NOT IN (' . $subQuery->getSQL() . ')' );
66
67        return $queryBuilder->getQueryInfo();
68    }
69
70    /**
71     * @return string
72     */
73    protected function getGroupName() {
74        return 'maintenance';
75    }
76}