2declare( strict_types = 1 );
4namespace MediaWiki\Extension\Translate\MessageGroupProcessing;
7use MediaWiki\Page\PageIdentity;
8use Wikimedia\Rdbms\IConnectionProvider;
31 private IConnectionProvider $connectionProvider;
33 private $tagCache = [];
35 public function __construct( IConnectionProvider $connectionProvider ) {
36 $this->connectionProvider = $connectionProvider;
41 PageIdentity $identity,
46 if ( !$identity->exists() ) {
50 $articleId = $identity->getId();
52 $dbw = $this->connectionProvider->getPrimaryDatabase();
54 'rt_page' => $articleId,
57 $dbw->delete(
'revtag', $conds, __METHOD__ );
59 if ( $value !==
null ) {
60 $conds[
'rt_value'] = serialize( implode(
'|', $value ) );
63 $conds[
'rt_revision'] = $revisionId;
64 $dbw->insert(
'revtag', $conds, __METHOD__ );
66 $this->tagCache[$articleId][$tag] = $revisionId;
69 public function getLatestRevisionWithTag( PageIdentity $identity,
string $tag ): ?int {
70 $response = $this->getLatestRevisionsForTags( $identity, $tag );
71 return $response[$tag] ??
null;
76 if ( !$identity->exists() ) {
80 $articleId = $identity->getId();
86 foreach ( $tags as $tag ) {
87 if ( isset( $this->tagCache[$articleId][$tag] ) ) {
88 $response[$tag] = $this->tagCache[$articleId][$tag];
90 $remainingTags[] = $tag;
94 if ( !$remainingTags ) {
99 $dbr = Utilities::getSafeReadDB();
100 $results = $dbr->newSelectQueryBuilder()
101 ->select( [
'MAX(rt_revision) AS rt_revision',
'rt_type' ] )
104 'rt_page' => $articleId,
105 'rt_type' => $remainingTags
107 ->groupBy(
'rt_type' )
108 ->caller( __METHOD__ )
111 foreach ( $results as $row ) {
112 $response[$row->rt_type] = (int)$row->rt_revision;
118 public function removeTags( PageIdentity $identity,
string ...$tag ): void {
119 if ( !$identity->exists() ) {
123 $articleId = $identity->getId();
125 $dbw = $this->connectionProvider->getPrimaryDatabase();
127 'rt_page' => $articleId,
130 $dbw->delete(
'revtag', $conds, __METHOD__ );
132 unset( $this->tagCache[$articleId] );
139 $tables = [
'revtag',
'page' ];
143 'rt_revision = page_latest',
144 'rt_type' => $revTags,
146 $options = [
'GROUP BY' =>
'rt_page' ];
148 $res = $dbr->select( $tables, $fields, $conds, __METHOD__, $options );
150 foreach ( $res as $row ) {
151 $results[$row->rt_page] =
true;