Skip to content

Commit

Permalink
Init recrawl light indexer
Browse files Browse the repository at this point in the history
  • Loading branch information
supercid committed Jul 16, 2024
1 parent 83c1388 commit 063b516
Show file tree
Hide file tree
Showing 8 changed files with 467 additions and 0 deletions.
16 changes: 16 additions & 0 deletions Helper/Data.php
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,11 @@ class Data extends AbstractHelper
*/
public const XML_PATH_MULTI_CURRENCY = 'nosto/multicurrency/method';

/**
* Path to the configuration object for light indexer
*/
public const XML_PATH_USE_LIGHT_INDEXER = 'nosto/flags/use_light_indexer';

/**
* @var string Nosto customer reference attribute name
*/
Expand Down Expand Up @@ -504,6 +509,17 @@ public function getMultiCurrencyMethod(StoreInterface $store = null)
return $this->getStoreConfig(self::XML_PATH_MULTI_CURRENCY, $store);
}

/**
* Returns if the light indexer should be used
*
* @param StoreInterface|null $store the store model or null.
* @return string the configuration value
*/
public function getUseLightIndexer(StoreInterface $store = null)
{
return $this->getStoreConfig(self::XML_PATH_USE_LIGHT_INDEXER, $store);
}

/**
* Saves the multi currency setup value / multi currency method
*
Expand Down
155 changes: 155 additions & 0 deletions Model/Indexer/LightProductIndexer.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
<?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\Indexer;

use Exception;
use Magento\Indexer\Model\ProcessManager;
use Magento\Store\Model\App\Emulation;
use Magento\Store\Model\Store;
use Nosto\NostoException;
use Nosto\Tagging\Helper\Scope as NostoHelperScope;
use Nosto\Tagging\Logger\Logger as NostoLogger;
use Nosto\Tagging\Model\Indexer\Dimensions\Product\ModeSwitcher as ProductModeSwitcher;
use Nosto\Tagging\Model\Indexer\Dimensions\ModeSwitcherInterface;
use Nosto\Tagging\Model\Indexer\Dimensions\StoreDimensionProvider;
use Nosto\Tagging\Model\ResourceModel\Magento\Product\Collection as ProductCollection;
use Nosto\Tagging\Model\ResourceModel\Magento\Product\CollectionBuilder;
use Nosto\Tagging\Model\Service\Indexer\IndexerStatusServiceInterface;
use Symfony\Component\Console\Input\InputInterface;
use Nosto\Tagging\Model\Service\Sync\Recrawl\RecrawlService;

/**
* Class ProductIndexer
* Fetches product ID's from CL tables and create entries in the message queue
*/
class LightProductIndexer extends AbstractIndexer
{
public const INDEXER_ID = 'nosto_index_light_product';

/** @var CollectionBuilder */
private CollectionBuilder $productCollectionBuilder;

/** @var ProductModeSwitcher */
private ProductModeSwitcher $modeSwitcher;

/** @var RecrawlService */
private RecrawlService $recrawlService;

/**
* Invalidate constructor.
* @param NostoHelperScope $nostoHelperScope
* @param NostoLogger $logger
* @param CollectionBuilder $productCollectionBuilder
* @param ProductModeSwitcher $modeSwitcher
* @param StoreDimensionProvider $dimensionProvider
* @param Emulation $storeEmulation
* @param ProcessManager $processManager
* @param InputInterface $input
* @param IndexerStatusServiceInterface $indexerStatusService
* @param RecrawlService $recrawlService
*/
public function __construct(
NostoHelperScope $nostoHelperScope,
NostoLogger $logger,
CollectionBuilder $productCollectionBuilder,
ProductModeSwitcher $modeSwitcher,
StoreDimensionProvider $dimensionProvider,
Emulation $storeEmulation,
ProcessManager $processManager,
InputInterface $input,
IndexerStatusServiceInterface $indexerStatusService,
RecrawlService $recrawlService
) {
$this->productCollectionBuilder = $productCollectionBuilder;
$this->modeSwitcher = $modeSwitcher;
$this->recrawlService = $recrawlService;
parent::__construct(
$nostoHelperScope,
$logger,
$dimensionProvider,
$storeEmulation,
$input,
$indexerStatusService,
$processManager
);
}

/**
* @inheritDoc
*/
public function getModeSwitcher(): ModeSwitcherInterface
{
return $this->modeSwitcher;
}

/**
* @inheritDoc
* @throws NostoException
* @throws Exception
*/
public function doIndex(Store $store, array $ids = [])
{
// if ($this->nostoHelperData->getUseLightIndexer($store)) {
$collection = $this->getCollection($store, $ids);
$this->recrawlService->recrawl($collection, $store);
// }
}

/**
* @inheritDoc
*/
public function getIndexerId(): string
{
return self::INDEXER_ID;
}

/**
* @param Store $store
* @param array $ids
* @return ProductCollection
*/
public function getCollection(Store $store, array $ids = []): ProductCollection
{
$this->productCollectionBuilder->initDefault($store);
if (!empty($ids)) {
$this->productCollectionBuilder->withIds($ids);
} else {
$this->productCollectionBuilder->withDefaultVisibility($store);
}
return $this->productCollectionBuilder->build();
}
}
41 changes: 41 additions & 0 deletions Model/Product/Builder.php
Original file line number Diff line number Diff line change
Expand Up @@ -343,6 +343,47 @@ public function build(
return $nostoProduct;
}

/**
* @param Product $product
* @param Store $store
* @return NostoProduct
* @throws FilteredProductException
* @throws NonBuildableProductException
*/
public function buildLightProduct(
Product $product,
Store $store
) {
$nostoProduct = new NostoProduct();
$modelFilter = new ModelFilter();
$this->eventManager->dispatch(
'nosto_product_load_before',
['product' => $nostoProduct, 'magentoProduct' => $product, 'modelFilter' => $modelFilter]
);
if (!$modelFilter->isValid()) {
throw new FilteredProductException(
sprintf(
'Product id %d did not pass pre-build model filter for store %s',
$product->getId(),
$store->getCode()
)
);
}
try {
$nostoProduct->setUrl($this->urlBuilder->getUrlInStore($product, $store));
$nostoProduct->setProductId((string)$product->getId());
} catch (Exception $e) {
$message = sprintf("Could not build light product with id: %s", $product->getId());
throw new NonBuildableProductException($message, $e);
}
$this->eventManager->dispatch(
'nosto_product_load_after',
['product' => $nostoProduct, 'magentoProduct' => $product, 'modelFilter' => $modelFilter]
);

return $nostoProduct;
}

/**
* Adds selected attributes to all tags also in the custom fields section
*
Expand Down
29 changes: 29 additions & 0 deletions Model/Service/Product/DefaultProductService.php
Original file line number Diff line number Diff line change
Expand Up @@ -108,4 +108,33 @@ public function getProduct(ProductInterface $product, StoreInterface $store)
return null;
}
}

/**
* @param ProductInterface $product
* @param StoreInterface $store
* @return NostoProduct|null
* @throws \Magento\Framework\Exception\NoSuchEntityException
*/
public function getLightProduct(ProductInterface $product, StoreInterface $store)
{
/** @var Product $product */
/** @var Store $store */
try {
$nostoProduct = $this->nostoProductBuilder->buildLightProduct(
$this->nostoProductRepository->reloadProduct(
$product->getId(),
$store->getId()
),
$store

Check notice on line 128 in Model/Service/Product/DefaultProductService.php

View workflow job for this annotation

GitHub Actions / Phan Analysis

Argument 2 ($store) is $store of type \Magento\Framework\Api\ExtensibleDataInterface|\Magento\Store\Api\Data\StoreInterface but \Nosto\Tagging\Model\Product\Builder::buildLightProduct() takes \Magento\Store\Model\Store defined at Model/Product/Builder.php:353 (expected type to be the same or a subtype, but saw a supertype instead)
);
return $nostoProduct;
// $nostoLightProduct = new stdClass();
// $nostoLightProduct->product_id = $nostoProduct->getProductId();
// $nostoLightProduct->url = $nostoProduct->getUrl();
// return $nostoLightProduct;
} catch (NonBuildableProductException $e) {
$this->logger->exception($e);
return null;
}
}
}
Loading

0 comments on commit 063b516

Please sign in to comment.