Skip to content

Commit

Permalink
GraphQL-123: Fix regexp when filter by root category id
Browse files Browse the repository at this point in the history
-- fix coupling between object in CategoryTree
  • Loading branch information
Valeriy Nayda committed Oct 1, 2018
1 parent 93c3ded commit 4195613
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 36 deletions.
14 changes: 12 additions & 2 deletions app/code/Magento/CatalogGraphQl/Model/Resolver/CategoryTree.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
}

/**
Expand Down Expand Up @@ -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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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();
Expand All @@ -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();
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);

namespace Magento\CatalogGraphQl\Model\Resolver\Products\DataProvider;

use Magento\CatalogGraphQl\Model\Category\Hydrator;
use Magento\Catalog\Api\Data\CategoryInterface;

/**
* Extarct data from category tree
*/
class ExtractDataFromCategoryTree
{
/**
* @var Hydrator
*/
private $categoryHydrator;

/**
* @param Hydrator $categoryHydrator
*/
public function __construct(
Hydrator $categoryHydrator
) {
$this->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;
}
}

0 comments on commit 4195613

Please sign in to comment.