Skip to content

Commit d6a7891

Browse files
committed
B2B-2658: Implement GraphQL Resolver Cache for Customer query
- small refactoring to avoid unnecessary configuration
1 parent aff7c81 commit d6a7891

File tree

7 files changed

+55
-46
lines changed

7 files changed

+55
-46
lines changed

app/code/Magento/GraphQlResolverCache/Model/Plugin/Resolver/Cache.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ public function aroundResolve(
123123

124124
if ($cachedResult !== false) {
125125
$returnValue = $this->serializer->unserialize($cachedResult);
126-
$this->valueProcessor->processCachedValueAfterLoad($subject, $cacheKey, $returnValue);
126+
$this->valueProcessor->processCachedValueAfterLoad($info, $subject, $cacheKey, $returnValue);
127127
return $returnValue;
128128
}
129129

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

Lines changed: 31 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
namespace Magento\GraphQlResolverCache\Model\Resolver\Result;
99

1010
use Magento\Framework\GraphQl\Query\ResolverInterface;
11+
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
1112
use Magento\Framework\ObjectManagerInterface;
1213
use Magento\GraphQlResolverCache\Model\Resolver\Result\ValueProcessor\FlagSetter\FlagSetterInterface;
1314
use Magento\GraphQlResolverCache\Model\Resolver\Result\ValueProcessor\FlagGetter\FlagGetterInterface;
@@ -40,7 +41,7 @@ class ValueProcessor implements ValueProcessorInterface
4041
/**
4142
* @var array
4243
*/
43-
private array $resolverProcessingFlagConfig;
44+
private array $typeConfig;
4445

4546
/**
4647
* @var ObjectManagerInterface
@@ -61,53 +62,58 @@ class ValueProcessor implements ValueProcessorInterface
6162
* @param HydratorProviderInterface $hydratorProvider
6263
* @param DehydratorProviderInterface $dehydratorProvider
6364
* @param ObjectManagerInterface $objectManager
64-
* @param array $resolverProcessingFlagConfig
65+
* @param FlagGetterInterface $defaultFlagGetter
66+
* @param FlagSetterInterface $defaultFlagSetter
67+
* @param array $typeConfig
6568
*/
6669
public function __construct(
6770
HydratorProviderInterface $hydratorProvider,
6871
DehydratorProviderInterface $dehydratorProvider,
6972
ObjectManagerInterface $objectManager,
70-
array $resolverProcessingFlagConfig = []
73+
FlagGetterInterface $defaultFlagGetter,
74+
FlagSetterInterface $defaultFlagSetter,
75+
array $typeConfig = []
7176
) {
7277
$this->hydratorProvider = $hydratorProvider;
7378
$this->dehydratorProvider = $dehydratorProvider;
74-
$this->resolverProcessingFlagConfig = $resolverProcessingFlagConfig;
79+
$this->typeConfig = $typeConfig;
7580
$this->objectManager = $objectManager;
76-
$this->defaultFlagGetter = $this->objectManager->get(FlagGetterInterface::class);
77-
$this->defaultFlagSetter = $this->objectManager->get(FlagSetterInterface::class);
81+
$this->defaultFlagGetter = $defaultFlagGetter;
82+
$this->defaultFlagSetter = $defaultFlagSetter;
7883
}
7984

8085
/**
81-
* Get flag setter fr the given resolver.
82-
*
83-
* @param ResolverInterface $resolver
86+
* Get flag setter for the resolver return type.
8487
*
88+
* @param ResolveInfo $info
8589
* @return FlagSetterInterface
8690
*/
87-
private function getFlagSetterForResolver(ResolverInterface $resolver): FlagSetterInterface
91+
private function getFlagSetterForType(ResolveInfo $info): FlagSetterInterface
8892
{
89-
foreach ($this->getResolverClassChain($resolver) as $className) {
90-
if (isset($this->resolverProcessingFlagConfig['setters'][$className])) {
91-
return $this->objectManager->get(
92-
$this->resolverProcessingFlagConfig['setters'][$className]
93-
);
94-
}
93+
if (isset($this->typeConfig['setters'][get_class($info->returnType)])) {
94+
return $this->objectManager->get(
95+
$this->typeConfig['setters'][get_class($info->returnType)]
96+
);
9597
}
96-
return $this->objectManager->get(FlagSetterInterface::class);
98+
return $this->defaultFlagSetter;
9799
}
98100

99101
/**
100102
* @inheritdoc
101103
*/
102-
public function processCachedValueAfterLoad(ResolverInterface $resolver, string $cacheKey, &$value): void
103-
{
104+
public function processCachedValueAfterLoad(
105+
ResolveInfo $info,
106+
ResolverInterface $resolver,
107+
string $cacheKey,
108+
&$value
109+
): void {
104110
if ($value === null) {
105111
return;
106112
}
107113
$hydrator = $this->hydratorProvider->getHydratorForResolver($resolver);
108114
if ($hydrator) {
109115
$this->hydrators[$cacheKey] = $hydrator;
110-
$this->getFlagSetterForResolver($resolver)->setFlagOnValue($value, $cacheKey);
116+
$this->getFlagSetterForType($info)->setFlagOnValue($value, $cacheKey);
111117
}
112118
}
113119

@@ -127,11 +133,15 @@ public function preProcessParentValue(array &$value): void
127133
*/
128134
private function hydrateData(&$value)
129135
{
136+
if ($value === null) {
137+
return;
138+
}
139+
// the parent value is always a single object that contains currently resolved value
130140
$reference = $this->defaultFlagGetter->getFlagFromValue($value) ?? null;
131141
if (isset($reference['cacheKey']) && isset($reference['index'])) {
132142
$cacheKey = $reference['cacheKey'];
133143
$index = $reference['index'];
134-
if ($value && $cacheKey) {
144+
if ($cacheKey) {
135145
if (isset($this->processedValues[$cacheKey][$index])) {
136146
$value = $this->processedValues[$cacheKey][$index];
137147
} elseif (isset($this->hydrators[$cacheKey])
@@ -155,19 +165,4 @@ public function preProcessValueBeforeCacheSave(ResolverInterface $resolver, &$va
155165
$dehydrator->dehydrate($value);
156166
}
157167
}
158-
159-
/**
160-
* Get class inheritance chain for the given resolver object.
161-
*
162-
* @param ResolverInterface $resolver
163-
* @return array
164-
*/
165-
private function getResolverClassChain(ResolverInterface $resolver): array
166-
{
167-
$resolverClasses = [trim(get_class($resolver), '\\')];
168-
foreach (class_parents($resolver) as $classParent) {
169-
$resolverClasses[] = trim($classParent, '\\');
170-
}
171-
return $resolverClasses;
172-
}
173168
}

app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/ValueProcessor/FlagGetter/Generic.php renamed to app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/ValueProcessor/FlagGetter/SingleObject.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
use Magento\GraphQlResolverCache\Model\Resolver\Result\ValueProcessorInterface;
1111

1212
/**
13-
* Generic flag getter.
13+
* Single entity object structure flag getter.
1414
*/
15-
class Generic implements FlagGetterInterface
15+
class SingleObject implements FlagGetterInterface
1616
{
1717
/**
1818
* @inheritdoc

app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/ValueProcessor/FlagSetter/Enumerable.php renamed to app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/ValueProcessor/FlagSetter/ListOfObjects.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
use Magento\GraphQlResolverCache\Model\Resolver\Result\ValueProcessorInterface;
1111

1212
/**
13-
* Enumerable value flag setter/unsetter.
13+
* List of objects value flag setter/unsetter.
1414
*/
15-
class Enumerable implements FlagSetterInterface
15+
class ListOfObjects implements FlagSetterInterface
1616
{
1717
/**
1818
* @inheritdoc

app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/ValueProcessor/FlagSetter/Generic.php renamed to app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/ValueProcessor/FlagSetter/SingleObject.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
use Magento\GraphQlResolverCache\Model\Resolver\Result\ValueProcessorInterface;
1111

1212
/**
13-
* Generic flag value setter/unsetter.
13+
* Single entity object flag value setter/unsetter.
1414
*/
15-
class Generic implements FlagSetterInterface
15+
class SingleObject implements FlagSetterInterface
1616
{
1717
/**
1818
* @inheritdoc

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
namespace Magento\GraphQlResolverCache\Model\Resolver\Result;
99

1010
use Magento\Framework\GraphQl\Query\ResolverInterface;
11+
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
1112

1213
/**
1314
* Value processor for resolved value and parent resolver value.
@@ -22,12 +23,18 @@ interface ValueProcessorInterface
2223
/**
2324
* Process the cached value after loading from cache for the given resolver.
2425
*
26+
* @param ResolveInfo $info
2527
* @param ResolverInterface $resolver
2628
* @param string $cacheKey
2729
* @param array|mixed $value
2830
* @return void
2931
*/
30-
public function processCachedValueAfterLoad(ResolverInterface $resolver, string $cacheKey, &$value): void;
32+
public function processCachedValueAfterLoad(
33+
ResolveInfo $info,
34+
ResolverInterface $resolver,
35+
string $cacheKey,
36+
&$value
37+
): void;
3138

3239
/**
3340
* Preprocess parent resolver resolved array for currently executed array-element resolver.

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,16 @@
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"/>
13+
<preference for="Magento\GraphQlResolverCache\Model\Resolver\Result\ValueProcessor\FlagSetter\FlagSetterInterface" type="Magento\GraphQlResolverCache\Model\Resolver\Result\ValueProcessor\FlagSetter\SingleObject"/>
14+
<preference for="Magento\GraphQlResolverCache\Model\Resolver\Result\ValueProcessor\FlagGetter\FlagGetterInterface" type="Magento\GraphQlResolverCache\Model\Resolver\Result\ValueProcessor\FlagGetter\SingleObject"/>
1515
<type name="Magento\Framework\GraphQl\Query\ResolverInterface">
1616
<plugin name="cacheResolverResult" type="Magento\GraphQlResolverCache\Model\Plugin\Resolver\Cache" sortOrder="20"/>
1717
</type>
18+
<type name="Magento\GraphQlResolverCache\Model\Resolver\Result\ValueProcessor">
19+
<arguments>
20+
<argument name="typeConfig" xsi:type="array">
21+
<item name="Magento\Framework\GraphQl\Schema\Type\ListOfType" xsi:type="string">Magento\GraphQlResolverCache\Model\Resolver\Result\ValueProcessor\FlagSetter\ListOfObjects</item>
22+
</argument>
23+
</arguments>
24+
</type>
1825
</config>

0 commit comments

Comments
 (0)