diff options
author | Pierre Schmitz <pierre@archlinux.de> | 2013-08-12 09:28:15 +0200 |
---|---|---|
committer | Pierre Schmitz <pierre@archlinux.de> | 2013-08-12 09:28:15 +0200 |
commit | 08aa4418c30cfc18ccc69a0f0f9cb9e17be6c196 (patch) | |
tree | 577a29fb579188d16003a209ce2a2e9c5b0aa2bd /maintenance/updateCollation.php | |
parent | cacc939b34e315b85e2d72997811eb6677996cc1 (diff) |
Update to MediaWiki 1.21.1
Diffstat (limited to 'maintenance/updateCollation.php')
-rw-r--r-- | maintenance/updateCollation.php | 65 |
1 files changed, 45 insertions, 20 deletions
diff --git a/maintenance/updateCollation.php b/maintenance/updateCollation.php index b732508f..a76a1ee6 100644 --- a/maintenance/updateCollation.php +++ b/maintenance/updateCollation.php @@ -35,10 +35,10 @@ require_once( __DIR__ . '/Maintenance.php' ); * @ingroup Maintenance */ class UpdateCollation extends Maintenance { - const BATCH_SIZE = 50; // Number of rows to process in one batch + const BATCH_SIZE = 10000; // Number of rows to process in one batch const SYNC_INTERVAL = 20; // Wait for slaves after this many batches - var $sizeHistogram = array(); + public $sizeHistogram = array(); public function __construct() { parent::__construct(); @@ -68,7 +68,7 @@ TEXT; } public function execute() { - global $wgCategoryCollation, $wgMiserMode; + global $wgCategoryCollation; $dbw = $this->getDB( DB_MASTER ); $force = $this->getOption( 'force' ); @@ -82,10 +82,13 @@ TEXT; $collation = Collation::singleton(); } - $options = array( 'LIMIT' => self::BATCH_SIZE, 'STRAIGHT_JOIN' ); + $options = array( + 'LIMIT' => self::BATCH_SIZE, + 'ORDER BY' => 'cl_to, cl_type, cl_from', + 'STRAIGHT_JOIN', + ); if ( $force || $dryRun ) { - $options['ORDER BY'] = 'cl_from, cl_to'; $collationConds = array(); } else { if ( $this->hasOption( 'previous-collation' ) ) { @@ -96,20 +99,20 @@ TEXT; ); } - if ( !$wgMiserMode ) { + $count = $dbw->estimateRowCount( + 'categorylinks', + '*', + $collationConds, + __METHOD__ + ); + // Improve estimate if feasible + if ( $count < 1000000 ) { $count = $dbw->selectField( 'categorylinks', 'COUNT(*)', $collationConds, __METHOD__ ); - } else { - $count = $dbw->estimateRowCount( - 'categorylinks', - '*', - $collationConds, - __METHOD__ - ); } if ( $count == 0 ) { $this->output( "Collations up-to-date.\n" ); @@ -126,7 +129,7 @@ TEXT; $res = $dbw->select( array( 'categorylinks', 'page' ), array( 'cl_from', 'cl_to', 'cl_sortkey_prefix', 'cl_collation', - 'cl_sortkey', 'page_namespace', 'page_title' + 'cl_sortkey', 'cl_type', 'page_namespace', 'page_title' ), array_merge( $collationConds, $batchConds, array( 'cl_from = page_id' ) ), __METHOD__, @@ -186,12 +189,8 @@ TEXT; $dbw->commit( __METHOD__ ); } - if ( ( $force || $dryRun ) && $row ) { - $encFrom = $dbw->addQuotes( $row->cl_from ); - $encTo = $dbw->addQuotes( $row->cl_to ); - $batchConds = array( - "(cl_from = $encFrom AND cl_to > $encTo) " . - " OR cl_from > $encFrom" ); + if ( $row ) { + $batchConds = array( $this->getBatchCondition( $row ) ); } $count += $res->numRows(); @@ -212,6 +211,32 @@ TEXT; } } + /** + * Return an SQL expression selecting rows which sort above the given row, + * assuming an ordering of cl_to, cl_type, cl_from + */ + function getBatchCondition( $row ) { + $dbw = $this->getDB( DB_MASTER ); + $fields = array( 'cl_to', 'cl_type', 'cl_from' ); + $first = true; + $cond = false; + $prefix = false; + foreach ( $fields as $field ) { + $encValue = $dbw->addQuotes( $row->$field ); + $inequality = "$field > $encValue"; + $equality = "$field = $encValue"; + if ( $first ) { + $cond = $inequality; + $prefix = $equality; + $first = false; + } else { + $cond .= " OR ($prefix AND $inequality)"; + $prefix .= " AND $equality"; + } + } + return $cond; + } + function updateSortKeySizeHistogram( $key ) { $length = strlen( $key ); if ( !isset( $this->sizeHistogram[$length] ) ) { |