mirror of
https://github.com/bdnugget/magento2.git
synced 2026-11-07 09:17:35 +00:00
129 lines
3.5 KiB
PHP
129 lines
3.5 KiB
PHP
<?php
|
|
/**
|
|
* Copyright © Magento, Inc. All rights reserved.
|
|
* See COPYING.txt for license details.
|
|
*/
|
|
declare(strict_types=1);
|
|
|
|
namespace Magento\OpenSearch\SearchAdapter;
|
|
|
|
use Magento\Elasticsearch\SearchAdapter\Aggregation\Builder as AggregationBuilder;
|
|
use Magento\Elasticsearch\SearchAdapter\ConnectionManager;
|
|
use Magento\Elasticsearch\SearchAdapter\QueryContainerFactory;
|
|
use Magento\Elasticsearch\SearchAdapter\ResponseFactory;
|
|
use Magento\Framework\Search\AdapterInterface;
|
|
use Magento\Framework\Search\RequestInterface;
|
|
use Magento\Framework\Search\Response\QueryResponse;
|
|
use Psr\Log\LoggerInterface;
|
|
|
|
/**
|
|
* OpenSearch Search Adapter
|
|
*/
|
|
class Adapter implements AdapterInterface
|
|
{
|
|
/**
|
|
* Mapper instance
|
|
*
|
|
* @var Mapper
|
|
*/
|
|
private $mapper;
|
|
|
|
/**
|
|
* @var ResponseFactory
|
|
*/
|
|
private $responseFactory;
|
|
|
|
/**
|
|
* @var ConnectionManager
|
|
*/
|
|
private $connectionManager;
|
|
|
|
/**
|
|
* @var AggregationBuilder
|
|
*/
|
|
private $aggregationBuilder;
|
|
|
|
/**
|
|
* @var QueryContainerFactory
|
|
*/
|
|
private $queryContainerFactory;
|
|
|
|
/**
|
|
* Empty response from OpenSearch
|
|
*
|
|
* @var array
|
|
*/
|
|
private static $emptyRawResponse = [
|
|
'hits' => [
|
|
'hits' => []
|
|
],
|
|
'aggregations' => [
|
|
'price_bucket' => [],
|
|
'category_bucket' => [
|
|
'buckets' => []
|
|
]
|
|
]
|
|
];
|
|
|
|
/**
|
|
* @var LoggerInterface
|
|
*/
|
|
private $logger;
|
|
|
|
/**
|
|
* @param ConnectionManager $connectionManager
|
|
* @param Mapper $mapper
|
|
* @param ResponseFactory $responseFactory
|
|
* @param AggregationBuilder $aggregationBuilder
|
|
* @param QueryContainerFactory $queryContainerFactory
|
|
* @param LoggerInterface $logger
|
|
*/
|
|
public function __construct(
|
|
ConnectionManager $connectionManager,
|
|
Mapper $mapper,
|
|
ResponseFactory $responseFactory,
|
|
AggregationBuilder $aggregationBuilder,
|
|
QueryContainerFactory $queryContainerFactory,
|
|
LoggerInterface $logger
|
|
) {
|
|
$this->connectionManager = $connectionManager;
|
|
$this->mapper = $mapper;
|
|
$this->responseFactory = $responseFactory;
|
|
$this->aggregationBuilder = $aggregationBuilder;
|
|
$this->queryContainerFactory = $queryContainerFactory;
|
|
$this->logger = $logger;
|
|
}
|
|
|
|
/**
|
|
* Search query
|
|
*
|
|
* @param RequestInterface $request
|
|
* @return QueryResponse
|
|
*/
|
|
public function query(RequestInterface $request) : QueryResponse
|
|
{
|
|
$client = $this->connectionManager->getConnection();
|
|
$aggregationBuilder = $this->aggregationBuilder;
|
|
$query = $this->mapper->buildQuery($request);
|
|
$aggregationBuilder->setQuery($this->queryContainerFactory->create(['query' => $query]));
|
|
|
|
try {
|
|
$rawResponse = $client->query($query);
|
|
} catch (\Exception $e) {
|
|
$this->logger->critical($e);
|
|
// return empty search result in case an exception is thrown from OpenSearch
|
|
$rawResponse = self::$emptyRawResponse;
|
|
}
|
|
|
|
$rawDocuments = $rawResponse['hits']['hits'] ?? [];
|
|
$queryResponse = $this->responseFactory->create(
|
|
[
|
|
'documents' => $rawDocuments,
|
|
'aggregations' => $aggregationBuilder->build($request, $rawResponse),
|
|
'total' => $rawResponse['hits']['total']['value'] ?? 0
|
|
]
|
|
);
|
|
return $queryResponse;
|
|
}
|
|
}
|