Skip to content

Commit 3d3af89

Browse files
committed
ACP2E-72: Search results suggestion give total count of 0 even though there are products
- Fixed the solution and test coverage.
1 parent 71088ef commit 3d3af89

File tree

5 files changed

+85
-198
lines changed

5 files changed

+85
-198
lines changed

app/code/Magento/AdvancedSearch/Plugin/Model/SearchSuggestionResultsCount.php

Lines changed: 0 additions & 64 deletions
This file was deleted.

app/code/Magento/AdvancedSearch/Test/Unit/Plugin/Model/SearchSuggestionResultsCountTest.php

Lines changed: 0 additions & 127 deletions
This file was deleted.

app/code/Magento/AdvancedSearch/etc/di.xml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,4 @@
4040
</arguments>
4141
</type>
4242
<preference for="Magento\AdvancedSearch\Model\Adapter\DataMapper\AdditionalFieldsProviderInterface" type="Magento\AdvancedSearch\Model\Adapter\DataMapper\AdditionalFieldsProvider" />
43-
<type name="Magento\Search\Model\QueryResult">
44-
<plugin name="getSearchSuggestionResultsCount" type="Magento\AdvancedSearch\Plugin\Model\SearchSuggestionResultsCount" sortOrder="1"/>
45-
</type>
4643
</config>

app/code/Magento/Elasticsearch/Model/DataProvider/Base/Suggestions.php

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66
namespace Magento\Elasticsearch\Model\DataProvider\Base;
77

8+
use Countable;
89
use Elasticsearch\Common\Exceptions\BadRequest400Exception;
910
use Magento\AdvancedSearch\Model\SuggestedQueriesInterface;
1011
use Magento\Elasticsearch\Model\Adapter\FieldMapper\Product\FieldProviderInterface;
@@ -13,11 +14,14 @@
1314
use Magento\Elasticsearch\SearchAdapter\SearchIndexNameResolver;
1415
use Magento\Framework\App\Config\ScopeConfigInterface;
1516
use Magento\Framework\App\ObjectManager;
17+
use Magento\Framework\Search\ResponseInterface;
1618
use Magento\Search\Model\QueryInterface;
1719
use Magento\Search\Model\QueryResultFactory;
1820
use Magento\Store\Model\ScopeInterface;
1921
use Magento\Store\Model\StoreManagerInterface as StoreManager;
2022
use Psr\Log\LoggerInterface;
23+
use Magento\Framework\Search\Request\Builder;
24+
use Magento\Framework\Search\SearchEngineInterface;
2125

2226
/**
2327
* Default implementation to provide suggestions mechanism for Elasticsearch
@@ -65,6 +69,16 @@ class Suggestions implements SuggestedQueriesInterface
6569
*/
6670
private $logger;
6771

72+
/**
73+
* @var Builder
74+
*/
75+
private $requestBuilder;
76+
77+
/**
78+
* @var SearchEngineInterface
79+
*/
80+
private $searchEngine;
81+
6882
/**
6983
* Suggestions constructor.
7084
*
@@ -76,6 +90,8 @@ class Suggestions implements SuggestedQueriesInterface
7690
* @param StoreManager $storeManager
7791
* @param FieldProviderInterface $fieldProvider
7892
* @param LoggerInterface|null $logger
93+
* @param Builder|null $requestBuilder
94+
* @param SearchEngineInterface|null $searchEngine
7995
*/
8096
public function __construct(
8197
ScopeConfigInterface $scopeConfig,
@@ -85,7 +101,9 @@ public function __construct(
85101
SearchIndexNameResolver $searchIndexNameResolver,
86102
StoreManager $storeManager,
87103
FieldProviderInterface $fieldProvider,
88-
LoggerInterface $logger = null
104+
LoggerInterface $logger = null,
105+
Builder $requestBuilder = null,
106+
SearchEngineInterface $searchEngine = null
89107
) {
90108
$this->queryResultFactory = $queryResultFactory;
91109
$this->connectionManager = $connectionManager;
@@ -95,6 +113,8 @@ public function __construct(
95113
$this->storeManager = $storeManager;
96114
$this->fieldProvider = $fieldProvider;
97115
$this->logger = $logger ?: ObjectManager::getInstance()->get(LoggerInterface::class);
116+
$this->requestBuilder = $requestBuilder ?: ObjectManager::getInstance()->get(Builder::class);
117+
$this->searchEngine = $searchEngine ?: ObjectManager::getInstance()->get(SearchEngineInterface::class);
98118
}
99119

100120
/**
@@ -115,7 +135,12 @@ public function getItems(QueryInterface $query)
115135
foreach ($suggestions as $suggestion) {
116136
$count = null;
117137
if ($isResultsCountEnabled) {
118-
$count = isset($suggestion['freq']) ? $suggestion['freq'] : null;
138+
$this->requestBuilder->setRequestName('quick_search_container');
139+
$this->requestBuilder->bind('search_term', $suggestion['text']);
140+
$request = $this->requestBuilder->create();
141+
/** @var ResponseInterface|Countable $searchResult */
142+
$searchResult = $this->searchEngine->search($request);
143+
$count = $searchResult->count();
119144
}
120145
$result[] = $this->queryResultFactory->create(
121146
[

app/code/Magento/Elasticsearch/Test/Unit/Model/DataProvider/Base/SuggestionsTest.php

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@
1616
use Magento\Elasticsearch\SearchAdapter\SearchIndexNameResolver;
1717
use Magento\Elasticsearch6\Model\Client\Elasticsearch;
1818
use Magento\Framework\App\Config\ScopeConfigInterface;
19+
use Magento\Framework\Search\Request\Builder;
20+
use Magento\Framework\Search\RequestInterface;
21+
use Magento\Framework\Search\ResponseInterface;
22+
use Magento\Framework\Search\SearchEngineInterface;
1923
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
2024
use Magento\Search\Model\QueryInterface;
2125
use Magento\Search\Model\QueryResult;
@@ -86,6 +90,16 @@ class SuggestionsTest extends TestCase
8690
*/
8791
private $query;
8892

93+
/**
94+
* @var Builder|MockObject
95+
*/
96+
protected $requestBuilder;
97+
98+
/**
99+
* @var SearchEngineInterface|MockObject
100+
*/
101+
protected $searchEngine;
102+
89103
/**
90104
* Set up test environment
91105
*
@@ -138,6 +152,14 @@ protected function setUp(): void
138152
->disableOriginalConstructor()
139153
->getMockForAbstractClass();
140154

155+
$this->requestBuilder = $this->getMockBuilder(Builder::class)
156+
->disableOriginalConstructor()
157+
->getMock();
158+
159+
$this->searchEngine = $this->getMockBuilder(SearchEngineInterface::class)
160+
->disableOriginalConstructor()
161+
->getMockForAbstractClass();
162+
141163
$objectManager = new ObjectManagerHelper($this);
142164

143165
$this->model = $objectManager->getObject(
@@ -151,6 +173,8 @@ protected function setUp(): void
151173
'storeManager' => $this->storeManager,
152174
'fieldProvider' => $this->fieldProvider,
153175
'logger' => $this->logger,
176+
'requestBuilder' => $this->requestBuilder,
177+
'searchEngine' => $this->searchEngine,
154178
]
155179
);
156180
}
@@ -197,8 +221,7 @@ public function testGetItemsWithEnabledSearchSuggestion(): void
197221
'options' => [
198222
'suggestion' => [
199223
'text' => 'query',
200-
'score' => 1,
201-
'freq' => 1,
224+
'score' => 1
202225
]
203226
]
204227
]
@@ -215,6 +238,7 @@ public function testGetItemsWithEnabledSearchSuggestion(): void
215238

216239
$this->queryResultFactory->expects($this->once())
217240
->method('create')
241+
->with(['queryText' => 'query', 'resultsCount' => 5])
218242
->willReturn($query);
219243

220244
$this->assertEquals([$query], $this->model->getItems($this->query));
@@ -291,5 +315,37 @@ private function prepareSearchQuery(): void
291315
$this->connectionManager->expects($this->once())
292316
->method('getConnection')
293317
->willReturn($this->client);
318+
319+
$request = $this->getMockBuilder(RequestInterface::class)
320+
->disableOriginalConstructor()
321+
->getMockForAbstractClass();
322+
323+
$response = $this->getMockBuilder(ResponseInterface::class)
324+
->disableOriginalConstructor()
325+
->onlyMethods(['count'])
326+
->getMockForAbstractClass();
327+
328+
$response->expects($this->any())
329+
->method('count')
330+
->willReturn(5);
331+
332+
$this->requestBuilder->expects($this->any())
333+
->method('setRequestName')
334+
->with('quick_search_container')
335+
->willReturnSelf();
336+
337+
$this->requestBuilder->expects($this->any())
338+
->method('bind')
339+
->with('search_term', 'query')
340+
->willReturnSelf();
341+
342+
$this->requestBuilder->expects($this->any())
343+
->method('create')
344+
->willReturn($request);
345+
346+
$this->searchEngine->expects($this->any())
347+
->method('search')
348+
->with($request)
349+
->willReturn($response);
294350
}
295351
}

0 commit comments

Comments
 (0)