266 lines
8.3 KiB
PHP
Executable File
266 lines
8.3 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* @author Amasty Team
|
|
* @copyright Copyright (c) Amasty (https://www.amasty.com)
|
|
* @package Elastic Search Base for Magento 2
|
|
*/
|
|
|
|
namespace Amasty\ElasticSearch\Model;
|
|
|
|
use Amasty\ElasticSearch\Api\Data\StopWordInterface;
|
|
use Amasty\ElasticSearch\Api\StopWordRepositoryInterface;
|
|
use Amasty\ElasticSearch\Model\ResourceModel\StopWord as StopWordResource;
|
|
use Amasty\ElasticSearch\Model\ResourceModel\StopWord\CollectionFactory;
|
|
use Amasty\ElasticSearch\Model\ResourceModel\StopWord\Collection;
|
|
use Magento\Framework\Exception\AlreadyExistsException;
|
|
use Magento\Framework\Exception\CouldNotSaveException;
|
|
use Magento\Framework\Exception\NoSuchEntityException;
|
|
use Magento\Framework\Exception\CouldNotDeleteException;
|
|
use Magento\Framework\Api\SearchCriteriaInterface;
|
|
use Magento\Framework\Api\Search\FilterGroup;
|
|
use Magento\Ui\Api\Data\BookmarkSearchResultsInterfaceFactory;
|
|
use Magento\Framework\Api\SortOrder;
|
|
|
|
/**
|
|
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
|
|
*/
|
|
class StopWordRepository implements StopWordRepositoryInterface
|
|
{
|
|
/**
|
|
* @var BookmarkSearchResultsInterfaceFactory
|
|
*/
|
|
private $searchResultsFactory;
|
|
|
|
/**
|
|
* @var StopWordFactory
|
|
*/
|
|
private $stopWordFactory;
|
|
|
|
/**
|
|
* @var StopWordResource
|
|
*/
|
|
private $stopWordResource;
|
|
|
|
/**
|
|
* Model data storage
|
|
*
|
|
* @var array
|
|
*/
|
|
private $stopWords;
|
|
|
|
/**
|
|
* @var CollectionFactory
|
|
*/
|
|
private $stopWordCollectionFactory;
|
|
|
|
/**
|
|
* @var \Magento\Framework\File\Csv
|
|
*/
|
|
private $csv;
|
|
|
|
public function __construct(
|
|
BookmarkSearchResultsInterfaceFactory $searchResultsFactory,
|
|
StopWordFactory $stopWordFactory,
|
|
StopWordResource $stopWordResource,
|
|
CollectionFactory $stopWordCollectionFactory,
|
|
\Magento\Framework\File\Csv $csv
|
|
) {
|
|
$this->searchResultsFactory = $searchResultsFactory;
|
|
$this->stopWordFactory = $stopWordFactory;
|
|
$this->stopWordResource = $stopWordResource;
|
|
$this->stopWordCollectionFactory = $stopWordCollectionFactory;
|
|
$this->csv = $csv;
|
|
}
|
|
|
|
/**
|
|
* @inheritdoc
|
|
*/
|
|
public function save(StopWordInterface $stopWord)
|
|
{
|
|
try {
|
|
if ($stopWord->getStopWordId()) {
|
|
$stopWord = $this->getById($stopWord->getStopWordId())->addData($stopWord->getData());
|
|
}
|
|
$this->stopWordResource->save($stopWord);
|
|
unset($this->stopWords[$stopWord->getStopWordId()]);
|
|
} catch (AlreadyExistsException $e) {
|
|
throw new AlreadyExistsException(__($e->getMessage()));
|
|
} catch (\Exception $e) {
|
|
if ($stopWord->getStopWordId()) {
|
|
throw new CouldNotSaveException(
|
|
__(
|
|
'Unable to save stopWord with ID %1. Error: %2',
|
|
[$stopWord->getStopWordId(), $e->getMessage()]
|
|
)
|
|
);
|
|
}
|
|
throw new CouldNotSaveException(__('Unable to save new stopWord. Error: %1', $e->getMessage()));
|
|
}
|
|
|
|
return $stopWord;
|
|
}
|
|
|
|
/**
|
|
* @inheritdoc
|
|
*/
|
|
public function getById($stopWordId)
|
|
{
|
|
if (!isset($this->stopWords[$stopWordId])) {
|
|
/** @var \Amasty\ElasticSearch\Model\StopWord $stopWord */
|
|
$stopWord = $this->stopWordFactory->create();
|
|
$this->stopWordResource->load($stopWord, $stopWordId);
|
|
if (!$stopWord->getStopWordId()) {
|
|
throw new NoSuchEntityException(__('StopWord with specified ID "%1" not found.', $stopWordId));
|
|
}
|
|
$this->stopWords[$stopWordId] = $stopWord;
|
|
}
|
|
|
|
return $this->stopWords[$stopWordId];
|
|
}
|
|
|
|
/**
|
|
* @inheritdoc
|
|
*/
|
|
public function delete(StopWordInterface $stopWord)
|
|
{
|
|
try {
|
|
$this->stopWordResource->delete($stopWord);
|
|
unset($this->stopWords[$stopWord->getStopWordId()]);
|
|
} catch (\Exception $e) {
|
|
if ($stopWord->getStopWordId()) {
|
|
throw new CouldNotDeleteException(
|
|
__(
|
|
'Unable to remove stopWord with ID %1. Error: %2',
|
|
[$stopWord->getStopWordId(), $e->getMessage()]
|
|
)
|
|
);
|
|
}
|
|
throw new CouldNotDeleteException(__('Unable to remove stopWord. Error: %1', $e->getMessage()));
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* @inheritdoc
|
|
*/
|
|
public function deleteById($stopWordId)
|
|
{
|
|
$stopWordModel = $this->getById($stopWordId);
|
|
$this->delete($stopWordModel);
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* @inheritdoc
|
|
*/
|
|
public function getList(SearchCriteriaInterface $searchCriteria)
|
|
{
|
|
$searchResults = $this->searchResultsFactory->create();
|
|
$searchResults->setSearchCriteria($searchCriteria);
|
|
|
|
/** @var \Amasty\ElasticSearch\Model\ResourceModel\StopWord\Collection $stopWordCollection */
|
|
$stopWordCollection = $this->stopWordCollectionFactory->create();
|
|
// Add filters from root filter group to the collection
|
|
foreach ($searchCriteria->getFilterGroups() as $group) {
|
|
$this->addFilterGroupToCollection($group, $stopWordCollection);
|
|
}
|
|
$searchResults->setTotalCount($stopWordCollection->getSize());
|
|
$sortOrders = $searchCriteria->getSortOrders();
|
|
if ($sortOrders) {
|
|
$this->addOrderToCollection($sortOrders, $stopWordCollection);
|
|
}
|
|
$stopWordCollection->setCurPage($searchCriteria->getCurrentPage());
|
|
$stopWordCollection->setPageSize($searchCriteria->getPageSize());
|
|
$stopWords = [];
|
|
/** @var StopWordInterface $stopWord */
|
|
foreach ($stopWordCollection->getItems() as $stopWord) {
|
|
$stopWords[] = $this->getById($stopWord->getId());
|
|
}
|
|
$searchResults->setItems($stopWords);
|
|
|
|
return $searchResults;
|
|
}
|
|
|
|
/**
|
|
* Helper function that adds a FilterGroup to the collection.
|
|
*
|
|
* @param FilterGroup $filterGroup
|
|
* @param Collection $stopWordCollection
|
|
*
|
|
* @return void
|
|
*/
|
|
private function addFilterGroupToCollection(FilterGroup $filterGroup, Collection $stopWordCollection)
|
|
{
|
|
foreach ($filterGroup->getFilters() as $filter) {
|
|
$condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq';
|
|
$stopWordCollection->addFieldToFilter($filter->getField(), [$condition => $filter->getValue()]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Helper function that adds a SortOrder to the collection.
|
|
*
|
|
* @param SortOrder[] $sortOrders
|
|
* @param Collection $stopWordCollection
|
|
*/
|
|
private function addOrderToCollection($sortOrders, Collection $stopWordCollection)
|
|
{
|
|
/** @var SortOrder $sortOrder */
|
|
foreach ($sortOrders as $sortOrder) {
|
|
$field = $sortOrder->getField();
|
|
$stopWordCollection->addOrder(
|
|
$field,
|
|
($sortOrder->getDirection() == SortOrder::SORT_DESC) ? 'DESC' : 'ASC'
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param int $storeId
|
|
* @return array
|
|
*/
|
|
public function getArrayListByStoreId($storeId)
|
|
{
|
|
$result = [];
|
|
/** @var \Amasty\ElasticSearch\Model\ResourceModel\StopWord\Collection $stopWordCollection */
|
|
$stopWordCollection = $this->stopWordCollectionFactory->create();
|
|
$stopWordCollection->addFieldToFilter(StopWordInterface::STORE_ID, $storeId);
|
|
|
|
/** @var StopWordInterface $item */
|
|
foreach ($stopWordCollection as $item) {
|
|
$result[] = $item->getTerm();
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* @param $file
|
|
* @param $storeId
|
|
* @return int
|
|
* @throws \Exception
|
|
*/
|
|
public function importStopWords($file, $storeId)
|
|
{
|
|
$count = 0;
|
|
$csvData = $this->csv->getData($file);
|
|
foreach ($csvData as $data) {
|
|
if (isset($data[0])) {
|
|
try {
|
|
$model = $this->stopWordFactory->create()->setStoreId($storeId)->setTerm($data[0]);
|
|
$this->save($model);
|
|
} catch (AlreadyExistsException $e) {
|
|
continue;
|
|
} catch (CouldNotSaveException $ex) {
|
|
continue;
|
|
}
|
|
$count++;
|
|
}
|
|
}
|
|
|
|
return $count;
|
|
}
|
|
}
|