Skip to content

Commit 4f54b48

Browse files
author
Joan He
committed
Merge remote-tracking branch 'origin/MAGETWO-94172-ElasticSearch-Index-Exception' into BugFixPR
2 parents 2de6f90 + 4f755e6 commit 4f54b48

File tree

2 files changed

+147
-4
lines changed
  • app/code/Magento/Elasticsearch/Elasticsearch5/SearchAdapter
  • dev/tests/integration/testsuite/Magento/Elasticsearch/Elasticsearch5/SearchAdapter

2 files changed

+147
-4
lines changed

app/code/Magento/Elasticsearch/Elasticsearch5/SearchAdapter/Adapter.php

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use Magento\Elasticsearch\SearchAdapter\Aggregation\Builder as AggregationBuilder;
1313
use Magento\Elasticsearch\SearchAdapter\ConnectionManager;
1414
use \Magento\Elasticsearch\SearchAdapter\ResponseFactory;
15+
use Psr\Log\LoggerInterface;
1516

1617
/**
1718
* Elasticsearch Search Adapter
@@ -47,25 +48,55 @@ class Adapter implements AdapterInterface
4748
*/
4849
private $queryContainerFactory;
4950

51+
/**
52+
* Empty response from Elasticsearch.
53+
*
54+
* @var array
55+
*/
56+
private static $emptyRawResponse = [
57+
"hits" =>
58+
[
59+
"hits" => []
60+
],
61+
"aggregations" =>
62+
[
63+
"price_bucket" => [],
64+
"category_bucket" =>
65+
[
66+
"buckets" => []
67+
68+
]
69+
]
70+
];
71+
72+
/**
73+
* @var LoggerInterface
74+
*/
75+
private $logger;
76+
5077
/**
5178
* @param ConnectionManager $connectionManager
5279
* @param Mapper $mapper
5380
* @param ResponseFactory $responseFactory
5481
* @param AggregationBuilder $aggregationBuilder
5582
* @param \Magento\Elasticsearch\SearchAdapter\QueryContainerFactory $queryContainerFactory
83+
* @param LoggerInterface $logger
5684
*/
5785
public function __construct(
5886
ConnectionManager $connectionManager,
5987
Mapper $mapper,
6088
ResponseFactory $responseFactory,
6189
AggregationBuilder $aggregationBuilder,
62-
\Magento\Elasticsearch\SearchAdapter\QueryContainerFactory $queryContainerFactory
90+
\Magento\Elasticsearch\SearchAdapter\QueryContainerFactory $queryContainerFactory,
91+
LoggerInterface $logger = null
6392
) {
6493
$this->connectionManager = $connectionManager;
6594
$this->mapper = $mapper;
6695
$this->responseFactory = $responseFactory;
6796
$this->aggregationBuilder = $aggregationBuilder;
6897
$this->queryContainerFactory = $queryContainerFactory;
98+
$this->logger = $logger ?: ObjectManager::getInstance()
99+
->get(LoggerInterface::class);
69100
}
70101

71102
/**
@@ -76,13 +107,18 @@ public function query(RequestInterface $request)
76107
{
77108
$client = $this->connectionManager->getConnection();
78109
$aggregationBuilder = $this->aggregationBuilder;
79-
80110
$query = $this->mapper->buildQuery($request);
81111
$aggregationBuilder->setQuery($this->queryContainerFactory->create(['query' => $query]));
82-
$rawResponse = $client->query($query);
83112

84-
$rawDocuments = isset($rawResponse['hits']['hits']) ? $rawResponse['hits']['hits'] : [];
113+
try {
114+
$rawResponse = $client->query($query);
115+
} catch (\Exception $e) {
116+
$this->logger->critical($e);
117+
// return empty search result in case an exception is thrown from Elasticsearch
118+
$rawResponse = self::$emptyRawResponse;
119+
}
85120

121+
$rawDocuments = isset($rawResponse['hits']['hits']) ? $rawResponse['hits']['hits'] : [];
86122
$queryResponse = $this->responseFactory->create(
87123
[
88124
'documents' => $rawDocuments,
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Elasticsearch\Elasticsearch5\SearchAdapter;
9+
10+
use Magento\TestFramework\Helper\Bootstrap;
11+
12+
/**
13+
* Class AdapterTest
14+
*/
15+
class AdapterTest extends \PHPUnit\Framework\TestCase
16+
{
17+
/**
18+
* @var \Magento\Elasticsearch\Elasticsearch5\SearchAdapter\Adapter
19+
*/
20+
private $adapter;
21+
22+
/**
23+
* @var \Magento\Elasticsearch\Model\Client\Elasticsearch|\PHPUnit\Framework\MockObject\MockObject
24+
*/
25+
private $clientMock;
26+
27+
/**
28+
* @var \Magento\Framework\Search\Request\Builder
29+
*/
30+
private $requestBuilder;
31+
32+
/**
33+
* @var \Psr\Log\LoggerInterface|\PHPUnit\Framework\MockObject\MockObject
34+
*/
35+
private $loggerMock;
36+
37+
/**
38+
* @return void
39+
*/
40+
protected function setUp()
41+
{
42+
$objectManager = Bootstrap::getObjectManager();
43+
$contentManager = $this->getMockBuilder(\Magento\Elasticsearch\SearchAdapter\ConnectionManager::class)
44+
->disableOriginalConstructor()
45+
->getMock();
46+
$this->clientMock = $this->getMockBuilder(\Magento\Elasticsearch\Model\Client\Elasticsearch::class)
47+
->disableOriginalConstructor()
48+
->getMock();
49+
$contentManager
50+
->expects($this->any())
51+
->method('getConnection')
52+
->willReturn($this->clientMock);
53+
/** @var \Magento\Framework\Search\Request\Config\Converter $converter */
54+
$converter = $objectManager->create(\Magento\Framework\Search\Request\Config\Converter::class);
55+
56+
$document = new \DOMDocument();
57+
$document->load($this->getRequestConfigPath());
58+
$requestConfig = $converter->convert($document);
59+
60+
/** @var \Magento\Framework\Search\Request\Config $config */
61+
$config = $objectManager->create(\Magento\Framework\Search\Request\Config::class);
62+
$config->merge($requestConfig);
63+
64+
$this->requestBuilder = $objectManager->create(
65+
\Magento\Framework\Search\Request\Builder::class,
66+
['config' => $config]
67+
);
68+
$this->loggerMock = $this->getMockForAbstractClass(\Psr\Log\LoggerInterface::class);
69+
70+
$this->adapter = $objectManager->create(
71+
\Magento\Elasticsearch\Elasticsearch5\SearchAdapter\Adapter::class,
72+
[
73+
'connectionManager' => $contentManager,
74+
'logger' => $this->loggerMock
75+
]
76+
);
77+
}
78+
79+
/**
80+
* @magentoAppIsolation enabled
81+
* @magentoConfigFixture default/catalog/search/engine elasticsearch
82+
* @magentoConfigFixture current_store catalog/search/elasticsearch_index_prefix adaptertest
83+
* @return void
84+
*/
85+
public function testQuery()
86+
{
87+
$this->requestBuilder->bind('fulltext_search_query', 'socks');
88+
$this->requestBuilder->setRequestName('one_match');
89+
$queryRequest = $this->requestBuilder->create();
90+
$exception = new \Exception('Test Message');
91+
$this->loggerMock->expects($this->once())->method('critical')->with($exception);
92+
$this->clientMock->expects($this->once())->method('query')->willThrowException($exception);
93+
$actualResponse = $this->adapter->query($queryRequest);
94+
$this->assertEmpty($actualResponse->getAggregations()->getBuckets());
95+
$this->assertEquals(0, $actualResponse->count());
96+
}
97+
98+
/**
99+
* Get request config path
100+
*
101+
* @return string
102+
*/
103+
private function getRequestConfigPath()
104+
{
105+
return __DIR__ . '/../../_files/requests.xml';
106+
}
107+
}

0 commit comments

Comments
 (0)