Skip to content

Commit

Permalink
refactor: Simplify object caching.
Browse files Browse the repository at this point in the history
  • Loading branch information
priyadi committed Jan 13, 2024
1 parent 5e32e6a commit b0e94d1
Show file tree
Hide file tree
Showing 8 changed files with 33 additions and 68 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
* refactor: Move `MainTransformer` to its own namespace.
* refactor: Refactor exception.
* feat: Add attribute matching.
* refactor: Simplify object caching.

## 0.5.4

Expand Down
8 changes: 0 additions & 8 deletions config/services.php
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,6 @@
->set('rekalogika.mapper.method_mapper.transformer', ClassMethodTransformer::class)
->args([
service('rekalogika.mapper.method_mapper.sub_mapper'),
service('rekalogika.mapper.object_cache_factory'),
])
->tag('rekalogika.mapper.transformer', ['priority' => -600]);

Expand All @@ -111,16 +110,10 @@

$services
->set('rekalogika.mapper.transformer.traversable_to_arrayaccess', TraversableToArrayAccessTransformer::class)
->args([
'$objectCacheFactory' => service('rekalogika.mapper.object_cache_factory'),
])
->tag('rekalogika.mapper.transformer', ['priority' => -700]);

$services
->set('rekalogika.mapper.transformer.traversable_to_traversable', TraversableToTraversableTransformer::class)
->args([
'$objectCacheFactory' => service('rekalogika.mapper.object_cache_factory'),
])
->tag('rekalogika.mapper.transformer', ['priority' => -750]);

$services
Expand All @@ -142,7 +135,6 @@
'$propertyAccessExtractor' => service('rekalogika.mapper.property_info'),
'$propertyAccessor' => service('property_accessor'),
'$typeResolver' => service('rekalogika.mapper.type_resolver'),
'$objectCacheFactory' => service('rekalogika.mapper.object_cache_factory'),
])
->tag('rekalogika.mapper.transformer', ['priority' => -900]);

Expand Down
24 changes: 23 additions & 1 deletion src/MainTransformer/MainTransformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
use Rekalogika\Mapper\Exception\LogicException;
use Rekalogika\Mapper\MainTransformer\Exception\CannotFindTransformerException;
use Rekalogika\Mapper\MainTransformer\Exception\TransformerReturnsUnexpectedValueException;
use Rekalogika\Mapper\ObjectCache\Exception\CachedTargetObjectNotFoundException;
use Rekalogika\Mapper\ObjectCache\ObjectCache;
use Rekalogika\Mapper\ObjectCache\ObjectCacheFactoryInterface;
use Rekalogika\Mapper\Transformer\Contracts\MainTransformerAwareInterface;
Expand Down Expand Up @@ -52,9 +53,13 @@ private function processTransformer(
*/
public static function getObjectCache(
array &$context,
ObjectCacheFactoryInterface $objectCacheFactory
null|ObjectCacheFactoryInterface $objectCacheFactory = null,
): ObjectCache {
if (!isset($context[self::OBJECT_CACHE])) {
if ($objectCacheFactory === null) {
throw new LogicException('Object cache factory must not be null.');
}

$objectCache = $objectCacheFactory->createObjectCache();
$context[self::OBJECT_CACHE] = $objectCache;
} else {
Expand Down Expand Up @@ -135,14 +140,31 @@ public function transform(
// loop over the result and transform the source to the target

foreach ($searchResult as $searchEntry) {
// inject the main transformer to the transformer if it is
// MainTransformerAwareInterface
$transformer = $this->processTransformer($searchEntry->getTransformer());

// TransformerInterface doesn't accept MixedType, so we need to
// convert it to null

$sourceType = $searchEntry->getSourceType();
$sourceTypeForTransformer = $sourceType instanceof MixedType ? null : $sourceType;

$targetType = $searchEntry->getTargetType();
$targetTypeForTransformer = $targetType instanceof MixedType ? null : $targetType;

// if the target type is cached, return it. otherwise, pre-cache it

if ($targetTypeForTransformer !== null) {
try {
return $objectCache->getTarget($source, $targetTypeForTransformer);
} catch (CachedTargetObjectNotFoundException) {
$objectCache->preCache($source, $targetTypeForTransformer);
}
}

// transform the source to the target

/** @var mixed */
$result = $transformer->transform(
source: $source,
Expand Down
9 changes: 2 additions & 7 deletions src/MapperFactory/MapperFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -274,7 +274,6 @@ protected function getObjectToObjectTransformer(): TransformerInterface
$this->getPropertyAccessExtractor(),
$this->getPropertyAccessor(),
$this->getTypeResolver(),
$this->getObjectCacheFactory(),
);
}

Expand Down Expand Up @@ -343,9 +342,7 @@ protected function getTraversableToArrayAccessTransformer(): TransformerInterfac
{
if (null === $this->traversableToArrayAccessTransformer) {
$this->traversableToArrayAccessTransformer =
new TraversableToArrayAccessTransformer(
$this->getObjectCacheFactory()
);
new TraversableToArrayAccessTransformer();
}

return $this->traversableToArrayAccessTransformer;
Expand All @@ -355,9 +352,7 @@ protected function getTraversableToTraversableTransformer(): TransformerInterfac
{
if (null === $this->traversableToTraversableTransformer) {
$this->traversableToTraversableTransformer =
new TraversableToTraversableTransformer(
$this->getObjectCacheFactory()
);
new TraversableToTraversableTransformer();
}

return $this->traversableToTraversableTransformer;
Expand Down
4 changes: 1 addition & 3 deletions src/MethodMapper/ClassMethodTransformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@

use Rekalogika\Mapper\Exception\InvalidArgumentException;
use Rekalogika\Mapper\MainTransformer\MainTransformer;
use Rekalogika\Mapper\ObjectCache\ObjectCacheFactoryInterface;
use Rekalogika\Mapper\Transformer\Contracts\MainTransformerAwareInterface;
use Rekalogika\Mapper\Transformer\Contracts\MainTransformerAwareTrait;
use Rekalogika\Mapper\Transformer\Contracts\TransformerInterface;
Expand All @@ -31,7 +30,6 @@ final class ClassMethodTransformer implements

public function __construct(
private SubMapper $subMapper,
private ObjectCacheFactoryInterface $objectCacheFactory,
) {
}

Expand Down Expand Up @@ -88,7 +86,7 @@ public function transform(

// get object cache

$objectCache = MainTransformer::getObjectCache($context, $this->objectCacheFactory);
$objectCache = MainTransformer::getObjectCache($context);

// save to object cache

Expand Down
20 changes: 4 additions & 16 deletions src/Transformer/ObjectToObjectTransformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@

use Rekalogika\Mapper\Exception\InvalidArgumentException;
use Rekalogika\Mapper\MainTransformer\MainTransformer;
use Rekalogika\Mapper\ObjectCache\Exception\CachedTargetObjectNotFoundException;
use Rekalogika\Mapper\ObjectCache\ObjectCacheFactoryInterface;
use Rekalogika\Mapper\Transformer\Contracts\MainTransformerAwareInterface;
use Rekalogika\Mapper\Transformer\Contracts\MainTransformerAwareTrait;
use Rekalogika\Mapper\Transformer\Contracts\TransformerInterface;
Expand Down Expand Up @@ -47,7 +45,6 @@ public function __construct(
private PropertyAccessExtractorInterface $propertyAccessExtractor,
private PropertyAccessorInterface $propertyAccessor,
private TypeResolverInterface $typeResolver,
private ObjectCacheFactoryInterface $objectCacheFactory,
) {
}

Expand All @@ -62,17 +59,6 @@ public function transform(
throw new InvalidArgumentException('Target type must not be null.');
}

// get object cache

$objectCache = MainTransformer::getObjectCache($context, $this->objectCacheFactory);

// return from cache if already exists

try {
return $objectCache->getTarget($source, $targetType);
} catch (CachedTargetObjectNotFoundException) {
}

// get source object & class

if (!is_object($source)) {
Expand All @@ -93,17 +79,19 @@ public function transform(
return $source;
}

// initialize target, add to cache after initialization
// initialize target

if (null === $target) {
$objectCache->preCache($source, $targetType);
$target = $this->instantiateTarget($source, $targetType, $context);
} else {
if (!is_object($target)) {
throw new InvalidArgumentException(sprintf('The target must be an object, "%s" given.', get_debug_type($target)));
}
}

// save object to cache

$objectCache = MainTransformer::getObjectCache($context);
$objectCache->saveTarget($source, $targetType, $target);

// list properties
Expand Down
17 changes: 1 addition & 16 deletions src/Transformer/TraversableToArrayAccessTransformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@
use Doctrine\Common\Collections\Collection;
use Rekalogika\Mapper\Exception\InvalidArgumentException;
use Rekalogika\Mapper\MainTransformer\MainTransformer;
use Rekalogika\Mapper\ObjectCache\Exception\CachedTargetObjectNotFoundException;
use Rekalogika\Mapper\ObjectCache\ObjectCacheFactoryInterface;
use Rekalogika\Mapper\Transformer\Contracts\MainTransformerAwareInterface;
use Rekalogika\Mapper\Transformer\Contracts\MainTransformerAwareTrait;
use Rekalogika\Mapper\Transformer\Contracts\TransformerInterface;
Expand All @@ -34,11 +32,6 @@ final class TraversableToArrayAccessTransformer implements TransformerInterface,
{
use MainTransformerAwareTrait;

public function __construct(
private ObjectCacheFactoryInterface $objectCacheFactory,
) {
}

public function transform(
mixed $source,
mixed $target,
Expand All @@ -52,14 +45,7 @@ public function transform(

// get object cache

$objectCache = MainTransformer::getObjectCache($context, $this->objectCacheFactory);

// return from cache if already exists

try {
return $objectCache->getTarget($source, $targetType);
} catch (CachedTargetObjectNotFoundException) {
}
$objectCache = MainTransformer::getObjectCache($context);

// The source must be a Traversable or an array (a.k.a. iterable).

Expand All @@ -76,7 +62,6 @@ public function transform(
// If the target is not provided, instantiate it, and add to cache.

if ($target === null) {
$objectCache->preCache($source, $targetType);
$target = $this->instantiateArrayAccessOrArray($targetType);
}

Expand Down
18 changes: 1 addition & 17 deletions src/Transformer/TraversableToTraversableTransformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@

use Rekalogika\Mapper\Exception\InvalidArgumentException;
use Rekalogika\Mapper\MainTransformer\MainTransformer;
use Rekalogika\Mapper\ObjectCache\Exception\CachedTargetObjectNotFoundException;
use Rekalogika\Mapper\ObjectCache\ObjectCacheFactoryInterface;
use Rekalogika\Mapper\Transformer\Contracts\MainTransformerAwareInterface;
use Rekalogika\Mapper\Transformer\Contracts\MainTransformerAwareTrait;
use Rekalogika\Mapper\Transformer\Contracts\TransformerInterface;
Expand All @@ -32,11 +30,6 @@ final class TraversableToTraversableTransformer implements TransformerInterface,
{
use MainTransformerAwareTrait;

public function __construct(
private ObjectCacheFactoryInterface $objectCacheFactory,
) {
}

public function transform(
mixed $source,
mixed $target,
Expand All @@ -49,14 +42,7 @@ public function transform(
}
// get object cache

$objectCache = MainTransformer::getObjectCache($context, $this->objectCacheFactory);

// return from cache if already exists

try {
return $objectCache->getTarget($source, $targetType);
} catch (CachedTargetObjectNotFoundException) {
}
$objectCache = MainTransformer::getObjectCache($context);

// The source must be a Traversable or an array (a.k.a. iterable).

Expand Down Expand Up @@ -88,8 +74,6 @@ public function transform(

// create generator

$objectCache->preCache($source, $targetType);

$target = (function () use (
$source,
$targetMemberKeyTypeIsInt,
Expand Down

0 comments on commit b0e94d1

Please sign in to comment.