Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 51
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
CleanupTranslationProgressStatsMaintenanceScript
0.00% covered (danger)
0.00%
0 / 51
0.00% covered (danger)
0.00%
0 / 2
42
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 execute
0.00% covered (danger)
0.00%
0 / 48
0.00% covered (danger)
0.00%
0 / 1
30
1<?php
2declare( strict_types = 1 );
3
4namespace MediaWiki\Extension\Translate\Statistics;
5
6use Maintenance;
7use MediaWiki\Extension\Translate\MessageGroupProcessing\MessageGroups;
8use MediaWiki\Extension\Translate\Utilities\Utilities;
9use MediaWiki\Language\RawMessage;
10use MediaWiki\MediaWikiServices;
11use MessageGroupStats;
12use const DB_PRIMARY;
13
14/**
15 * @since 2021.03
16 * @license GPL-2.0-or-later
17 * @author Niklas Laxström
18 */
19class CleanupTranslationProgressStatsMaintenanceScript extends Maintenance {
20    public function __construct() {
21        parent::__construct();
22        $this->addDescription( 'Remove obsolete entries from translate_groupstats table' );
23        $this->requireExtension( 'Translate' );
24    }
25
26    public function execute() {
27        $services = MediaWikiServices::getInstance();
28        $db = $services->getDBLoadBalancer()->getConnection( DB_PRIMARY );
29
30        $dbGroupIds = $db->newSelectQueryBuilder()
31            ->select( 'tgs_group' )
32            ->distinct()
33            ->from( 'translate_groupstats' )
34            ->caller( __METHOD__ )
35            ->fetchFieldValues();
36        $knownGroupIds = array_map(
37            [ MessageGroupStats::class, 'getDatabaseIdForGroupId' ],
38            array_keys( MessageGroups::singleton()->getGroups() )
39        );
40        $unknownGroupIds = array_diff( $dbGroupIds, $knownGroupIds );
41
42        if ( $unknownGroupIds !== [] ) {
43            $msg = ( new RawMessage( "Removing rows for $1 unknown group{{PLURAL:$1||s}}:\n" ) )
44                ->numParams( count( $unknownGroupIds ) )
45                ->inLanguage( 'en' )
46                ->text();
47            $this->output( $msg );
48            foreach ( $unknownGroupIds as $id ) {
49                $this->output( "$id\n" );
50            }
51            $db->delete(
52                'translate_groupstats',
53                [ 'tgs_group' => $unknownGroupIds ],
54                __METHOD__
55            );
56        }
57
58        $dbLanguages = $db->newSelectQueryBuilder()
59            ->select( 'tgs_lang' )
60            ->distinct()
61            ->from( 'translate_groupstats' )
62            ->caller( __METHOD__ )
63            ->fetchFieldValues();
64        $knownLanguages = array_keys( Utilities::getLanguageNames( 'en' ) );
65        $unknownLanguages = array_diff( $dbLanguages, $knownLanguages );
66
67        if ( $unknownLanguages !== [] ) {
68            $msg = ( new RawMessage( "Removing rows for $1 unknown language{{PLURAL:$1||s}}:\n" ) )
69                ->numParams( count( $unknownLanguages ) )
70                ->inLanguage( 'en' )
71                ->text();
72            $this->output( $msg );
73            foreach ( $unknownLanguages as $languageCode ) {
74                $this->output( "$languageCode\n" );
75            }
76            $db->delete(
77                'translate_groupstats',
78                [ 'tgs_lang' => $unknownLanguages ],
79                __METHOD__
80            );
81        }
82
83        $this->output( "Done.\n" );
84    }
85}