1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
<?php
namespace MediaWiki\Deferred\LinksUpdate;
use MediaWiki\DAO\WikiAwareEntity;
use MediaWiki\Page\PageReferenceValue;
use MediaWiki\Parser\ParserOutput;
use MediaWiki\Title\Title;
use PurgeJobUtils;
/**
* imagelinks
*
* Link ID format: string image name
*
* @since 1.38
*/
class ImageLinksTable extends TitleLinksTable {
/**
* @var array New links with the name in the key, value arbitrary
*/
private $newLinks;
/**
* @var array Existing links with the name in the key, value arbitrary
*/
private $existingLinks;
public function setParserOutput( ParserOutput $parserOutput ) {
$this->newLinks = $parserOutput->getImages();
}
protected function getTableName() {
return 'imagelinks';
}
protected function getFromField() {
return 'il_from';
}
protected function getExistingFields() {
return [ 'il_to' ];
}
protected function getNewLinkIDs() {
foreach ( $this->newLinks as $link => $unused ) {
yield (string)$link;
}
}
/**
* Get existing links with the name in the key, value arbitrary.
*
* @return array
*/
private function getExistingLinks() {
if ( $this->existingLinks === null ) {
$this->existingLinks = [];
foreach ( $this->fetchExistingRows() as $row ) {
$this->existingLinks[$row->il_to] = true;
}
}
return $this->existingLinks;
}
protected function getExistingLinkIDs() {
foreach ( $this->getExistingLinks() as $link => $unused ) {
yield (string)$link;
}
}
protected function isExisting( $linkId ) {
return \array_key_exists( $linkId, $this->getExistingLinks() );
}
protected function isInNewSet( $linkId ) {
return \array_key_exists( $linkId, $this->newLinks );
}
protected function needForcedLinkRefresh() {
return $this->isCrossNamespaceMove();
}
protected function insertLink( $linkId ) {
$this->insertRow( [
'il_from_namespace' => $this->getSourcePage()->getNamespace(),
'il_to' => $linkId
] );
}
protected function deleteLink( $linkId ) {
$this->deleteRow( [ 'il_to' => $linkId ] );
}
protected function makePageReferenceValue( $linkId ): PageReferenceValue {
return new PageReferenceValue( NS_FILE, $linkId, WikiAwareEntity::LOCAL );
}
protected function makeTitle( $linkId ): Title {
return Title::makeTitle( NS_FILE, $linkId );
}
protected function deduplicateLinkIds( $linkIds ) {
if ( !is_array( $linkIds ) ) {
$linkIds = iterator_to_array( $linkIds );
}
return array_unique( $linkIds );
}
protected function finishUpdate() {
// A update of namespace on cross namespace move is detected as insert + delete,
// but the updates are not needed there.
$allInsertedLinks = array_column( $this->insertedLinks, 0 );
$allDeletedLinks = array_column( $this->deletedLinks, 0 );
$insertedLinks = array_diff( $allInsertedLinks, $allDeletedLinks );
$deletedLinks = array_diff( $allDeletedLinks, $allInsertedLinks );
$this->invalidateImageDescriptions( $insertedLinks, $deletedLinks );
}
/**
* Invalidate all image description pages which had links added or removed
* @param array $insertedLinks
* @param array $deletedLinks
*/
private function invalidateImageDescriptions( array $insertedLinks, array $deletedLinks ) {
PurgeJobUtils::invalidatePages(
$this->getDB(), NS_FILE,
array_merge( $insertedLinks, $deletedLinks ) );
}
}
|