Skip to content

Commit

Permalink
Rewrite caching mechanism
Browse files Browse the repository at this point in the history
  • Loading branch information
mabar committed Feb 18, 2021
1 parent 9a71d9f commit 999963e
Show file tree
Hide file tree
Showing 9 changed files with 41 additions and 210 deletions.
61 changes: 32 additions & 29 deletions src/Bridge/NetteCaching/CachedCatalogue.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
use Nette\Caching\IStorage;
use Orisai\Localization\Resource\Catalogue;
use Orisai\Localization\Resource\Loader;
use function array_key_exists;
use function assert;
use function is_array;

final class CachedCatalogue implements Catalogue
{
Expand All @@ -16,52 +19,52 @@ final class CachedCatalogue implements Catalogue

private Cache $cache;

/** @var array<array<bool>> Map of message => locale which were not found in any loader */
private array $missingTranslationLocaleMap = [];
private bool $debugMode;

public function __construct(Loader $loader, IStorage $storage)
/** @var array<string, array<string>> */
private array $arrayCache = [];

/** @var array<string, null> */
private array $loadedFromLoader = [];

public function __construct(Loader $loader, IStorage $storage, bool $debugMode)
{
$this->loader = $loader;
$this->cache = new Cache($storage, self::CACHE_KEY);
$this->debugMode = $debugMode;
}

public function getMessage(string $message, string $languageTag): ?string
{
$cache = $this->cache->derive('.' . $languageTag);
$messages = $this->arrayCache[$languageTag] ?? null;

// Try get translation from cache
$translated = $this->cache->load($message);
if ($messages === null) {
$messages = $this->cache->load(
$languageTag,
function () use ($languageTag): array {
$this->loadedFromLoader[$languageTag] = null;

// Translation is already cached
if ($translated !== null) {
return $translated;
}
return $this->loader->loadAllMessages($languageTag);
},
);
assert(is_array($messages));

// Loader don't contain translation for given message with requested language, skip lookup
if ($this->missingTranslationLocaleMap[$message][$languageTag] ?? false) {
return null;
$this->arrayCache[$languageTag] = $messages;
}

// Load all translations for given locale
foreach ($this->loader->loadAllMessages($languageTag) as $key => $translation) {
// Try to load message and save only if not cached yet
$cache->load($key, static fn (): string => $translation);
$translation = $messages[$message] ?? null;

// Loaded key is same as requested message, use it
if ($key === $message) {
$translated = $translation;
}
}
if ($translation === null && $this->debugMode && !array_key_exists($languageTag, $this->loadedFromLoader)) {
$this->loadedFromLoader[$languageTag] = null;

// Translation found, return it
if ($translated !== null) {
return $translated;
}
$messages = $this->loader->loadAllMessages($languageTag);
$this->arrayCache[$languageTag] = $messages;
$this->cache->save($languageTag, $messages);

// Loader don't contain translation for given message with requested language, skip at next run
$this->missingTranslationLocaleMap[$message][$languageTag] = true;
$translation = $messages[$message] ?? null;
}

return null;
return $translation;
}

}
20 changes: 6 additions & 14 deletions src/Bridge/NetteDI/LocalizationExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,6 @@
use Orisai\Localization\Locale\Locales;
use Orisai\Localization\Locale\MultiLocaleConfigurator;
use Orisai\Localization\Logging\TranslationsLogger;
use Orisai\Localization\Resource\ArrayCacheCatalogue;
use Orisai\Localization\Resource\ArrayCacheLoader;
use Orisai\Localization\Resource\Catalogue;
use Orisai\Localization\Resource\Loader;
use Orisai\Localization\Translator;
Expand All @@ -51,6 +49,7 @@ public function getConfigSchema(): Schema
{
return Expect::structure([
'debug' => Expect::structure([
'newMessages' => Expect::bool()->required(),
'panel' => Expect::bool(false),
]),
'locale' => Expect::structure([
Expand Down Expand Up @@ -166,20 +165,13 @@ public function loadConfiguration(): void
->setType(Loader::class)
->setAutowired(false);

$loaderCacheDefinition = $builder->addDefinition($this->prefix('loaders.cache'))
->setFactory(ArrayCacheLoader::class, [$lazyLoaderDefinition])
->setType(Loader::class)
->setAutowired(false);

// Catalogue

$catalogueDefinition = $builder->addDefinition($this->prefix('catalogue'))
->setFactory(CachedCatalogue::class, [$loaderCacheDefinition])
->setType(Catalogue::class)
->setAutowired(false);

$catalogueCacheDefinition = $builder->addDefinition($this->prefix('catalogue.cache'))
->setFactory(ArrayCacheCatalogue::class, [$catalogueDefinition])
->setFactory(CachedCatalogue::class, [
'loader' => $lazyLoaderDefinition,
'debugMode' => $config->debug->newMessages,
])
->setType(Catalogue::class)
->setAutowired(false);

Expand All @@ -206,7 +198,7 @@ public function loadConfiguration(): void
[
$localesDef,
$rootResolverDefinition,
$catalogueCacheDefinition,
$catalogueDefinition,
$messageFormatterDefinition,
$loggerDefinition,
$processorDefinition,
Expand Down
32 changes: 0 additions & 32 deletions src/Resource/ArrayCacheCatalogue.php

This file was deleted.

33 changes: 0 additions & 33 deletions src/Resource/ArrayCacheLoader.php

This file was deleted.

12 changes: 0 additions & 12 deletions tests/Unit/Bridge/NetteDI/LocalizationExtensionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,6 @@
use Orisai\Localization\Formatting\MessageFormatter;
use Orisai\Localization\Locale\LocaleProcessor;
use Orisai\Localization\Logging\TranslationsLogger;
use Orisai\Localization\Resource\ArrayCacheCatalogue;
use Orisai\Localization\Resource\ArrayCacheLoader;
use Orisai\Localization\Translator;
use Orisai\Localization\TranslatorGetter;
use PHPUnit\Framework\TestCase;
Expand Down Expand Up @@ -54,12 +52,7 @@ public function testMinimal(): void

self::assertInstanceOf(LazyMultiLocaleResolver::class, $container->getService('localization.resolvers'));
self::assertInstanceOf(LazyMultiLoader::class, $container->getService('localization.loaders'));
self::assertInstanceOf(ArrayCacheLoader::class, $container->getService('localization.loaders.cache'));
self::assertInstanceOf(CachedCatalogue::class, $container->getService('localization.catalogue'));
self::assertInstanceOf(
ArrayCacheCatalogue::class,
$container->getService('localization.catalogue.cache'),
);
self::assertInstanceOf(MessageFormatter::class, $container->getService('localization.formatter'));
self::assertInstanceOf(TranslationsLogger::class, $container->getService('localization.logger'));
self::assertInstanceOf(DefaultTranslator::class, $container->getService('localization.translator'));
Expand Down Expand Up @@ -90,12 +83,7 @@ public function testFull(): void

self::assertInstanceOf(LazyMultiLocaleResolver::class, $container->getService('localization.resolvers'));
self::assertInstanceOf(LazyMultiLoader::class, $container->getService('localization.loaders'));
self::assertInstanceOf(ArrayCacheLoader::class, $container->getService('localization.loaders.cache'));
self::assertInstanceOf(CachedCatalogue::class, $container->getService('localization.catalogue'));
self::assertInstanceOf(
ArrayCacheCatalogue::class,
$container->getService('localization.catalogue.cache'),
);
self::assertInstanceOf(MessageFormatter::class, $container->getService('localization.formatter'));
self::assertInstanceOf(TranslationsLogger::class, $container->getService('localization.logger'));
self::assertInstanceOf(DefaultTranslator::class, $container->getService('localization.translator'));
Expand Down
1 change: 1 addition & 0 deletions tests/Unit/Bridge/NetteDI/config.full.neon
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ localization:
default: en
allowed: [cs, fr, de, sk]
debug:
newMessages: false
panel: true

services:
Expand Down
2 changes: 2 additions & 0 deletions tests/Unit/Bridge/NetteDI/config.minimal.neon
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ extensions:
localization:
locale:
default: en
debug:
newMessages: false

services:
storage: Nette\Caching\Storages\MemoryStorage
47 changes: 0 additions & 47 deletions tests/Unit/Resource/ArrayCacheCatalogueTest.php

This file was deleted.

43 changes: 0 additions & 43 deletions tests/Unit/Resource/ArrayCacheLoaderTest.php

This file was deleted.

0 comments on commit 999963e

Please sign in to comment.