Translate extension for MediaWiki
 
Loading...
Searching...
No Matches
TranslatorActivityQuery.php
1<?php
2declare( strict_types = 1 );
3
4namespace MediaWiki\Extension\Translate\Statistics;
5
6use Config;
7use MediaWiki\User\ActorMigration;
8use Wikimedia\Rdbms\ILoadBalancer;
9
18 public const USER_NAME = 0;
19 public const USER_TRANSLATIONS = 1;
20 public const USER_LAST_ACTIVITY = 2;
21 private Config $options;
22 private ILoadBalancer $loadBalancer;
23
24 public function __construct( Config $options, ILoadBalancer $loadBalancer ) {
25 $this->options = $options;
26 $this->loadBalancer = $loadBalancer;
27 }
28
35 public function inLanguage( string $code ): array {
36 $dbr = $this->loadBalancer->getConnection( DB_REPLICA, 'vslow' );
37
38 $actorQuery = ActorMigration::newMigration()->getJoin( 'rev_user' );
39
40 $res = $dbr->newSelectQueryBuilder()
41 ->select( [
42 'rev_user_text' => $actorQuery['fields']['rev_user_text'],
43 'lastedit' => 'MAX(rev_timestamp)',
44 'count' => 'COUNT(page_id)',
45 ] )
46 ->from( 'page' )
47 ->join( 'revision', null, 'page_id=rev_page' )
48 ->tables( $actorQuery['tables'] )
49 ->where( [
50 'page_title' . $dbr->buildLike( $dbr->anyString(), '/', $code ),
51 'page_namespace' => $this->options->get( 'TranslateMessageNamespaces' ),
52 ] )
53 ->groupBy( $actorQuery['fields']['rev_user_text'] )
54 ->orderBy( 'NULL' )
55 ->joinConds( $actorQuery['joins'] )
56 ->caller( __METHOD__ )
57 ->fetchResultSet();
58
59 $data = [];
60 foreach ( $res as $row ) {
61 // Warning: user names may be numbers that get cast to ints in array keys
62 $data[] = [
63 self::USER_NAME => $row->rev_user_text,
64 self::USER_TRANSLATIONS => (int)$row->count,
65 self::USER_LAST_ACTIVITY => $row->lastedit,
66 ];
67 }
68
69 return $data;
70 }
71
80 public function inAllLanguages(): array {
81 $dbr = $this->loadBalancer->getConnection( DB_REPLICA, 'vslow' );
82
83 $actorQuery = ActorMigration::newMigration()->getJoin( 'rev_user' );
84
85 $res = $dbr->newSelectQueryBuilder()
86 ->select( [
87 'rev_user_text' => $actorQuery['fields']['rev_user_text'],
88 'lang' => 'substring_index(page_title, \'/\', -1)',
89 'lastedit' => 'MAX(rev_timestamp)',
90 'count' => 'COUNT(page_id)',
91 ] )
92 ->from( 'page' )
93 ->join( 'revision', null, 'page_id=rev_page' )
94 ->tables( $actorQuery['tables'] )
95 ->where( [
96 'page_title' . $dbr->buildLike( $dbr->anyString(), '/', $dbr->anyString() ),
97 'page_namespace' => $this->options->get( 'TranslateMessageNamespaces' ),
98 ] )
99 ->groupBy( [ 'lang', $actorQuery['fields']['rev_user_text'] ] )
100 ->orderBy( 'NULL' )
101 ->joinConds( $actorQuery['joins'] )
102 ->caller( __METHOD__ )
103 ->fetchResultSet();
104
105 $data = [];
106 foreach ( $res as $row ) {
107 // Warning: user names may be numbers that get cast to ints in array keys
108 $data[$row->lang][] = [
109 self::USER_NAME => $row->rev_user_text,
110 self::USER_TRANSLATIONS => (int)$row->count,
111 self::USER_LAST_ACTIVITY => $row->lastedit,
112 ];
113 }
114
115 return $data;
116 }
117}
inLanguage(string $code)
Fetch the translators for a language.