Skip to content

Commit db9325f

Browse files
committed
B2B-2658: Implement GraphQL Resolver Cache for Customer query
1 parent abf4970 commit db9325f

File tree

8 files changed

+174
-9
lines changed

8 files changed

+174
-9
lines changed

app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/ValueProcessor.php

Lines changed: 66 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,15 @@
88
namespace Magento\GraphQlResolverCache\Model\Resolver\Result;
99

1010
use Magento\Framework\GraphQl\Query\ResolverInterface;
11+
use Magento\Framework\ObjectManagerInterface;
12+
use Magento\GraphQlResolverCache\Model\Resolver\Result\ValueProcessor\FlagSetter\FlagSetterInterface;
13+
use Magento\GraphQlResolverCache\Model\Resolver\Result\ValueProcessor\FlagGetter\FlagGetterInterface;
1114

1215
/**
1316
* Value processor for cached resolver value.
1417
*/
1518
class ValueProcessor implements ValueProcessorInterface
1619
{
17-
/**
18-
* Key for data processing reference.
19-
*/
20-
private const VALUE_HYDRATION_REFERENCE_KEY = 'value_hydration_reference_key';
21-
2220
/**
2321
* @var HydratorProviderInterface
2422
*/
@@ -39,16 +37,60 @@ class ValueProcessor implements ValueProcessorInterface
3937
*/
4038
private DehydratorProviderInterface $dehydratorProvider;
4139

40+
/**
41+
* @var array
42+
*/
43+
private array $resolverProcessingFlagConfig;
44+
45+
/**
46+
* @var ObjectManagerInterface
47+
*/
48+
private ObjectManagerInterface $objectManager;
49+
50+
/**
51+
* @var FlagGetterInterface
52+
*/
53+
private FlagGetterInterface $defaultFlagGetter;
54+
55+
/**
56+
* @var FlagSetterInterface
57+
*/
58+
private FlagSetterInterface $defaultFlagSetter;
59+
4260
/**
4361
* @param HydratorProviderInterface $hydratorProvider
4462
* @param DehydratorProviderInterface $dehydratorProvider
63+
* @param ObjectManagerInterface $objectManager
64+
* @param array $resolverProcessingFlagConfig
4565
*/
4666
public function __construct(
4767
HydratorProviderInterface $hydratorProvider,
48-
DehydratorProviderInterface $dehydratorProvider
68+
DehydratorProviderInterface $dehydratorProvider,
69+
ObjectManagerInterface $objectManager,
70+
array $resolverProcessingFlagConfig = []
4971
) {
5072
$this->hydratorProvider = $hydratorProvider;
5173
$this->dehydratorProvider = $dehydratorProvider;
74+
$this->resolverProcessingFlagConfig = $resolverProcessingFlagConfig;
75+
$this->objectManager = $objectManager;
76+
$this->defaultFlagGetter = $this->objectManager->get(FlagGetterInterface::class);
77+
$this->defaultFlagSetter = $this->objectManager->get(FlagSetterInterface::class);
78+
}
79+
80+
/**
81+
* @param ResolverInterface $resolver
82+
* @return FlagSetterInterface
83+
*/
84+
private function getFlagSetterForResolver(ResolverInterface $resolver): FlagSetterInterface
85+
{
86+
foreach ($this->getResolverClassChain($resolver) as $className) {
87+
if (isset($this->resolverProcessingFlagConfig['setters'][$className])) {
88+
return $this->objectManager->get(
89+
$this->resolverProcessingFlagConfig['setters'][$className]
90+
);
91+
}
92+
}
93+
return $this->objectManager->get(FlagSetterInterface::class);
5294
}
5395

5496
/**
@@ -62,7 +104,7 @@ public function processCachedValueAfterLoad(ResolverInterface $resolver, string
62104
$hydrator = $this->hydratorProvider->getHydratorForResolver($resolver);
63105
if ($hydrator) {
64106
$this->hydrators[$cacheKey] = $hydrator;
65-
$value[self::VALUE_HYDRATION_REFERENCE_KEY] = $cacheKey;
107+
$this->getFlagSetterForResolver($resolver)->setFlagOnValue($value, $cacheKey);
66108
}
67109
}
68110

@@ -82,13 +124,13 @@ public function preProcessParentValue(array &$value): void
82124
*/
83125
private function hydrateData(&$value)
84126
{
85-
$key = $value[self::VALUE_HYDRATION_REFERENCE_KEY] ?? null;
127+
$key = $this->defaultFlagGetter->getFlagFromValue($value) ?? null;
86128
if ($value && $key) {
87129
if (isset($this->processedValues[$key])) {
88130
$value = $this->processedValues[$key];
89131
} elseif (isset($this->hydrators[$key]) && $this->hydrators[$key] instanceof HydratorInterface) {
90132
$this->hydrators[$key]->hydrate($value);
91-
unset($value[self::VALUE_HYDRATION_REFERENCE_KEY]);
133+
$this->defaultFlagSetter->unsetFlagFromValue($value);
92134
$this->processedValues[$key] = $value;
93135
}
94136
}
@@ -104,4 +146,19 @@ public function preProcessValueBeforeCacheSave(ResolverInterface $resolver, &$va
104146
$dehydrator->dehydrate($value);
105147
}
106148
}
149+
150+
/**
151+
* Get class inheritance chain for the given resolver object.
152+
*
153+
* @param ResolverInterface $resolver
154+
* @return array
155+
*/
156+
private function getResolverClassChain(ResolverInterface $resolver): array
157+
{
158+
$resolverClasses = [trim(get_class($resolver), '\\')];
159+
foreach (class_parents($resolver) as $classParent) {
160+
$resolverClasses[] = trim($classParent, '\\');
161+
}
162+
return $resolverClasses;
163+
}
107164
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\GraphQlResolverCache\Model\Resolver\Result\ValueProcessor\FlagGetter;
9+
10+
interface FlagGetterInterface
11+
{
12+
public function getFlagFromValue(&$value): ?string;
13+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\GraphQlResolverCache\Model\Resolver\Result\ValueProcessor\FlagGetter;
9+
10+
use Magento\GraphQlResolverCache\Model\Resolver\Result\ValueProcessorInterface;
11+
12+
class Generic implements FlagGetterInterface
13+
{
14+
public function setFlagOnValue(&$value, string $flagValue): void
15+
{
16+
$value[ValueProcessorInterface::VALUE_HYDRATION_REFERENCE_KEY] = $flagValue;
17+
}
18+
19+
public function getFlagFromValue(&$value): ?string
20+
{
21+
return $value[ValueProcessorInterface::VALUE_HYDRATION_REFERENCE_KEY] ?? null;
22+
}
23+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\GraphQlResolverCache\Model\Resolver\Result\ValueProcessor\FlagSetter;
9+
10+
use Magento\GraphQlResolverCache\Model\Resolver\Result\ValueProcessorInterface;
11+
12+
class Enumerable implements FlagSetterInterface
13+
{
14+
public function setFlagOnValue(&$value, string $flagValue): void
15+
{
16+
foreach ($value as $key => $data) {
17+
$value[$key][ValueProcessorInterface::VALUE_HYDRATION_REFERENCE_KEY] = $flagValue;
18+
}
19+
}
20+
21+
public function unsetFlagFromValue(&$value): void
22+
{
23+
foreach ($value as $key => $data) {
24+
unset($value[$key][ValueProcessorInterface::VALUE_HYDRATION_REFERENCE_KEY]);
25+
}
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\GraphQlResolverCache\Model\Resolver\Result\ValueProcessor\FlagSetter;
9+
10+
interface FlagSetterInterface
11+
{
12+
public function setFlagOnValue(&$value, string $flagValue): void;
13+
14+
public function unsetFlagFromValue(&$value): void;
15+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\GraphQlResolverCache\Model\Resolver\Result\ValueProcessor\FlagSetter;
9+
10+
use Magento\GraphQlResolverCache\Model\Resolver\Result\ValueProcessorInterface;
11+
12+
class Generic implements FlagSetterInterface
13+
{
14+
public function setFlagOnValue(&$value, string $flagValue): void
15+
{
16+
$value[ValueProcessorInterface::VALUE_HYDRATION_REFERENCE_KEY] = $flagValue;
17+
}
18+
19+
public function unsetFlagFromValue(&$value): void
20+
{
21+
unset($value[ValueProcessorInterface::VALUE_HYDRATION_REFERENCE_KEY]);
22+
}
23+
}

app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/ValueProcessorInterface.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@
1414
*/
1515
interface ValueProcessorInterface
1616
{
17+
/**
18+
* Key for data processing reference.
19+
*/
20+
public const VALUE_HYDRATION_REFERENCE_KEY = 'value_hydration_reference_key';
21+
1722
/**
1823
* Process the cached value after loading from cache for the given resolver.
1924
*

app/code/Magento/GraphQlResolverCache/etc/graphql/di.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
<preference for="Magento\GraphQlResolverCache\Model\Resolver\Result\HydratorProviderInterface" type="Magento\GraphQlResolverCache\Model\Resolver\Result\HydratorDehydratorProvider"/>
1111
<preference for="Magento\GraphQlResolverCache\Model\Resolver\Result\DehydratorProviderInterface" type="Magento\GraphQlResolverCache\Model\Resolver\Result\HydratorDehydratorProvider"/>
1212
<preference for="Magento\GraphQlResolverCache\Model\Resolver\Result\ValueProcessorInterface" type="Magento\GraphQlResolverCache\Model\Resolver\Result\ValueProcessor"/>
13+
<preference for="Magento\GraphQlResolverCache\Model\Resolver\Result\ValueProcessor\FlagSetter\FlagSetterInterface" type="Magento\GraphQlResolverCache\Model\Resolver\Result\ValueProcessor\FlagSetter\Generic"/>
14+
<preference for="Magento\GraphQlResolverCache\Model\Resolver\Result\ValueProcessor\FlagGetter\FlagGetterInterface" type="Magento\GraphQlResolverCache\Model\Resolver\Result\ValueProcessor\FlagGetter\Generic"/>
1315
<type name="Magento\Framework\GraphQl\Query\ResolverInterface">
1416
<plugin name="cacheResolverResult" type="Magento\GraphQlResolverCache\Model\Plugin\Resolver\Cache" sortOrder="20"/>
1517
</type>

0 commit comments

Comments
 (0)