<?php declare(strict_types=1);
namespace Swag\EnterpriseSearch\IndexingQuery;
use Shopware\Core\Framework\Api\Context\SalesChannelApiSource;
use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\DataAbstractionLayer\DefinitionInstanceRegistry;
use Shopware\Core\Framework\DataAbstractionLayer\EntityDefinition;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
class IndexingQueryService
{
/**
* @var DefinitionInstanceRegistry
*/
private $definitionInstanceRegistry;
/**
* @var IndexingQueryGateway
*/
private $indexingQueryGateway;
public function __construct(
DefinitionInstanceRegistry $definitionInstanceRegistry,
IndexingQueryGateway $indexingQueryGateway
) {
$this->definitionInstanceRegistry = $definitionInstanceRegistry;
$this->indexingQueryGateway = $indexingQueryGateway;
}
public function getQueries(EntityDefinition $entityDefinition, Context $context): ?IndexingQueryEntity
{
$source = $context->getSource();
if (!$source instanceof SalesChannelApiSource) {
return null;
}
if (IndexingQueryExtension::hasIndexingQueryExtension($context)) {
$extension = IndexingQueryExtension::getIndexingQueryExtension($context);
} else {
IndexingQueryExtension::addIndexingQueryExtension($context);
$extension = IndexingQueryExtension::getIndexingQueryExtension($context);
}
if (!$extension->isCached()) {
return null;
}
if ($extension->hasIndexingQueryEntityForEntity($entityDefinition->getEntityName())) {
return $extension->getIndexingQueryEntityForEntity($entityDefinition->getEntityName());
}
$indexingQuery = $this->getIndexingQuery($source, $entityDefinition);
if (!$indexingQuery) {
return null;
}
$boostingCollection = $this->indexingQueryGateway->fromJsonToBoostingCollection($indexingQuery->boostingJson ?? []);
$relevanceCollection = $this->indexingQueryGateway->fromJsonToRelevanceCollection($indexingQuery->relevanceJson ?? []);
$indexingQuery->setBoostingCollection($boostingCollection);
$indexingQuery->setRelevanceCollection($relevanceCollection);
$extension->setIndexingQueryForEntity($indexingQuery);
return $indexingQuery;
}
private function getIndexingQuery(SalesChannelApiSource $apiSource, EntityDefinition $entityDefinition): ?IndexingQueryEntity
{
$criteria = new Criteria();
$criteria->addFilter(
new EqualsFilter('salesChannelId', $apiSource->getSalesChannelId()),
new EqualsFilter('entityName', $entityDefinition->getEntityName())
);
return $this->definitionInstanceRegistry->getRepository(IndexingQueryDefinition::ENTITY_NAME)
->search($criteria, Context::createDefaultContext())
->first();
}
}