vendor/store.shopware.com/swagenterprisesearchplatform/src/Boosting/BoostingQueryBuilder.php line 45

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Swag\EnterpriseSearch\Boosting;
  3. use ONGR\ElasticsearchDSL\BuilderInterface;
  4. use ONGR\ElasticsearchDSL\Query\Compound\BoolQuery;
  5. use ONGR\ElasticsearchDSL\Query\Compound\ConstantScoreQuery;
  6. use ONGR\ElasticsearchDSL\Search;
  7. use Shopware\Core\Framework\Context;
  8. use Shopware\Core\Framework\DataAbstractionLayer\EntityDefinition;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Exception\SearchRequestException;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Search\Parser\QueryStringParser;
  12. use Shopware\Elasticsearch\Framework\DataAbstractionLayer\CriteriaParser;
  13. use Swag\EnterpriseSearch\Common\SesExtension;
  14. /**
  15.  * Handles a given boosting struct and returns the corresponding ES query object for the `boostingRule`
  16.  */
  17. class BoostingQueryBuilder
  18. {
  19.     public const FILTER 'filter';
  20.     public const BOOSTING 'boosting';
  21.     /**
  22.      * @var BoostingProvider
  23.      */
  24.     private $boostingProvider;
  25.     /**
  26.      * @var CriteriaParser
  27.      */
  28.     private $criteriaParser;
  29.     public function __construct(
  30.         BoostingProvider $boostingProvider,
  31.         CriteriaParser $criteriaParser
  32.     ) {
  33.         $this->boostingProvider $boostingProvider;
  34.         $this->criteriaParser $criteriaParser;
  35.     }
  36.     public function addBoostingQuery(EntityDefinition $definitionCriteria $criteriaSearch $searchContext $context): void
  37.     {
  38.         $boostingCombinations $this->boostingProvider->getActiveBoostings($definition$context);
  39.         foreach ($boostingCombinations as $boostingCombination) {
  40.             $filters $boostingCombination[self::FILTER];
  41.             /** @var BoostingEntity $boostingEntity */
  42.             $boostingEntity $boostingCombination[self::BOOSTING];
  43.             if (empty($filters)) {
  44.                 continue;
  45.             }
  46.             if (!$boostingEntity->isActive() || !$boostingEntity->isValid()) {
  47.                 continue;
  48.             }
  49.             $search->addQuery($this->getBoostingQuery($boostingEntity$definition$context$filters), BoolQuery::SHOULD);
  50.         }
  51.     }
  52.     protected function getBoostingQuery(BoostingEntity $boostingEntityDefinition $definitionContext $context, array $filters): BuilderInterface
  53.     {
  54.         $filter QueryStringParser::fromArray($definition$filters, new SearchRequestException());
  55.         $query = new ConstantScoreQuery($this->criteriaParser->parseFilter($filter$definition$definition->getEntityName(), $context));
  56.         $query->addParameter('boost'$boosting->getBoost());
  57.         if (SesExtension::isExplanation($context)) {
  58.             $boostingValue = (string) $boosting->getBoost();
  59.             $query->addParameter('_name''Boosting ' $boosting->getTranslation('name') . ' ' $boostingValue);
  60.         }
  61.         return $query;
  62.     }
  63. }