From 7b1c4ddabf189d64cdb9ab43f337c21710f933c1 Mon Sep 17 00:00:00 2001 From: Martin Hansen Date: Thu, 12 Jul 2018 12:08:55 -0300 Subject: [PATCH 1/8] fix regexp when category being filtered is root category --- .../Resolver/Products/DataProvider/CategoryTree.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php index 3c01579410638..f0002b195a2dd 100644 --- a/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php @@ -94,8 +94,17 @@ public function getTree(ResolveInfo $resolveInfo, int $rootCategoryId) : array $this->joinAttributesRecursively($collection, $categoryQuery); $depth = $this->depthCalculator->calculate($categoryQuery); $level = $this->levelCalculator->calculate($rootCategoryId); + + // If root category is being filter, we've to remove first slash + if($rootCategoryId == 1) { + $regExpPathFilter = sprintf('.*%s/[/0-9]*$', $rootCategoryId); + } else { + $regExpPathFilter = sprintf('.*/%s/[/0-9]*$', $rootCategoryId); + } + //Search for desired part of category tree - $collection->addPathFilter(sprintf('.*/%s/[/0-9]*$', $rootCategoryId)); + $collection->addPathFilter($regExpPathFilter); + $collection->addFieldToFilter('level', ['gt' => $level]); $collection->addFieldToFilter('level', ['lteq' => $level + $depth - self::DEPTH_OFFSET]); $collection->setOrder('level'); From 10afe1de0ddb5d7c8c195f424eea6e1990ccc203 Mon Sep 17 00:00:00 2001 From: Martin Hansen Date: Fri, 13 Jul 2018 10:15:03 -0300 Subject: [PATCH 2/8] improve code styling after IF keyword --- .../Model/Resolver/Products/DataProvider/CategoryTree.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php index f0002b195a2dd..4ea82dbf0564d 100644 --- a/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php @@ -96,7 +96,7 @@ public function getTree(ResolveInfo $resolveInfo, int $rootCategoryId) : array $level = $this->levelCalculator->calculate($rootCategoryId); // If root category is being filter, we've to remove first slash - if($rootCategoryId == 1) { + if ($rootCategoryId == 1) { $regExpPathFilter = sprintf('.*%s/[/0-9]*$', $rootCategoryId); } else { $regExpPathFilter = sprintf('.*/%s/[/0-9]*$', $rootCategoryId); From 0ba4b7176b2015828574de88be918c75b647fcc2 Mon Sep 17 00:00:00 2001 From: Martin Hansen Date: Thu, 19 Jul 2018 10:20:17 -0300 Subject: [PATCH 3/8] replace hardcode category root id number with Category `THE_ROOT_ID` const --- .../Model/Resolver/Products/DataProvider/CategoryTree.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php index 4ea82dbf0564d..783107be60451 100644 --- a/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php @@ -17,6 +17,7 @@ use Magento\Catalog\Model\ResourceModel\Category\Collection; use Magento\Catalog\Model\ResourceModel\Category\CollectionFactory; use Magento\CatalogGraphQl\Model\AttributesJoiner; +use Magento\Catalog\Model\Category; /** * Category tree data provider @@ -96,7 +97,7 @@ public function getTree(ResolveInfo $resolveInfo, int $rootCategoryId) : array $level = $this->levelCalculator->calculate($rootCategoryId); // If root category is being filter, we've to remove first slash - if ($rootCategoryId == 1) { + if ($rootCategoryId == Category::TREE_ROOT_ID) { $regExpPathFilter = sprintf('.*%s/[/0-9]*$', $rootCategoryId); } else { $regExpPathFilter = sprintf('.*/%s/[/0-9]*$', $rootCategoryId); From 4195613f54f0f9e3977a00ac0f3fcbee0c742080 Mon Sep 17 00:00:00 2001 From: Valeriy Nayda Date: Mon, 1 Oct 2018 13:36:26 +0300 Subject: [PATCH 4/8] GraphQL-123: Fix regexp when filter by root category id -- fix coupling between object in CategoryTree --- .../Model/Resolver/CategoryTree.php | 14 ++++- .../Products/DataProvider/CategoryTree.php | 40 +++----------- .../ExtractDataFromCategoryTree.php | 52 +++++++++++++++++++ 3 files changed, 70 insertions(+), 36 deletions(-) create mode 100644 app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/ExtractDataFromCategoryTree.php diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/CategoryTree.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/CategoryTree.php index 6d9f5e33dd55b..e890145840bbe 100644 --- a/app/code/Magento/CatalogGraphQl/Model/Resolver/CategoryTree.php +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/CategoryTree.php @@ -7,6 +7,7 @@ namespace Magento\CatalogGraphQl\Model\Resolver; +use Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\ExtractDataFromCategoryTree; use Magento\Framework\GraphQl\Schema\Type\ResolveInfo; use Magento\Framework\GraphQl\Config\Element\Field; use Magento\Framework\GraphQl\Exception\GraphQlInputException; @@ -27,13 +28,21 @@ class CategoryTree implements ResolverInterface */ private $categoryTree; + /** + * @var ExtractDataFromCategoryTree + */ + private $extractDataFromCategoryTree; + /** * @param \Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\CategoryTree $categoryTree + * @param ExtractDataFromCategoryTree $extractDataFromCategoryTree */ public function __construct( - \Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\CategoryTree $categoryTree + \Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\CategoryTree $categoryTree, + ExtractDataFromCategoryTree $extractDataFromCategoryTree ) { $this->categoryTree = $categoryTree; + $this->extractDataFromCategoryTree = $extractDataFromCategoryTree; } /** @@ -62,7 +71,8 @@ public function resolve(Field $field, $context, ResolveInfo $info, array $value $rootCategoryId = $this->getCategoryId($args); $categoriesTree = $this->categoryTree->getTree($info, $rootCategoryId); if (!empty($categoriesTree)) { - return current($categoriesTree); + $result = $this->extractDataFromCategoryTree->execute($categoriesTree); + return current($result); } else { return null; } diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php index 691ec93feb825..0e0f525e114c1 100644 --- a/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php @@ -9,7 +9,6 @@ use GraphQL\Language\AST\FieldNode; use Magento\CatalogGraphQl\Model\Category\DepthCalculator; -use Magento\CatalogGraphQl\Model\Category\Hydrator; use Magento\CatalogGraphQl\Model\Category\LevelCalculator; use Magento\Framework\EntityManager\MetadataPool; use Magento\Framework\GraphQl\Schema\Type\ResolveInfo; @@ -54,41 +53,35 @@ class CategoryTree */ private $metadata; - /** - * @var Hydrator - */ - private $hydrator; - /** * @param CollectionFactory $collectionFactory * @param AttributesJoiner $attributesJoiner * @param DepthCalculator $depthCalculator * @param LevelCalculator $levelCalculator * @param MetadataPool $metadata - * @param Hydrator $hydrator */ public function __construct( CollectionFactory $collectionFactory, AttributesJoiner $attributesJoiner, DepthCalculator $depthCalculator, LevelCalculator $levelCalculator, - MetadataPool $metadata, - Hydrator $hydrator + MetadataPool $metadata ) { $this->collectionFactory = $collectionFactory; $this->attributesJoiner = $attributesJoiner; $this->depthCalculator = $depthCalculator; $this->levelCalculator = $levelCalculator; $this->metadata = $metadata; - $this->hydrator = $hydrator; } /** + * Get category tree + * * @param ResolveInfo $resolveInfo * @param int $rootCategoryId - * @return array + * @return \Iterator */ - public function getTree(ResolveInfo $resolveInfo, int $rootCategoryId) : array + public function getTree(ResolveInfo $resolveInfo, int $rootCategoryId): \Iterator { $categoryQuery = $resolveInfo->fieldNodes[0]; $collection = $this->collectionFactory->create(); @@ -113,28 +106,7 @@ public function getTree(ResolveInfo $resolveInfo, int $rootCategoryId) : array $this->metadata->getMetadata(CategoryInterface::class)->getIdentifierField() . ' = ?', $rootCategoryId ); - return $this->processTree($collection->getIterator()); - } - - /** - * @param \Iterator $iterator - * @return array - */ - private function processTree(\Iterator $iterator) : array - { - $tree = []; - while ($iterator->valid()) { - /** @var CategoryInterface $category */ - $category = $iterator->current(); - $iterator->next(); - $nextCategory = $iterator->current(); - $tree[$category->getId()] = $this->hydrator->hydrateCategory($category); - if ($nextCategory && (int) $nextCategory->getLevel() !== (int) $category->getLevel()) { - $tree[$category->getId()]['children'] = $this->processTree($iterator); - } - } - - return $tree; + return $collection->getIterator(); } /** diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/ExtractDataFromCategoryTree.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/ExtractDataFromCategoryTree.php new file mode 100644 index 0000000000000..b9376865d751d --- /dev/null +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/ExtractDataFromCategoryTree.php @@ -0,0 +1,52 @@ +categoryHydrator = $categoryHydrator; + } + + /** + * @param \Iterator $iterator + * @return array + */ + public function execute(\Iterator $iterator): array + { + $tree = []; + while ($iterator->valid()) { + /** @var CategoryInterface $category */ + $category = $iterator->current(); + $iterator->next(); + $nextCategory = $iterator->current(); + $tree[$category->getId()] = $this->categoryHydrator->hydrateCategory($category); + if ($nextCategory && (int) $nextCategory->getLevel() !== (int) $category->getLevel()) { + $tree[$category->getId()]['children'] = $this->execute($iterator); + } + } + + return $tree; + } +} From 4a355a0feadac783e6dbb180b053addd74820c41 Mon Sep 17 00:00:00 2001 From: Valeriy Nayda Date: Mon, 1 Oct 2018 13:37:23 +0300 Subject: [PATCH 5/8] GraphQL-123: Fix regexp when filter by root category id -- fix static tests --- .../Model/Resolver/Products/DataProvider/CategoryTree.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php index 0e0f525e114c1..0ba4543b47b5f 100644 --- a/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php @@ -110,6 +110,8 @@ public function getTree(ResolveInfo $resolveInfo, int $rootCategoryId): \Iterato } /** + * Join attributes recursively + * * @param Collection $collection * @param FieldNode $fieldNode * @return void From 590b84dd4b4324b804443e5d360cc245fe74af77 Mon Sep 17 00:00:00 2001 From: Valeriy Nayda Date: Mon, 1 Oct 2018 14:03:19 +0300 Subject: [PATCH 6/8] GraphQL-123: Fix regexp when filter by root category id -- fix static tests --- .../Products/DataProvider/ExtractDataFromCategoryTree.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/ExtractDataFromCategoryTree.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/ExtractDataFromCategoryTree.php index b9376865d751d..470ad721ab213 100644 --- a/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/ExtractDataFromCategoryTree.php +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/ExtractDataFromCategoryTree.php @@ -11,7 +11,7 @@ use Magento\Catalog\Api\Data\CategoryInterface; /** - * Extarct data from category tree + * Extract data from category tree */ class ExtractDataFromCategoryTree { @@ -30,6 +30,8 @@ public function __construct( } /** + * Extract data from category tree + * * @param \Iterator $iterator * @return array */ From cb7e80742ef19a5a4e3c9d3d0c218f9c8ebf3aae Mon Sep 17 00:00:00 2001 From: Valeriy Nayda Date: Mon, 1 Oct 2018 14:17:40 +0300 Subject: [PATCH 7/8] GraphQL-123: Fix regexp when filter by root category id -- fix static tests --- app/code/Magento/CatalogGraphQl/Model/Resolver/CategoryTree.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/CategoryTree.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/CategoryTree.php index e890145840bbe..4e3a8403f3132 100644 --- a/app/code/Magento/CatalogGraphQl/Model/Resolver/CategoryTree.php +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/CategoryTree.php @@ -46,6 +46,8 @@ public function __construct( } /** + * Get category id + * * @param array $args * @return int * @throws GraphQlInputException From 3b04c9406433c73e9327fbe92dcd61c8b40ec74d Mon Sep 17 00:00:00 2001 From: Valeriy Nayda Date: Wed, 3 Oct 2018 12:36:02 +0300 Subject: [PATCH 8/8] GraphQL-121: Fix regexp when filter by root category id -- fixes after mainline merge --- .../Products/DataProvider/ExtractDataFromCategoryTree.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/ExtractDataFromCategoryTree.php b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/ExtractDataFromCategoryTree.php index 470ad721ab213..ac8d5709c85b3 100644 --- a/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/ExtractDataFromCategoryTree.php +++ b/app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/ExtractDataFromCategoryTree.php @@ -44,6 +44,7 @@ public function execute(\Iterator $iterator): array $iterator->next(); $nextCategory = $iterator->current(); $tree[$category->getId()] = $this->categoryHydrator->hydrateCategory($category); + $tree[$category->getId()]['model'] = $category; if ($nextCategory && (int) $nextCategory->getLevel() !== (int) $category->getLevel()) { $tree[$category->getId()]['children'] = $this->execute($iterator); }