aboutsummaryrefslogtreecommitdiffstats
path: root/includes/collation
diff options
context:
space:
mode:
authorTimo Tijhof <krinklemail@gmail.com>2016-04-19 22:27:22 +0100
committerKrinkle <krinklemail@gmail.com>2016-05-09 19:02:35 +0000
commit2a86b5a17a54fcefe8b675c78656c08eb0ed241b (patch)
tree9e051e6343bcd580e391734ac5283895e2f528ee /includes/collation
parentf4070a55263311f2f6e1d3a50391ee1aff97d236 (diff)
downloadmediawikicore-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.php60
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'] );
}
/**