Adapter.php 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Elasticsearch\SearchAdapter;
  7. use Magento\Framework\App\ObjectManager;
  8. use Magento\Framework\Search\AdapterInterface;
  9. use Magento\Framework\Search\RequestInterface;
  10. use Magento\Framework\Search\Response\QueryResponse;
  11. use Magento\Elasticsearch\SearchAdapter\Aggregation\Builder as AggregationBuilder;
  12. /**
  13. * Elasticsearch Search Adapter
  14. */
  15. class Adapter implements AdapterInterface
  16. {
  17. /**
  18. * Mapper instance
  19. *
  20. * @var Mapper
  21. */
  22. protected $mapper;
  23. /**
  24. * Response Factory
  25. *
  26. * @var ResponseFactory
  27. */
  28. protected $responseFactory;
  29. /**
  30. * @var ConnectionManager
  31. */
  32. protected $connectionManager;
  33. /**
  34. * @var AggregationBuilder
  35. */
  36. protected $aggregationBuilder;
  37. /**
  38. * @var QueryContainerFactory
  39. */
  40. private $queryContainerFactory;
  41. /**
  42. * @param ConnectionManager $connectionManager
  43. * @param Mapper $mapper
  44. * @param ResponseFactory $responseFactory
  45. * @param AggregationBuilder $aggregationBuilder
  46. * @param QueryContainerFactory $queryContainerFactory
  47. */
  48. public function __construct(
  49. ConnectionManager $connectionManager,
  50. Mapper $mapper,
  51. ResponseFactory $responseFactory,
  52. AggregationBuilder $aggregationBuilder,
  53. QueryContainerFactory $queryContainerFactory = null
  54. ) {
  55. $this->connectionManager = $connectionManager;
  56. $this->mapper = $mapper;
  57. $this->responseFactory = $responseFactory;
  58. $this->aggregationBuilder = $aggregationBuilder;
  59. $this->queryContainerFactory = $queryContainerFactory
  60. ?: ObjectManager::getInstance()->get(QueryContainerFactory::class);
  61. }
  62. /**
  63. * @param RequestInterface $request
  64. * @return QueryResponse
  65. */
  66. public function query(RequestInterface $request)
  67. {
  68. $client = $this->connectionManager->getConnection();
  69. $aggregationBuilder = $this->aggregationBuilder;
  70. $query = $this->mapper->buildQuery($request);
  71. $aggregationBuilder->setQuery($this->queryContainerFactory->create(['query' => $query]));
  72. $rawResponse = $client->query($query);
  73. $rawDocuments = isset($rawResponse['hits']['hits']) ? $rawResponse['hits']['hits'] : [];
  74. $queryResponse = $this->responseFactory->create(
  75. [
  76. 'documents' => $rawDocuments,
  77. 'aggregations' => $aggregationBuilder->build($request, $rawResponse),
  78. ]
  79. );
  80. return $queryResponse;
  81. }
  82. }