Skip to content
This repository was archived by the owner on Dec 19, 2019. It is now read-only.

Commit 0571603

Browse files
author
Valeriy Naida
authored
ENGCOM-3071: Fix regexp when filter by root category id #121
2 parents a6a822b + 413d3c8 commit 0571603

File tree

3 files changed

+85
-41
lines changed

3 files changed

+85
-41
lines changed

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

Lines changed: 14 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,16 +28,26 @@ 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
/**
49+
* Get category id
50+
*
4051
* @param array $args
4152
* @return int
4253
* @throws GraphQlInputException
@@ -62,7 +73,8 @@ public function resolve(Field $field, $context, ResolveInfo $info, array $value
6273
$rootCategoryId = $this->getCategoryId($args);
6374
$categoriesTree = $this->categoryTree->getTree($info, $rootCategoryId);
6475
if (!empty($categoriesTree)) {
65-
return current($categoriesTree);
76+
$result = $this->extractDataFromCategoryTree->execute($categoriesTree);
77+
return current($result);
6678
} else {
6779
return null;
6880
}

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

Lines changed: 16 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@
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;
1615
use Magento\Catalog\Api\Data\CategoryInterface;
1716
use Magento\Catalog\Model\ResourceModel\Category\Collection;
1817
use Magento\Catalog\Model\ResourceModel\Category\CollectionFactory;
1918
use Magento\CatalogGraphQl\Model\AttributesJoiner;
19+
use Magento\Catalog\Model\Category;
2020

2121
/**
2222
* Category tree data provider
@@ -53,87 +53,64 @@ class CategoryTree
5353
*/
5454
private $metadata;
5555

56-
/**
57-
* @var Hydrator
58-
*/
59-
private $hydrator;
60-
6156
/**
6257
* @param CollectionFactory $collectionFactory
6358
* @param AttributesJoiner $attributesJoiner
6459
* @param DepthCalculator $depthCalculator
6560
* @param LevelCalculator $levelCalculator
6661
* @param MetadataPool $metadata
67-
* @param Hydrator $hydrator
6862
*/
6963
public function __construct(
7064
CollectionFactory $collectionFactory,
7165
AttributesJoiner $attributesJoiner,
7266
DepthCalculator $depthCalculator,
7367
LevelCalculator $levelCalculator,
74-
MetadataPool $metadata,
75-
Hydrator $hydrator
68+
MetadataPool $metadata
7669
) {
7770
$this->collectionFactory = $collectionFactory;
7871
$this->attributesJoiner = $attributesJoiner;
7972
$this->depthCalculator = $depthCalculator;
8073
$this->levelCalculator = $levelCalculator;
8174
$this->metadata = $metadata;
82-
$this->hydrator = $hydrator;
8375
}
8476

8577
/**
8678
* Returns categories tree starting from parent $rootCategoryId
8779
*
8880
* @param ResolveInfo $resolveInfo
8981
* @param int $rootCategoryId
90-
* @return array
82+
* @return \Iterator
9183
*/
92-
public function getTree(ResolveInfo $resolveInfo, int $rootCategoryId) : array
84+
public function getTree(ResolveInfo $resolveInfo, int $rootCategoryId): \Iterator
9385
{
9486
$categoryQuery = $resolveInfo->fieldNodes[0];
9587
$collection = $this->collectionFactory->create();
9688
$this->joinAttributesRecursively($collection, $categoryQuery);
9789
$depth = $this->depthCalculator->calculate($categoryQuery);
9890
$level = $this->levelCalculator->calculate($rootCategoryId);
91+
92+
// If root category is being filter, we've to remove first slash
93+
if ($rootCategoryId == Category::TREE_ROOT_ID) {
94+
$regExpPathFilter = sprintf('.*%s/[/0-9]*$', $rootCategoryId);
95+
} else {
96+
$regExpPathFilter = sprintf('.*/%s/[/0-9]*$', $rootCategoryId);
97+
}
98+
9999
//Search for desired part of category tree
100-
$collection->addPathFilter(sprintf('.*/%s/[/0-9]*$', $rootCategoryId));
100+
$collection->addPathFilter($regExpPathFilter);
101+
101102
$collection->addFieldToFilter('level', ['gt' => $level]);
102103
$collection->addFieldToFilter('level', ['lteq' => $level + $depth - self::DEPTH_OFFSET]);
103104
$collection->setOrder('level');
104105
$collection->getSelect()->orWhere(
105106
$this->metadata->getMetadata(CategoryInterface::class)->getIdentifierField() . ' = ?',
106107
$rootCategoryId
107108
);
108-
return $this->processTree($collection->getIterator());
109-
}
110-
111-
/**
112-
* Iterates through category tree
113-
*
114-
* @param \Iterator $iterator
115-
* @return array
116-
*/
117-
private function processTree(\Iterator $iterator) : array
118-
{
119-
$tree = [];
120-
while ($iterator->valid()) {
121-
/** @var CategoryInterface $category */
122-
$category = $iterator->current();
123-
$iterator->next();
124-
$nextCategory = $iterator->current();
125-
$tree[$category->getId()] = $this->hydrator->hydrateCategory($category);
126-
$tree[$category->getId()]['model'] = $category;
127-
if ($nextCategory && (int) $nextCategory->getLevel() !== (int) $category->getLevel()) {
128-
$tree[$category->getId()]['children'] = $this->processTree($iterator);
129-
}
130-
}
131-
132-
return $tree;
109+
return $collection->getIterator();
133110
}
134111

135112
/**
136-
* Joins EAV attributes recursively
113+
* Join attributes recursively
137114
*
138115
* @param Collection $collection
139116
* @param FieldNode $fieldNode
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
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+
* Extract 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+
* Extract data from category tree
34+
*
35+
* @param \Iterator $iterator
36+
* @return array
37+
*/
38+
public function execute(\Iterator $iterator): array
39+
{
40+
$tree = [];
41+
while ($iterator->valid()) {
42+
/** @var CategoryInterface $category */
43+
$category = $iterator->current();
44+
$iterator->next();
45+
$nextCategory = $iterator->current();
46+
$tree[$category->getId()] = $this->categoryHydrator->hydrateCategory($category);
47+
$tree[$category->getId()]['model'] = $category;
48+
if ($nextCategory && (int) $nextCategory->getLevel() !== (int) $category->getLevel()) {
49+
$tree[$category->getId()]['children'] = $this->execute($iterator);
50+
}
51+
}
52+
53+
return $tree;
54+
}
55+
}

0 commit comments

Comments
 (0)