wiki.techinc.nl/includes/linker/LinksMigration.php
Umherirrender 6eec17e9a9 Add missing documentation to class properties (miscellaneous classes)
Add doc-typehints to class properties found by the PropertyDocumentation
sniff to improve the documentation.

Once the sniff is enabled it avoids that new code is missing type
declarations. This is focused on documentation and does not change code.

Change-Id: I1da4b272a6b28c419cc8e860d142dae19ca0bbcf
2024-09-14 10:12:18 +02:00

181 lines
4.8 KiB
PHP

<?php
/**
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
* @file
*/
namespace MediaWiki\Linker;
use InvalidArgumentException;
use MediaWiki\Config\Config;
use MediaWiki\MainConfigNames;
/**
* Service for compat reading of links tables
*
* @since 1.39
*/
class LinksMigration {
/** @var Config */
private $config;
/** @var LinkTargetLookup */
private $linkTargetLookup;
/** @var array[] */
public static $mapping = [
'templatelinks' => [
'config' => -1,
'page_id' => 'tl_from',
// Used by the updater only
'ns' => 'tl_namespace',
// Used by the updater only
'title' => 'tl_title',
'target_id' => 'tl_target_id',
'deprecated_configs' => [],
],
'pagelinks' => [
'config' => MainConfigNames::PageLinksSchemaMigrationStage,
'page_id' => 'pl_from',
'ns' => 'pl_namespace',
'title' => 'pl_title',
'target_id' => 'pl_target_id',
'deprecated_configs' => [
SCHEMA_COMPAT_WRITE_OLD,
SCHEMA_COMPAT_READ_OLD
],
],
];
/** @var string[] */
public static $prefixToTableMapping = [
'tl' => 'templatelinks',
'pl' => 'pagelinks',
];
/**
* @param Config $config
* @param LinkTargetLookup $linktargetLookup
*/
public function __construct( Config $config, LinkTargetLookup $linktargetLookup ) {
$this->config = $config;
$this->linkTargetLookup = $linktargetLookup;
}
/**
* Return the conditions to be used in querying backlinks to a page
*
* @param string $table
* @param LinkTarget $linkTarget
* @return array
*/
public function getLinksConditions( string $table, LinkTarget $linkTarget ): array {
$this->assertMapping( $table );
if ( $this->isMigrationReadNew( $table ) ) {
$targetId = $this->linkTargetLookup->getLinkTargetId( $linkTarget );
// Not found, it shouldn't pick anything
if ( !$targetId ) {
return [ '1=0' ];
}
return [
self::$mapping[$table]['target_id'] => $targetId,
];
} else {
return [
self::$mapping[$table]['ns'] => $linkTarget->getNamespace(),
self::$mapping[$table]['title'] => $linkTarget->getDBkey(),
];
}
}
/**
* Return the query to be used when you want to or from a group of pages
*
* @param string $table
* @param string $joinTable table to end the join chain. Most of the time it's linktarget
* @param string $joinType
* @return array
*/
public function getQueryInfo( string $table, string $joinTable = 'linktarget', string $joinType = 'JOIN' ) {
$this->assertMapping( $table );
if ( $this->isMigrationReadNew( $table ) ) {
$targetId = self::$mapping[$table]['target_id'];
if ( $joinTable === 'linktarget' ) {
$tables = [ $table, 'linktarget' ];
} else {
$tables = [ 'linktarget', $table ];
}
return [
'tables' => $tables,
'fields' => [
$targetId,
'lt_namespace',
'lt_title'
],
'joins' => [ $joinTable => [
$joinType,
[ "$targetId=lt_id" ]
] ],
];
} else {
return [
'fields' => [
self::$mapping[$table]['ns'],
self::$mapping[$table]['title']
],
'tables' => [ $table ],
'joins' => [],
];
}
}
public function getTitleFields( $table ) {
$this->assertMapping( $table );
if ( $this->isMigrationReadNew( $table ) ) {
return [ 'lt_namespace', 'lt_title' ];
} else {
return [ self::$mapping[$table]['ns'], self::$mapping[$table]['title'] ];
}
}
private function isMigrationReadNew( string $table ): bool {
return self::$mapping[$table]['config'] === -1 ||
$this->config->get( self::$mapping[$table]['config'] ) & SCHEMA_COMPAT_READ_NEW;
}
private function assertMapping( string $table ) {
if ( !isset( self::$mapping[$table] ) ) {
throw new InvalidArgumentException(
"LinksMigration doesn't support the $table table yet"
);
}
if ( self::$mapping[$table]['config'] !== -1 && self::$mapping[$table]['deprecated_configs'] ) {
$config = $this->config->get( self::$mapping[$table]['config'] );
foreach ( self::$mapping[$table]['deprecated_configs'] as $deprecatedConfig ) {
if ( $config & $deprecatedConfig ) {
throw new InvalidArgumentException(
"LinksMigration config $config on $table table is not supported anymore"
);
}
}
}
}
}