diff options
author | Timo Tijhof <krinklemail@gmail.com> | 2016-04-19 22:27:22 +0100 |
---|---|---|
committer | Krinkle <krinklemail@gmail.com> | 2016-05-09 19:02:35 +0000 |
commit | 2a86b5a17a54fcefe8b675c78656c08eb0ed241b (patch) | |
tree | 9e051e6343bcd580e391734ac5283895e2f528ee /includes/collation | |
parent | f4070a55263311f2f6e1d3a50391ee1aff97d236 (diff) | |
download | mediawikicore-2a86b5a17a54fcefe8b675c78656c08eb0ed241b.tar.gz mediawikicore-2a86b5a17a54fcefe8b675c78656c08eb0ed241b.zip |
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
Diffstat (limited to 'includes/collation')
-rw-r--r-- | includes/collation/IcuCollation.php | 60 |
1 files changed, 24 insertions, 36 deletions
diff --git a/includes/collation/IcuCollation.php b/includes/collation/IcuCollation.php index 942036b69605..a374b131683e 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'] ); } /** |