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',
43 return __CLASS__ . $this->
getOption(
'table',
'' );
48 $mapping = \MediaWiki\Linker\LinksMigration::$mapping;
50 if ( !isset( $mapping[$table] ) ) {
51 $this->
output(
"Mapping for this table doesn't exist yet.\n" );
54 $targetColumn = $mapping[$table][
'target_id'];
55 if ( !$dbw->fieldExists( $table, $mapping[$table][
'title'], __METHOD__ ) ) {
56 $this->
output(
"Old fields don't exist. There is no need to run this script\n" );
59 if ( !$dbw->fieldExists( $table, $targetColumn, __METHOD__ ) ) {
60 $this->
output(
"Run update.php to create the $targetColumn column.\n" );
63 if ( !$dbw->tableExists(
'linktarget', __METHOD__ ) ) {
64 $this->
output(
"Run update.php to create the linktarget table.\n" );
68 $this->
output(
"Populating the $targetColumn column\n" );
71 $highestPageId = $dbw->newSelectQueryBuilder()
75 ->caller( __METHOD__ )
76 ->orderBy(
'page_id',
'DESC' )
77 ->fetchResultSet()->fetchRow();
78 if ( !$highestPageId ) {
79 $this->
output(
"Page table is empty.\n" );
82 $highestPageId = $highestPageId[0];
84 while ( $pageId <= $highestPageId ) {
88 $this->handlePageBatch( $pageId, $mapping, $table );
92 $this->
output(
"Completed normalization of $table, {$this->totalUpdated} rows updated.\n" );
97 private function handlePageBatch( $lowPageId, $mapping, $table ) {
98 $batchSize = $this->getBatchSize();
99 $targetColumn = $mapping[$table][
'target_id'];
100 $pageIdColumn = $mapping[$table][
'page_id'];
102 $highPageId = $lowPageId + $batchSize - 1;
103 $dbw = $this->getPrimaryDB();
106 $res = $dbw->newSelectQueryBuilder()
107 ->select( [ $mapping[$table][
'ns'], $mapping[$table][
'title'] ] )
110 $targetColumn => [
null, 0 ],
111 $dbw->expr( $pageIdColumn,
'>=', $lowPageId ),
112 $dbw->expr( $pageIdColumn,
'<=', $highPageId ),
115 ->caller( __METHOD__ )
117 if ( !$res->numRows() ) {
120 $row = $res->fetchRow();
121 $ns = $row[$mapping[$table][
'ns']];
122 $titleString = $row[$mapping[$table][
'title']];
123 $title =
new TitleValue( (
int)$ns, $titleString );
124 $id = $this->
getServiceContainer()->getLinkTargetLookup()->acquireLinkTargetId( $title, $dbw );
125 $dbw->newUpdateQueryBuilder()
127 ->set( [ $targetColumn => $id ] )
129 $targetColumn => [
null, 0 ],
130 $mapping[$table][
'ns'] => $ns,
131 $mapping[$table][
'title'] => $titleString,
132 $dbw->expr( $pageIdColumn,
'>=', $lowPageId ),
133 $dbw->expr( $pageIdColumn,
'<=', $highPageId ),
135 ->caller( __METHOD__ )->execute();
136 $this->updateProgress( $dbw->affectedRows(), $lowPageId, $highPageId, $ns, $titleString );
150 private function updateProgress( $updatedInThisBatch, $lowPageId, $highPageId, $ns, $titleString ) {
151 $this->totalUpdated += $updatedInThisBatch;
152 if ( $this->totalUpdated >= $this->lastProgress + $this->
getBatchSize() ) {
153 $this->lastProgress = $this->totalUpdated;
154 $this->
output(
"Updated {$this->totalUpdated} rows, " .
155 "at page_id $lowPageId-$highPageId title $ns:$titleString\n" );
158 $sleep = (int)$this->
getOption(
'sleep', 0 );
addOption( $name, $description, $required=false, $withArg=false, $shortName=false, $multiOccurrence=false)
Add a parameter to the script.