Skip to content

Commit 4195613

Browse files
author
Valeriy Nayda
committed
GraphQL-123: Fix regexp when filter by root category id
-- fix coupling between object in CategoryTree
1 parent 93c3ded commit 4195613

File tree

3 files changed

+70
-36
lines changed

3 files changed

+70
-36
lines changed

app/code/Magento/CatalogGraphQl/Model/Resolver/CategoryTree.php

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
namespace Magento\CatalogGraphQl\Model\Resolver;
99

10+
use Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\ExtractDataFromCategoryTree;
1011
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
1112
use Magento\Framework\GraphQl\Config\Element\Field;
1213
use Magento\Framework\GraphQl\Exception\GraphQlInputException;
@@ -27,13 +28,21 @@ class CategoryTree implements ResolverInterface
2728
*/
2829
private $categoryTree;
2930

31+
/**
32+
* @var ExtractDataFromCategoryTree
33+
*/
34+
private $extractDataFromCategoryTree;
35+
3036
/**
3137
* @param \Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\CategoryTree $categoryTree
38+
* @param ExtractDataFromCategoryTree $extractDataFromCategoryTree
3239
*/
3340
public function __construct(
34-
\Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\CategoryTree $categoryTree
41+
\Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider\CategoryTree $categoryTree,
42+
ExtractDataFromCategoryTree $extractDataFromCategoryTree
3543
) {
3644
$this->categoryTree = $categoryTree;
45+
$this->extractDataFromCategoryTree = $extractDataFromCategoryTree;
3746
}
3847

3948
/**
@@ -62,7 +71,8 @@ public function resolve(Field $field, $context, ResolveInfo $info, array $value
6271
$rootCategoryId = $this->getCategoryId($args);
6372
$categoriesTree = $this->categoryTree->getTree($info, $rootCategoryId);
6473
if (!empty($categoriesTree)) {
65-
return current($categoriesTree);
74+
$result = $this->extractDataFromCategoryTree->execute($categoriesTree);
75+
return current($result);
6676
} else {
6777
return null;
6878
}

app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/CategoryTree.php

Lines changed: 6 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99

1010
use GraphQL\Language\AST\FieldNode;
1111
use Magento\CatalogGraphQl\Model\Category\DepthCalculator;
12-
use Magento\CatalogGraphQl\Model\Category\Hydrator;
1312
use Magento\CatalogGraphQl\Model\Category\LevelCalculator;
1413
use Magento\Framework\EntityManager\MetadataPool;
1514
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
@@ -54,41 +53,35 @@ class CategoryTree
5453
*/
5554
private $metadata;
5655

57-
/**
58-
* @var Hydrator
59-
*/
60-
private $hydrator;
61-
6256
/**
6357
* @param CollectionFactory $collectionFactory
6458
* @param AttributesJoiner $attributesJoiner
6559
* @param DepthCalculator $depthCalculator
6660
* @param LevelCalculator $levelCalculator
6761
* @param MetadataPool $metadata
68-
* @param Hydrator $hydrator
6962
*/
7063
public function __construct(
7164
CollectionFactory $collectionFactory,
7265
AttributesJoiner $attributesJoiner,
7366
DepthCalculator $depthCalculator,
7467
LevelCalculator $levelCalculator,
75-
MetadataPool $metadata,
76-
Hydrator $hydrator
68+
MetadataPool $metadata
7769
) {
7870
$this->collectionFactory = $collectionFactory;
7971
$this->attributesJoiner = $attributesJoiner;
8072
$this->depthCalculator = $depthCalculator;
8173
$this->levelCalculator = $levelCalculator;
8274
$this->metadata = $metadata;
83-
$this->hydrator = $hydrator;
8475
}
8576

8677
/**
78+
* Get category tree
79+
*
8780
* @param ResolveInfo $resolveInfo
8881
* @param int $rootCategoryId
89-
* @return array
82+
* @return \Iterator
9083
*/
91-
public function getTree(ResolveInfo $resolveInfo, int $rootCategoryId) : array
84+
public function getTree(ResolveInfo $resolveInfo, int $rootCategoryId): \Iterator
9285
{
9386
$categoryQuery = $resolveInfo->fieldNodes[0];
9487
$collection = $this->collectionFactory->create();
@@ -113,28 +106,7 @@ public function getTree(ResolveInfo $resolveInfo, int $rootCategoryId) : array
113106
$this->metadata->getMetadata(CategoryInterface::class)->getIdentifierField() . ' = ?',
114107
$rootCategoryId
115108
);
116-
return $this->processTree($collection->getIterator());
117-
}
118-
119-
/**
120-
* @param \Iterator $iterator
121-
* @return array
122-
*/
123-
private function processTree(\Iterator $iterator) : array
124-
{
125-
$tree = [];
126-
while ($iterator->valid()) {
127-
/** @var CategoryInterface $category */
128-
$category = $iterator->current();
129-
$iterator->next();
130-
$nextCategory = $iterator->current();
131-
$tree[$category->getId()] = $this->hydrator->hydrateCategory($category);
132-
if ($nextCategory && (int) $nextCategory->getLevel() !== (int) $category->getLevel()) {
133-
$tree[$category->getId()]['children'] = $this->processTree($iterator);
134-
}
135-
}
136-
137-
return $tree;
109+
return $collection->getIterator();
138110
}
139111

140112
/**
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
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\CatalogGraphQl\Model\Resolver\Products\DataProvider;
9+
10+
use Magento\CatalogGraphQl\Model\Category\Hydrator;
11+
use Magento\Catalog\Api\Data\CategoryInterface;
12+
13+
/**
14+
* Extarct data from category tree
15+
*/
16+
class ExtractDataFromCategoryTree
17+
{
18+
/**
19+
* @var Hydrator
20+
*/
21+
private $categoryHydrator;
22+
23+
/**
24+
* @param Hydrator $categoryHydrator
25+
*/
26+
public function __construct(
27+
Hydrator $categoryHydrator
28+
) {
29+
$this->categoryHydrator = $categoryHydrator;
30+
}
31+
32+
/**
33+
* @param \Iterator $iterator
34+
* @return array
35+
*/
36+
public function execute(\Iterator $iterator): array
37+
{
38+
$tree = [];
39+
while ($iterator->valid()) {
40+
/** @var CategoryInterface $category */
41+
$category = $iterator->current();
42+
$iterator->next();
43+
$nextCategory = $iterator->current();
44+
$tree[$category->getId()] = $this->categoryHydrator->hydrateCategory($category);
45+
if ($nextCategory && (int) $nextCategory->getLevel() !== (int) $category->getLevel()) {
46+
$tree[$category->getId()]['children'] = $this->execute($iterator);
47+
}
48+
}
49+
50+
return $tree;
51+
}
52+
}

0 commit comments

Comments
 (0)