http://www.mediawiki.org/wiki/Special:Code/MediaWiki/69874

Revision: 69874
Author:   philip
Date:     2010-07-25 16:53:55 +0000 (Sun, 25 Jul 2010)

Log Message:
-----------
Performance improvement: in doVariants(), concatenate a bulk of titles to a 
single string, thus we just need to call convertLinkToAllVariants() once.

Modified Paths:
--------------
    trunk/phase3/includes/parser/LinkHolderArray.php

Modified: trunk/phase3/includes/parser/LinkHolderArray.php
===================================================================
--- trunk/phase3/includes/parser/LinkHolderArray.php    2010-07-25 15:53:22 UTC 
(rev 69873)
+++ trunk/phase3/includes/parser/LinkHolderArray.php    2010-07-25 16:53:55 UTC 
(rev 69874)
@@ -296,37 +296,57 @@
                $linkCache = LinkCache::singleton();
                $sk = $this->parent->getOptions()->getSkin();
                $threshold = $this->getStubThreshold();
-
-               // Add variants of links to link batch
+               $titlesToBeConverted = '';
+               $titlesAttrs = array();
+               
+               // Concatenate titles to a single string, thus we only need 
auto convert the
+               // single string to all variants. This would improve parser's 
performance
+               // significantly.
                foreach ( $this->internals as $ns => $entries ) {
                        foreach ( $entries as $index => $entry ) {
-                               $key = "$ns:$index";
                                $pdbk = $entry['pdbk'];
-                               $title = $entry['title'];
-                               $titleText = $title->getText();
-
-                               // generate all variants of the link title text
-                               $allTextVariants = 
$wgContLang->convertLinkToAllVariants($titleText);
-
-                               // if link was not found (in first query), add 
all variants to query
-                               if ( !isset($colours[$pdbk]) ){
-                                       foreach($allTextVariants as 
$textVariant){
-                                               if($textVariant != $titleText){
-                                                       $variantTitle = 
Title::makeTitle( $ns, $textVariant );
-                                                       
if(is_null($variantTitle)) continue;
-                                                       $linkBatch->addObj( 
$variantTitle );
-                                                       
$variantMap[$variantTitle->getPrefixedDBkey()][] = $key;
-                                               }
-                                       }
+                               // we only deal with new links (in its first 
query)
+                               if ( !isset( $colours[$pdbk] ) ) {
+                                       $title = $entry['title'];
+                                       $titleText = $title->getText();
+                                       $titlesAttrs[] = array(
+                                               'ns' => $ns,
+                                               'key' => "$ns:$index",
+                                               'titleText' => $titleText,
+                                       );                                      
+                                       // separate titles with \0 because it 
would never appears
+                                       // in a valid title
+                                       $titlesToBeConverted .= $title . '\0';
                                }
                        }
                }
+               
+               // Now do the conversion and explode string to text of titles
+               $titlesAllVariants = $wgContLang->convertLinkToAllVariants( 
$titlesToBeConverted );
+               $allVariantsName = array_keys( $titlesAllVariants );
+               foreach ( $titlesAllVariants as &$titlesVariant ) {
+                       $titlesVariant = explode( '\0', $titlesVariant );
+               }
+               
+               // Then add variants of links to link batch
+               for ( $i = 0; $l = count( $titlesAttrs ), $i < $l; $i ++ ) {
+                       foreach ( $allVariantsName as $variantName ) {
+                               $textVariant = 
$titlesAllVariants[$variantName][$i];
+                               extract( $titlesAttrs[$i] );
+                               if($textVariant != $titleText){
+                                       $variantTitle = Title::makeTitle( $ns, 
$textVariant );
+                                       if( is_null( $variantTitle ) ) { 
continue; }
+                                       $linkBatch->addObj( $variantTitle );
+                                       
$variantMap[$variantTitle->getPrefixedDBkey()][] = $key;
+                               }
+                       }
+               }
 
                // process categories, check if a category exists in some 
variant
                $categoryMap = array(); // maps $category_variant => $category 
(dbkeys)
                $varCategories = array(); // category replacements oldDBkey => 
newDBkey
                foreach( $output->getCategoryLinks() as $category ){
-                       $variants = 
$wgContLang->convertLinkToAllVariants($category);
+                       $variants = $wgContLang->convertLinkToAllVariants( 
$category );
                        foreach($variants as $variant){
                                if($variant != $category){
                                        $variantTitle = Title::newFromDBkey( 
Title::makeName(NS_CATEGORY,$variant) );



_______________________________________________
MediaWiki-CVS mailing list
MediaWiki-CVS@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs

Reply via email to