Skip to content

Commit

Permalink
Init category indexer
Browse files Browse the repository at this point in the history
  • Loading branch information
supercid committed Jun 24, 2024
1 parent 83c1388 commit adb846e
Show file tree
Hide file tree
Showing 18 changed files with 867 additions and 15 deletions.
49 changes: 49 additions & 0 deletions Exception/ParentCategoryDisabledException.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<?php
/**
* Copyright (c) 2020, Nosto Solutions Ltd
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* @author Nosto Solutions Ltd <[email protected]>
* @copyright 2020 Nosto Solutions Ltd
* @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause
*
*/

namespace Nosto\Tagging\Exception;

use Nosto\NostoException;
use Throwable;

class ParentCategoryDisabledException extends NostoException
{
public function __construct(int $categoryId, $code = 0, Throwable $previous = null)
{
$message = "Parent category is disabled for category with id: " . $categoryId;
parent::__construct($message, $code, $previous);
}
}
7 changes: 0 additions & 7 deletions Model/Category/CollectionBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@
use Magento\Catalog\Model\ResourceModel\Category\Collection as MagentoCategoryCollection;
use Nosto\Tagging\Model\Category\Builder as NostoCategoryBuilder;
use Nosto\Tagging\Model\ResourceModel\Magento\Category\CollectionBuilder as CategoryCollectionBuilder;
use Nosto\Tagging\Model\Service\Product\Category\CategoryServiceInterface;
use Traversable;

/**
Expand All @@ -59,28 +58,22 @@ class CollectionBuilder
/** @var CategoryCollectionBuilder */
private CategoryCollectionBuilder $categoryCollectionBuilder;

/** @var CategoryServiceInterface */
private CategoryServiceInterface $categoryService;

/** @var NostoLogger */
private NostoLogger $logger;

/**
* Collection constructor.
* @param NostoCategoryBuilder $categoryBuilder
* @param CategoryCollectionBuilder $categoryCollectionBuilder
* @param CategoryServiceInterface $categoryService
* @param NostoLogger $logger
*/
public function __construct(
NostoCategoryBuilder $categoryBuilder,
CategoryCollectionBuilder $categoryCollectionBuilder,
CategoryServiceInterface $categoryService,
NostoLogger $logger
) {
$this->categoryBuilder = $categoryBuilder;
$this->categoryCollectionBuilder = $categoryCollectionBuilder;
$this->categoryService = $categoryService;
$this->logger = $logger;
}

Expand Down
175 changes: 175 additions & 0 deletions Model/Category/Repository.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
<?php
/**
* Copyright (c) 2020, Nosto Solutions Ltd
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* @author Nosto Solutions Ltd <[email protected]>
* @copyright 2020 Nosto Solutions Ltd
* @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause
*
*/

namespace Nosto\Tagging\Model\Category;

use Magento\Catalog\Api\Data\CategoryInterface;
use Magento\Catalog\Api\Data\CategorySearchResultsInterface;
use Magento\Catalog\Model\CategoryRepository;
use Magento\Catalog\Model\ResourceModel\Category\Collection as CategoryCollection;
use Magento\Framework\Api\SearchCriteriaBuilder;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Store\Model\Store;
use Magento\Catalog\Model\ResourceModel\Category\CollectionFactory as CategoryCollectionFactory;
use Nosto\Tagging\Exception\ParentCategoryDisabledException;

/**
* Repository wrapper class for fetching categories
*/
class Repository
{
private array $parentCategoryIdCache = [];

/** @var SearchCriteriaBuilder $searchCriteriaBuilder */
private SearchCriteriaBuilder $searchCriteriaBuilder;

/** @var CategoryRepository $categoryRepository */
private CategoryRepository $categoryRepository;

/** @var CategoryCollectionFactory $categoryCollectionFactory */
private CategoryCollectionFactory $categoryCollectionFactory;

/**
* @param SearchCriteriaBuilder $searchCriteriaBuilder
*/
public function __construct(
SearchCriteriaBuilder $searchCriteriaBuilder,
CategoryRepository $categoryRepository,
CategoryCollectionFactory $categoryCollectionFactory
) {
$this->searchCriteriaBuilder = $searchCriteriaBuilder;
$this->categoryRepository = $categoryRepository;
$this->categoryCollectionFactory = $categoryCollectionFactory;
}

/**
* Gets categories by category ids
*
* @param array $ids
*/
public function getByIds(array $ids)
{
//@TODO implement

Check warning on line 86 in Model/Category/Repository.php

View workflow job for this annotation

GitHub Actions / Code Sniffer

Comment refers to a TODO task "implement"
}

Check warning on line 88 in Model/Category/Repository.php

View workflow job for this annotation

GitHub Actions / Code Sniffer

Code must not contain multiple empty lines in a row; found 2 empty lines.

/**
* @param Store $store
* @param array $categoryIds
*
* @return CategoryCollection
* @throws LocalizedException
*/
public function getCategoryCollectionQuery(Store $store, array $categoryIds = [])
{
$categories = $this->categoryCollectionFactory->create()
->distinct(true)

Check warning on line 100 in Model/Category/Repository.php

View workflow job for this annotation

GitHub Actions / Code Sniffer

Possible slow SQL method distinct detected
->addNameToResult()
->setStoreId($store->getId())
->addUrlRewriteToResult()
->addAttributeToFilter('level', ['gt' => 1]) // @TODO: Check if zero level categories are needed

Check warning on line 104 in Model/Category/Repository.php

View workflow job for this annotation

GitHub Actions / Code Sniffer

Comment refers to a TODO task "Check if zero level categories are needed"
->addAttributeToSelect(array_merge(['name', 'is_active', 'include_in_menu']))
->addOrderField('entity_id');

if ($categoryIds) {
$categories->addAttributeToFilter('entity_id', ['in' => $categoryIds]);
}

return $categories;
}


/**
* Gets the parent category ID's for a given category
*
* @param CategoryInterface $category
* @return string[]|null
* @throws ParentCategoryDisabledException
*/
public function resolveParentCategoryIds(CategoryInterface $category)
{
if ($this->getParentIdsFromCache($category)) {
return $this->getParentIdsFromCache($category);
}

if ($category->getLevel() < 1 && !$category->getIsActive()) {
throw new ParentCategoryDisabledException(
sprintf(
'Category with id %s is disabled',
$category->getId()
)
);
}

$parentCategoryIds = null;
if ($category->getLevel() >= 1) {
//@TODO: get parents from root category, check if this works
$parentCategoryIds = $category->getParentIds();
$this->saveParentIdsToCache($category, $parentCategoryIds);
}
return $parentCategoryIds;
}


/**
* Get parent ids from cache. Return null if the cache is not available
*
* @param CategoryInterface $category
* @return string[]|null
*/
private function getParentIdsFromCache(CategoryInterface $category)
{
if (isset($this->parentCategoryIdCache[$category->getId()])) {
return $this->parentCategoryIdCache[$category->getId()];
}

return null;
}

/**
* Saves the parents category ids to internal cache to avoid redundant
* database queries
*
* @param CategoryInterface $category
* @param string[] $parentCategoryIds
*/
private function saveParentIdsToCache(CategoryInterface $category, array $parentCategoryIds)
{
$this->parentCategoryIdCache[$category->getId()] = $parentCategoryIds;
}

}
2 changes: 1 addition & 1 deletion Model/Indexer/AbstractIndexer.php
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
use Nosto\Tagging\Helper\Scope as NostoHelperScope;
use Nosto\Tagging\Logger\Logger as NostoLogger;
use Nosto\Tagging\Model\Indexer\Dimensions\AbstractDimensionModeConfiguration as DimensionModeConfiguration;
use Nosto\Tagging\Model\Indexer\Dimensions\ModeSwitcherInterface;
use Nosto\Tagging\Model\Indexer\Dimensions\ModeSwitch\ModeSwitcherInterface;
use Nosto\Tagging\Model\Indexer\Dimensions\StoreDimensionProvider;
use Nosto\Tagging\Model\Service\Indexer\IndexerStatusServiceInterface;
use Nosto\Tagging\Util\Benchmark;
Expand Down
Loading

0 comments on commit adb846e

Please sign in to comment.