18 private $totalUpdated = 0;
20 private $lastProgress = 0;
23 parent::__construct();
25 'Populates normalization column in links tables.'
29 'Table name. Like pagelinks.',
35 'Sleep time (in seconds) between every batch. Default: 0',
44 return __CLASS__ . $this->
getOption(
'table',
'' );
50 $mapping = \MediaWiki\Linker\LinksMigration::$mapping;
52 if ( !isset( $mapping[$table] ) ) {
53 $this->
output(
"Mapping for this table doesn't exist yet.\n" );
56 $targetColumn = $mapping[$table][
'target_id'];
57 if ( !$dbw->fieldExists( $table, $mapping[$table][
'title'], __METHOD__ ) ) {
58 $this->
output(
"Old fields don't exist. There is no need to run this script\n" );
61 if ( !$dbw->fieldExists( $table, $targetColumn, __METHOD__ ) ) {
62 $this->
output(
"Run update.php to create the $targetColumn column.\n" );
65 if ( !$dbw->tableExists(
'linktarget', __METHOD__ ) ) {
66 $this->
output(
"Run update.php to create the linktarget table.\n" );
70 $this->
output(
"Populating the $targetColumn column\n" );
73 $highestPageId = $dbw->newSelectQueryBuilder()
77 ->caller( __METHOD__ )
78 ->orderBy(
'page_id',
'DESC' )
79 ->fetchResultSet()->fetchRow();
80 if ( !$highestPageId ) {
81 $this->
output(
"Page table is empty.\n" );
84 $highestPageId = $highestPageId[0];
86 while ( $pageId <= $highestPageId ) {
90 $this->handlePageBatch( $pageId, $mapping, $table );
94 $this->
output(
"Completed normalization of $table, {$this->totalUpdated} rows updated.\n" );
99 private function handlePageBatch(
int $lowPageId, array $mapping,
string $table ) {
100 $batchSize = $this->getBatchSize();
101 $targetColumn = $mapping[$table][
'target_id'];
102 $pageIdColumn = $mapping[$table][
'page_id'];
104 $highPageId = $lowPageId + $batchSize - 1;
105 $dbw = $this->getPrimaryDB();
108 $res = $dbw->newSelectQueryBuilder()
109 ->select( [ $mapping[$table][
'ns'], $mapping[$table][
'title'] ] )
112 $targetColumn => [
null, 0 ],
113 $dbw->expr( $pageIdColumn,
'>=', $lowPageId ),
114 $dbw->expr( $pageIdColumn,
'<=', $highPageId ),
117 ->caller( __METHOD__ )
119 if ( !$res->numRows() ) {
122 $row = $res->fetchRow();
123 $ns = $row[$mapping[$table][
'ns']];
124 $titleString = $row[$mapping[$table][
'title']];
125 $title =
new TitleValue( (
int)$ns, $titleString );
126 $id = $this->
getServiceContainer()->getLinkTargetLookup()->acquireLinkTargetId( $title, $dbw );
127 $dbw->newUpdateQueryBuilder()
129 ->set( [ $targetColumn => $id ] )
131 $targetColumn => [
null, 0 ],
132 $mapping[$table][
'ns'] => $ns,
133 $mapping[$table][
'title'] => $titleString,
134 $dbw->expr( $pageIdColumn,
'>=', $lowPageId ),
135 $dbw->expr( $pageIdColumn,
'<=', $highPageId ),
137 ->caller( __METHOD__ )->execute();
138 $this->updateProgress( $dbw->affectedRows(), $lowPageId, $highPageId, $ns, $titleString );
152 private function updateProgress( $updatedInThisBatch, $lowPageId, $highPageId, $ns, $titleString ) {
153 $this->totalUpdated += $updatedInThisBatch;
154 if ( $this->totalUpdated >= $this->lastProgress + $this->
getBatchSize() ) {
155 $this->lastProgress = $this->totalUpdated;
156 $this->
output(
"Updated {$this->totalUpdated} rows, " .
157 "at page_id $lowPageId-$highPageId title $ns:$titleString\n" );
160 $sleep = (int)$this->
getOption(
'sleep', 0 );
addOption( $name, $description, $required=false, $withArg=false, $shortName=false, $multiOccurrence=false)
Add a parameter to the script.