Skip to content

Commit

Permalink
perf: Add caching for TransformerRegistry.
Browse files Browse the repository at this point in the history
  • Loading branch information
priyadi committed Jan 16, 2024
1 parent 75a6fc1 commit 9b3e99a
Show file tree
Hide file tree
Showing 5 changed files with 91 additions and 6 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# CHANGELOG

## 0.5.15

* perf: Add caching for `TransformerRegistry`.

## 0.5.14

* fix: Add missing deps to `composer.json`
Expand Down
14 changes: 14 additions & 0 deletions config/services.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
use Rekalogika\Mapper\Transformer\StringToBackedEnumTransformer;
use Rekalogika\Mapper\Transformer\TraversableToArrayAccessTransformer;
use Rekalogika\Mapper\Transformer\TraversableToTraversableTransformer;
use Rekalogika\Mapper\TransformerRegistry\CachingTransformerRegistry;
use Rekalogika\Mapper\TransformerRegistry\TransformerRegistry;
use Rekalogika\Mapper\TypeResolver\CachingTypeResolver;
use Rekalogika\Mapper\TypeResolver\TypeResolver;
Expand Down Expand Up @@ -219,6 +220,19 @@
'$mappingFactory' => service('rekalogika.mapper.mapping_factory'),
]);

$services
->set('rekalogika.mapper.cache.transformer_registry')
->parent('cache.system')
->tag('cache.pool');

$services
->set('rekalogika.mapper.transformer_registry.cache', CachingTransformerRegistry::class)
->decorate('rekalogika.mapper.transformer_registry')
->args([
service('.inner'),
service('rekalogika.mapper.cache.transformer_registry')
]);

# method mapper

$services
Expand Down
67 changes: 67 additions & 0 deletions src/TransformerRegistry/CachingTransformerRegistry.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
<?php

declare(strict_types=1);

/*
* This file is part of rekalogika/mapper package.
*
* (c) Priyadi Iman Nurcahyo <https://rekalogika.dev>
*
* For the full copyright and license information, please view the LICENSE file
* that was distributed with this source code.
*/

namespace Rekalogika\Mapper\TransformerRegistry;

use Psr\Cache\CacheItemPoolInterface;
use Rekalogika\Mapper\Transformer\Contracts\TransformerInterface;

class CachingTransformerRegistry implements TransformerRegistryInterface
{
/**
* @var array<string,SearchResult>
*/
private array $findBySourceAndTargetTypesCache = [];

public function __construct(
private TransformerRegistryInterface $decorated,
private CacheItemPoolInterface $cacheItemPool,
) {
}

public function get(string $id): TransformerInterface
{
return $this->decorated->get($id);
}

public function findBySourceAndTargetTypes(
array $sourceTypes,
array $targetTypes,
): SearchResult {
$cacheKey = md5(serialize($sourceTypes) . '--' . serialize($targetTypes));

if (isset($this->findBySourceAndTargetTypesCache[$cacheKey])) {
return $this->findBySourceAndTargetTypesCache[$cacheKey];
}

$cacheItem = $this->cacheItemPool->getItem($cacheKey);

if ($cacheItem->isHit()) {
/** @var mixed */
$result = $cacheItem->get();

if ($result instanceof SearchResult) {
return $this->findBySourceAndTargetTypesCache[$cacheKey] = $result;
}

$this->cacheItemPool->deleteItem($cacheKey);
}

$result = $this->decorated->findBySourceAndTargetTypes($sourceTypes, $targetTypes);

$cacheItem->set($result);
$this->cacheItemPool->save($cacheItem);

return $this->findBySourceAndTargetTypesCache[$cacheKey] = $result;
}
}
4 changes: 2 additions & 2 deletions src/TransformerRegistry/TransformerRegistry.php
Original file line number Diff line number Diff line change
Expand Up @@ -117,8 +117,8 @@ private function findBySourceAndTargetType(
}

public function findBySourceAndTargetTypes(
iterable $sourceTypes,
iterable $targetTypes,
array $sourceTypes,
array $targetTypes,
): SearchResult {
/** @var array<int,SearchResultEntry> */
$searchResultEntries = [];
Expand Down
8 changes: 4 additions & 4 deletions src/TransformerRegistry/TransformerRegistryInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,12 @@ interface TransformerRegistryInterface
public function get(string $id): TransformerInterface;

/**
* @param iterable<array-key,Type|MixedType> $sourceTypes
* @param iterable<array-key,Type|MixedType> $targetTypes
* @param array<array-key,Type|MixedType> $sourceTypes
* @param array<array-key,Type|MixedType> $targetTypes
* @return SearchResult
*/
public function findBySourceAndTargetTypes(
iterable $sourceTypes,
iterable $targetTypes,
array $sourceTypes,
array $targetTypes,
): SearchResult;
}

0 comments on commit 9b3e99a

Please sign in to comment.