From: Timo Tijhof Date: Tue, 19 Apr 2016 21:27:22 +0000 (+0100) Subject: collation: Refactor getFirstLetterData() cache handling X-Git-Tag: 1.31.0-rc.0~7008^2 X-Git-Url: http://git.cyclocoop.org/%24action?a=commitdiff_plain;h=2a86b5a17a54fcefe8b675c78656c08eb0ed241b;p=lhc%2Fweb%2Fwiklou.git collation: Refactor getFirstLetterData() cache handling * Factor out fetchFirstLetterData() as a separate method. * Move 'version' into the key instead of checking afterwards. * Use getWithSetCallback() for the cache handling. (Depends on version being in the key). Change-Id: I15bddf5d1dabcdcef47a938447ba59436bd8a294 --- diff --git a/includes/collation/IcuCollation.php b/includes/collation/IcuCollation.php index 942036b696..a374b13168 100644 --- a/includes/collation/IcuCollation.php +++ b/includes/collation/IcuCollation.php @@ -234,32 +234,33 @@ class IcuCollation extends Collation { /** * @since 1.16.3 + * @return array */ public function getFirstLetterData() { - if ( $this->firstLetterData !== null ) { - return $this->firstLetterData; - } - - $cache = ObjectCache::getLocalServerInstance( CACHE_ANYTHING ); - $cacheKey = $cache->makeKey( - 'first-letters', - $this->locale, - $this->digitTransformLanguage->getCode(), - self::getICUVersion() - ); - $cacheEntry = $cache->get( $cacheKey ); - - if ( $cacheEntry && isset( $cacheEntry['version'] ) - && $cacheEntry['version'] == self::FIRST_LETTER_VERSION - ) { - $this->firstLetterData = $cacheEntry; - return $this->firstLetterData; + if ( $this->firstLetterData === null ) { + $cache = ObjectCache::getLocalServerInstance( CACHE_ANYTHING ); + $cacheKey = $cache->makeKey( + 'first-letters', + $this->locale, + $this->digitTransformLanguage->getCode(), + self::getICUVersion(), + self::FIRST_LETTER_VERSION + ); + $this->firstLetterData = $cache->getWithSetCallback( $cacheKey, $cache::TTL_WEEK, function () { + return $this->fetchFirstLetterData(); + } ); } + return $this->firstLetterData; + } + /** + * @return array + * @throws MWException + */ + private function fetchFirstLetterData() { // Generate data from serialized data file - if ( isset( self::$tailoringFirstLetters[$this->locale] ) ) { - $letters = wfGetPrecompiledData( "first-letters-root.ser" ); + $letters = wfGetPrecompiledData( 'first-letters-root.ser' ); // Append additional characters $letters = array_merge( $letters, self::$tailoringFirstLetters[$this->locale] ); // Remove unnecessary ones, if any @@ -374,15 +375,11 @@ class IcuCollation extends Collation { $data = [ 'chars' => array_values( $letterMap ), 'keys' => array_keys( $letterMap ), - 'version' => self::FIRST_LETTER_VERSION, ]; // Reduce memory usage before caching unset( $letterMap ); - // Save to cache - $this->firstLetterData = $data; - $cache->set( $cacheKey, $data, $cache::TTL_WEEK ); return $data; } @@ -390,30 +387,21 @@ class IcuCollation extends Collation { * @since 1.16.3 */ public function getLetterByIndex( $index ) { - if ( $this->firstLetterData === null ) { - $this->getFirstLetterData(); - } - return $this->firstLetterData['chars'][$index]; + return $this->getFirstLetterData()['chars'][$index]; } /** * @since 1.16.3 */ public function getSortKeyByLetterIndex( $index ) { - if ( $this->firstLetterData === null ) { - $this->getFirstLetterData(); - } - return $this->firstLetterData['keys'][$index]; + return $this->getFirstLetterData()['keys'][$index]; } /** * @since 1.16.3 */ public function getFirstLetterCount() { - if ( $this->firstLetterData === null ) { - $this->getFirstLetterData(); - } - return count( $this->firstLetterData['chars'] ); + return count( $this->getFirstLetterData()['chars'] ); } /**