From 1c01fda8502fe4f2ad7b8eb5706bd25d39134edb Mon Sep 17 00:00:00 2001 From: Roman Hanin Date: Fri, 9 Jun 2023 10:45:15 -0500 Subject: [PATCH 01/10] B2B-2658: Implement GraphQL Resolver Cache for Customer query - updated interface doc --- .../Result/CacheKey/GenericFactorProviderInterface.php | 5 +++++ .../Result/CacheKey/ParentValueFactorProviderInterface.php | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/CacheKey/GenericFactorProviderInterface.php b/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/CacheKey/GenericFactorProviderInterface.php index 7e2d03f78bb63..7bbb64a2f6e0c 100644 --- a/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/CacheKey/GenericFactorProviderInterface.php +++ b/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/CacheKey/GenericFactorProviderInterface.php @@ -24,7 +24,12 @@ public function getFactorName(): string; /** * Returns the runtime value that should be used as factor. * + * Throws an Exception if factor value cannot be resolved. + * * @param ContextInterface $context + * + * @throws \Exception + * * @return string */ public function getFactorValue(ContextInterface $context): string; diff --git a/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/CacheKey/ParentValueFactorProviderInterface.php b/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/CacheKey/ParentValueFactorProviderInterface.php index 194e5832dfc03..1227a939e181b 100644 --- a/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/CacheKey/ParentValueFactorProviderInterface.php +++ b/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/CacheKey/ParentValueFactorProviderInterface.php @@ -37,8 +37,13 @@ public function isRequiredOrigData(): bool; /** * Returns the runtime value that should be used as factor. * + * Throws an Exception if factor value cannot be resolved. + * * @param ContextInterface $context * @param array $parentValue + * + * @throws \Exception + * * @return string */ public function getFactorValue(ContextInterface $context, array $parentValue): string; From c18e9acdeca48091807d41a8a4a1b4ae0bc72c67 Mon Sep 17 00:00:00 2001 From: Roman Hanin Date: Thu, 15 Jun 2023 11:43:22 -0500 Subject: [PATCH 02/10] B2B-2658: Implement resolver cache framework - model prehydration step --- .../Product/MediaGallery/ProductModelDehydrator.php | 3 ++- .../Product/MediaGallery/ProductModelHydrator.php | 13 +++++++++++++ .../Model/Resolver/Cache/Customer/ModelHydrator.php | 8 ++++++++ .../Model/Resolver/Result/HydratorComposite.php | 13 +++++++++++++ .../Model/Resolver/Result/HydratorInterface.php | 12 +++++++++++- .../Model/Resolver/Result/ValueProcessor.php | 1 + 6 files changed, 48 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelDehydrator.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelDehydrator.php index 75d1c44262ef8..ace175750aaac 100644 --- a/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelDehydrator.php +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelDehydrator.php @@ -47,9 +47,10 @@ public function dehydrate(array &$resolvedValue): void if (count($resolvedValue) > 0) { $keys = array_keys($resolvedValue); $firstKey = array_pop($keys); + // assign data to the first entity only to normalize record $this->dehydrateMediaGalleryEntity($resolvedValue[$firstKey]); foreach ($keys as $key) { - $resolvedValue[$key]['model_info'] = &$resolvedValue[$firstKey]['model_info']; + unset($resolvedValue[$key]['model']); } } } diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelHydrator.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelHydrator.php index f15bc9ef0dbc8..148eeefd5e074 100644 --- a/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelHydrator.php +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelHydrator.php @@ -62,4 +62,17 @@ public function hydrate(array &$resolverData): void unset($resolverData['model_info']); } } + + /** + * @inheritDoc + */ + public function prehydrate(array &$resolvedData): void + { + $keys = array_keys($resolvedData); + $firstKey = array_pop($keys); + // restore original data structure before normalization step in the dehydrator. + foreach ($resolvedData as &$value) { + $value['mdoel_info'] = &$resolvedData[$firstKey]['model_info']; + } + } } diff --git a/app/code/Magento/CustomerGraphQl/Model/Resolver/Cache/Customer/ModelHydrator.php b/app/code/Magento/CustomerGraphQl/Model/Resolver/Cache/Customer/ModelHydrator.php index 4b4c187bbd949..c3f9aa57ac1af 100644 --- a/app/code/Magento/CustomerGraphQl/Model/Resolver/Cache/Customer/ModelHydrator.php +++ b/app/code/Magento/CustomerGraphQl/Model/Resolver/Cache/Customer/ModelHydrator.php @@ -59,4 +59,12 @@ public function hydrate(array &$resolverData): void $resolverData['model'] = $this->customerModels[$resolverData['model_id']]; } } + + /** + * @inheritDoc + */ + public function prehydrate(array &$resolvedData): void + { + return; + } } diff --git a/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorComposite.php b/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorComposite.php index d08323f2efddf..34b251e9b6067 100644 --- a/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorComposite.php +++ b/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorComposite.php @@ -37,4 +37,17 @@ public function hydrate(array &$resolverData): void $hydrator->hydrate($resolverData); } } + + /** + * @inheritDoc + */ + public function prehydrate(array &$resolvedData): void + { + if (empty($resolverData)) { + return; + } + foreach ($this->hydrators as $hydrator) { + $hydrator->prehydrate($resolverData); + } + } } diff --git a/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorInterface.php b/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorInterface.php index 95660f6ed5771..bd709531419c6 100644 --- a/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorInterface.php +++ b/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorInterface.php @@ -13,10 +13,20 @@ interface HydratorInterface { /** - * Hydrate resolved data. + * Hydration of the resolved data may be needed before passing to child resolver. * * @param array $resolverData * @return void */ public function hydrate(array &$resolverData): void; + + /** + * Pre-hydration may occur right after cache read on the whole cached record. + * + * Data structure corresponds to dehydrated result in DehydratorInterface. + * + * @param array $resolvedData + * @return void + */ + public function prehydrate(array &$resolvedData): void; } diff --git a/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/ValueProcessor.php b/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/ValueProcessor.php index f95dee244c958..7edccc17f6e60 100644 --- a/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/ValueProcessor.php +++ b/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/ValueProcessor.php @@ -113,6 +113,7 @@ public function processCachedValueAfterLoad( $hydrator = $this->hydratorProvider->getHydratorForResolver($resolver); if ($hydrator) { $this->hydrators[$cacheKey] = $hydrator; + $hydrator->prehydrate($value); $this->getFlagSetterForType($info)->setFlagOnValue($value, $cacheKey); } } From ad51aa5df202442f734f606fa891f00f23e2fbeb Mon Sep 17 00:00:00 2001 From: Roman Hanin Date: Thu, 15 Jun 2023 11:47:46 -0500 Subject: [PATCH 03/10] B2B-2658: Implement GraphQL Resolver Cache for Customer query --- .../Cache/Product/MediaGallery/ProductModelDehydrator.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelDehydrator.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelDehydrator.php index ace175750aaac..900c659d16737 100644 --- a/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelDehydrator.php +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelDehydrator.php @@ -50,7 +50,9 @@ public function dehydrate(array &$resolvedValue): void // assign data to the first entity only to normalize record $this->dehydrateMediaGalleryEntity($resolvedValue[$firstKey]); foreach ($keys as $key) { - unset($resolvedValue[$key]['model']); + if ($key !== $firstKey) { + unset($resolvedValue[$key]['model']); + } } } } From 290ab3cb031c05c287c4f009062d75c4ac643646 Mon Sep 17 00:00:00 2001 From: Roman Hanin Date: Thu, 15 Jun 2023 11:50:10 -0500 Subject: [PATCH 04/10] B2B-2658: Implement GraphQL Resolver Cache for Customer query --- .../Result/CacheKey/GenericFactorProviderInterface.php | 5 ----- .../Result/CacheKey/ParentValueFactorProviderInterface.php | 5 ----- 2 files changed, 10 deletions(-) diff --git a/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/CacheKey/GenericFactorProviderInterface.php b/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/CacheKey/GenericFactorProviderInterface.php index 7bbb64a2f6e0c..7e2d03f78bb63 100644 --- a/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/CacheKey/GenericFactorProviderInterface.php +++ b/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/CacheKey/GenericFactorProviderInterface.php @@ -24,12 +24,7 @@ public function getFactorName(): string; /** * Returns the runtime value that should be used as factor. * - * Throws an Exception if factor value cannot be resolved. - * * @param ContextInterface $context - * - * @throws \Exception - * * @return string */ public function getFactorValue(ContextInterface $context): string; diff --git a/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/CacheKey/ParentValueFactorProviderInterface.php b/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/CacheKey/ParentValueFactorProviderInterface.php index 6e7e3981647e4..1df48e5d30860 100644 --- a/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/CacheKey/ParentValueFactorProviderInterface.php +++ b/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/CacheKey/ParentValueFactorProviderInterface.php @@ -37,13 +37,8 @@ public function isRequiredOrigData(): bool; /** * Returns the runtime value that should be used as factor. * - * Throws an Exception if factor value cannot be resolved. - * * @param ContextInterface $context * @param array $parentValue - * - * @throws \Exception - * * @return string * @throws \InvalidArgumentException */ From 805a0f4ebd6876a9c2add3644ffd0467daf23296 Mon Sep 17 00:00:00 2001 From: Roman Hanin Date: Thu, 15 Jun 2023 16:00:31 -0500 Subject: [PATCH 05/10] B2B-2658: Implement GraphQL Resolver Cache for Customer query --- .../Model/Resolver/Result/HydratorDehydratorProviderTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/tests/integration/testsuite/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorDehydratorProviderTest.php b/dev/tests/integration/testsuite/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorDehydratorProviderTest.php index 635c23237d838..db3fd71d1d1d3 100644 --- a/dev/tests/integration/testsuite/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorDehydratorProviderTest.php +++ b/dev/tests/integration/testsuite/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorDehydratorProviderTest.php @@ -105,7 +105,7 @@ public function testHydratorChainProvider() $testModelHydrator = $this->getMockBuilder(HydratorInterface::class) ->disableOriginalConstructor() ->setMockClassName('TestResolverModelHydrator') - ->onlyMethods(['hydrate']) + ->onlyMethods(['hydrate', 'prehydrate']) ->getMock(); $testModelHydrator->expects($this->once()) ->method('hydrate') @@ -117,7 +117,7 @@ public function testHydratorChainProvider() $testNestedHydrator = $this->getMockBuilder(HydratorInterface::class) ->disableOriginalConstructor() ->setMockClassName('TestResolverNestedItemsHydrator') - ->onlyMethods(['hydrate']) + ->onlyMethods(['hydrate', 'prehydrate']) ->getMock(); $testNestedHydrator->expects($this->once()) ->method('hydrate') From 97e04687572a114320062e9f33732eee73790192 Mon Sep 17 00:00:00 2001 From: Roman Hanin Date: Thu, 15 Jun 2023 16:02:43 -0500 Subject: [PATCH 06/10] B2B-2658: Implement GraphQL Resolver Cache for Customer query --- .../Cache/Product/MediaGallery/ProductModelHydrator.php | 8 ++++---- .../Model/Resolver/Cache/Customer/ModelHydrator.php | 3 +-- .../Model/Resolver/Result/HydratorComposite.php | 2 +- .../Model/Resolver/Result/HydratorInterface.php | 4 ++-- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelHydrator.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelHydrator.php index 148eeefd5e074..a51557c7a83ee 100644 --- a/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelHydrator.php +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelHydrator.php @@ -66,13 +66,13 @@ public function hydrate(array &$resolverData): void /** * @inheritDoc */ - public function prehydrate(array &$resolvedData): void + public function prehydrate(array &$resolverData): void { - $keys = array_keys($resolvedData); + $keys = array_keys($resolverData); $firstKey = array_pop($keys); // restore original data structure before normalization step in the dehydrator. - foreach ($resolvedData as &$value) { - $value['mdoel_info'] = &$resolvedData[$firstKey]['model_info']; + foreach ($resolverData as &$value) { + $value['mdoel_info'] = &$resolverData[$firstKey]['model_info']; } } } diff --git a/app/code/Magento/CustomerGraphQl/Model/Resolver/Cache/Customer/ModelHydrator.php b/app/code/Magento/CustomerGraphQl/Model/Resolver/Cache/Customer/ModelHydrator.php index c3f9aa57ac1af..2e9c3d1d57fe3 100644 --- a/app/code/Magento/CustomerGraphQl/Model/Resolver/Cache/Customer/ModelHydrator.php +++ b/app/code/Magento/CustomerGraphQl/Model/Resolver/Cache/Customer/ModelHydrator.php @@ -63,8 +63,7 @@ public function hydrate(array &$resolverData): void /** * @inheritDoc */ - public function prehydrate(array &$resolvedData): void + public function prehydrate(array &$resolverData): void { - return; } } diff --git a/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorComposite.php b/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorComposite.php index 34b251e9b6067..0a2f3d8669916 100644 --- a/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorComposite.php +++ b/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorComposite.php @@ -41,7 +41,7 @@ public function hydrate(array &$resolverData): void /** * @inheritDoc */ - public function prehydrate(array &$resolvedData): void + public function prehydrate(array &$resolverData): void { if (empty($resolverData)) { return; diff --git a/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorInterface.php b/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorInterface.php index bd709531419c6..66d4e41aaf426 100644 --- a/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorInterface.php +++ b/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorInterface.php @@ -25,8 +25,8 @@ public function hydrate(array &$resolverData): void; * * Data structure corresponds to dehydrated result in DehydratorInterface. * - * @param array $resolvedData + * @param array $resolverData * @return void */ - public function prehydrate(array &$resolvedData): void; + public function prehydrate(array &$resolverData): void; } From ffed4f2982e3e847071227780c4f7dcf54e9de08 Mon Sep 17 00:00:00 2001 From: Roman Hanin Date: Mon, 19 Jun 2023 10:35:02 -0500 Subject: [PATCH 07/10] B2B-2658: Implement GraphQL Resolver Cache for Customer query - prehydration --- .../MediaGallery/ProductModelDehydrator.php | 6 ++--- .../MediaGallery/ProductModelHydrator.php | 9 ++++---- .../Resolver/Cache/Customer/ModelHydrator.php | 7 ------ .../Resolver/Result/HydratorComposite.php | 14 +++++++----- .../Resolver/Result/HydratorInterface.php | 12 +--------- .../Resolver/Result/PrehydratorInterface.php | 22 +++++++++++++++++++ .../Result/HydratorDehydratorProviderTest.php | 8 +++++-- 7 files changed, 44 insertions(+), 34 deletions(-) create mode 100644 app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/PrehydratorInterface.php diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelDehydrator.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelDehydrator.php index 900c659d16737..e53b4aa0d7663 100644 --- a/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelDehydrator.php +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelDehydrator.php @@ -45,11 +45,9 @@ public function __construct( public function dehydrate(array &$resolvedValue): void { if (count($resolvedValue) > 0) { - $keys = array_keys($resolvedValue); - $firstKey = array_pop($keys); - // assign data to the first entity only to normalize record + $firstKey = array_key_first($resolvedValue); $this->dehydrateMediaGalleryEntity($resolvedValue[$firstKey]); - foreach ($keys as $key) { + foreach ($resolvedValue as $key => $value) { if ($key !== $firstKey) { unset($resolvedValue[$key]['model']); } diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelHydrator.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelHydrator.php index a51557c7a83ee..d59497b30af61 100644 --- a/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelHydrator.php +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelHydrator.php @@ -11,11 +11,12 @@ use Magento\Catalog\Model\ProductFactory; use Magento\Framework\EntityManager\HydratorPool; use Magento\GraphQlResolverCache\Model\Resolver\Result\HydratorInterface; +use Magento\GraphQlResolverCache\Model\Resolver\Result\PrehydratorInterface; /** * Product resolver data hydrator to rehydrate propagated model. */ -class ProductModelHydrator implements HydratorInterface +class ProductModelHydrator implements HydratorInterface, PrehydratorInterface { /** * @var ProductFactory @@ -68,11 +69,9 @@ public function hydrate(array &$resolverData): void */ public function prehydrate(array &$resolverData): void { - $keys = array_keys($resolverData); - $firstKey = array_pop($keys); - // restore original data structure before normalization step in the dehydrator. + $firstKey = array_key_first($resolverData); foreach ($resolverData as &$value) { - $value['mdoel_info'] = &$resolverData[$firstKey]['model_info']; + $value['model_info'] = &$resolverData[$firstKey]['model_info']; } } } diff --git a/app/code/Magento/CustomerGraphQl/Model/Resolver/Cache/Customer/ModelHydrator.php b/app/code/Magento/CustomerGraphQl/Model/Resolver/Cache/Customer/ModelHydrator.php index 2e9c3d1d57fe3..4b4c187bbd949 100644 --- a/app/code/Magento/CustomerGraphQl/Model/Resolver/Cache/Customer/ModelHydrator.php +++ b/app/code/Magento/CustomerGraphQl/Model/Resolver/Cache/Customer/ModelHydrator.php @@ -59,11 +59,4 @@ public function hydrate(array &$resolverData): void $resolverData['model'] = $this->customerModels[$resolverData['model_id']]; } } - - /** - * @inheritDoc - */ - public function prehydrate(array &$resolverData): void - { - } } diff --git a/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorComposite.php b/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorComposite.php index 0a2f3d8669916..f88e3ecb9b91b 100644 --- a/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorComposite.php +++ b/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorComposite.php @@ -10,15 +10,15 @@ /** * Composite hydrator for resolver result data. */ -class HydratorComposite implements HydratorInterface +class HydratorComposite implements HydratorInterface, PrehydratorInterface { /** - * @var HydratorInterface[] + * @var HydratorInterface[]|PrehydratorInterface[] */ private array $hydrators = []; /** - * @param HydratorInterface[] $hydrators + * @param HydratorInterface[]|PrehydratorInterface[] $hydrators */ public function __construct(array $hydrators = []) { @@ -34,7 +34,9 @@ public function hydrate(array &$resolverData): void return; } foreach ($this->hydrators as $hydrator) { - $hydrator->hydrate($resolverData); + if ($hydrator instanceof HydratorInterface) { + $hydrator->hydrate($resolverData); + } } } @@ -47,7 +49,9 @@ public function prehydrate(array &$resolverData): void return; } foreach ($this->hydrators as $hydrator) { - $hydrator->prehydrate($resolverData); + if ($hydrator instanceof PrehydratorInterface) { + $hydrator->prehydrate($resolverData); + } } } } diff --git a/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorInterface.php b/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorInterface.php index 66d4e41aaf426..98698f49bc04d 100644 --- a/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorInterface.php +++ b/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorInterface.php @@ -13,20 +13,10 @@ interface HydratorInterface { /** - * Hydration of the resolved data may be needed before passing to child resolver. + * Hydrates resolved data before passing to child resolver. * * @param array $resolverData * @return void */ public function hydrate(array &$resolverData): void; - - /** - * Pre-hydration may occur right after cache read on the whole cached record. - * - * Data structure corresponds to dehydrated result in DehydratorInterface. - * - * @param array $resolverData - * @return void - */ - public function prehydrate(array &$resolverData): void; } diff --git a/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/PrehydratorInterface.php b/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/PrehydratorInterface.php new file mode 100644 index 0000000000000..120b4d45f9519 --- /dev/null +++ b/app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/PrehydratorInterface.php @@ -0,0 +1,22 @@ +getMockBuilder(HydratorInterface::class) + $testModelHydrator = $this->getMockBuilder(TestCombinedHydratorPrehydratorInterface::class) ->disableOriginalConstructor() ->setMockClassName('TestResolverModelHydrator') ->onlyMethods(['hydrate', 'prehydrate']) @@ -117,7 +121,7 @@ public function testHydratorChainProvider() $testNestedHydrator = $this->getMockBuilder(HydratorInterface::class) ->disableOriginalConstructor() ->setMockClassName('TestResolverNestedItemsHydrator') - ->onlyMethods(['hydrate', 'prehydrate']) + ->onlyMethods(['hydrate']) ->getMock(); $testNestedHydrator->expects($this->once()) ->method('hydrate') From e7c2d22dbd193396ff4429c69ff5e05d9eb0d8e4 Mon Sep 17 00:00:00 2001 From: Roman Hanin Date: Mon, 19 Jun 2023 11:40:33 -0500 Subject: [PATCH 08/10] B2B-2658: Implement GraphQL Resolver Cache for Customer query - prehydration --- .../Cache/Product/MediaGallery/ProductModelDehydrator.php | 4 ++-- .../Model/Resolver/Result/HydratorDehydratorProviderTest.php | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelDehydrator.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelDehydrator.php index e53b4aa0d7663..4c78b013825f3 100644 --- a/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelDehydrator.php +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Cache/Product/MediaGallery/ProductModelDehydrator.php @@ -47,9 +47,9 @@ public function dehydrate(array &$resolvedValue): void if (count($resolvedValue) > 0) { $firstKey = array_key_first($resolvedValue); $this->dehydrateMediaGalleryEntity($resolvedValue[$firstKey]); - foreach ($resolvedValue as $key => $value) { + foreach ($resolvedValue as $key => &$value) { if ($key !== $firstKey) { - unset($resolvedValue[$key]['model']); + unset($value['model']); } } } diff --git a/dev/tests/integration/testsuite/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorDehydratorProviderTest.php b/dev/tests/integration/testsuite/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorDehydratorProviderTest.php index dcce92c6c4dba..4f9eb355660ed 100644 --- a/dev/tests/integration/testsuite/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorDehydratorProviderTest.php +++ b/dev/tests/integration/testsuite/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorDehydratorProviderTest.php @@ -12,9 +12,11 @@ use Magento\StoreGraphQl\Model\Resolver\StoreConfigResolver; use Magento\TestFramework\Helper\Bootstrap; +// phpcs:disable interface TestCombinedHydratorPrehydratorInterface extends HydratorInterface, PrehydratorInterface { } +// phpcs:enable class HydratorDehydratorProviderTest extends \PHPUnit\Framework\TestCase { From 43eedfd581b3019d2d75639359220060c5baee1a Mon Sep 17 00:00:00 2001 From: Roman Hanin Date: Tue, 20 Jun 2023 12:52:38 -0500 Subject: [PATCH 09/10] B2B-2658: Implement GraphQL Resolver Cache for Customer query - prehydration --- .../Model/Resolver/Result/HydratorDehydratorProviderTest.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dev/tests/integration/testsuite/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorDehydratorProviderTest.php b/dev/tests/integration/testsuite/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorDehydratorProviderTest.php index 4f9eb355660ed..ce3a21409e5d6 100644 --- a/dev/tests/integration/testsuite/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorDehydratorProviderTest.php +++ b/dev/tests/integration/testsuite/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorDehydratorProviderTest.php @@ -7,6 +7,7 @@ namespace Magento\GraphQlResolverCache\Model\Resolver\Result; +use Magento\CatalogGraphQl\Model\Resolver\Cache\Product\MediaGallery\ProductModelHydrator; use Magento\Framework\DataObject; use Magento\Framework\GraphQl\Query\ResolverInterface; use Magento\StoreGraphQl\Model\Resolver\StoreConfigResolver; @@ -108,7 +109,7 @@ public function testHydratorChainProvider() unset($resolverData['model']); }); - $testModelHydrator = $this->getMockBuilder(TestCombinedHydratorPrehydratorInterface::class) + $testModelHydrator = $this->getMockBuilder(ProductModelHydrator::class) ->disableOriginalConstructor() ->setMockClassName('TestResolverModelHydrator') ->onlyMethods(['hydrate', 'prehydrate']) @@ -160,6 +161,7 @@ public function testHydratorChainProvider() $this->objectManager->removeSharedInstance('TestResolverModelHydrator'); $this->objectManager->removeSharedInstance('TestResolverNestedItemsHydrator'); + $this->objectManager->removeSharedInstance('TestResolverModelDehydrator'); } /** From 1d7643d9708edb774072254cf96de5f8a1b136c8 Mon Sep 17 00:00:00 2001 From: Roman Hanin Date: Tue, 20 Jun 2023 13:48:47 -0500 Subject: [PATCH 10/10] B2B-2658: Implement GraphQL Resolver Cache for Customer query - prehydration --- .../Resolver/Result/HydratorDehydratorProviderTest.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/dev/tests/integration/testsuite/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorDehydratorProviderTest.php b/dev/tests/integration/testsuite/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorDehydratorProviderTest.php index ce3a21409e5d6..7c912ff411195 100644 --- a/dev/tests/integration/testsuite/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorDehydratorProviderTest.php +++ b/dev/tests/integration/testsuite/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorDehydratorProviderTest.php @@ -13,12 +13,6 @@ use Magento\StoreGraphQl\Model\Resolver\StoreConfigResolver; use Magento\TestFramework\Helper\Bootstrap; -// phpcs:disable -interface TestCombinedHydratorPrehydratorInterface extends HydratorInterface, PrehydratorInterface -{ -} -// phpcs:enable - class HydratorDehydratorProviderTest extends \PHPUnit\Framework\TestCase { /**