Skip to content

Commit 03b4e15

Browse files
authored
ENGCOM-4481: Resolve Issue : Search REST API returns wrong total_count #21713
2 parents c7c7e3d + 19cf77f commit 03b4e15

File tree

2 files changed

+54
-2
lines changed

2 files changed

+54
-2
lines changed

lib/internal/Magento/Framework/Search/Adapter/Mysql/Adapter.php

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
use Magento\Framework\App\ResourceConnection;
99
use Magento\Framework\DB\Ddl\Table;
10+
use Magento\Framework\DB\Select;
1011
use Magento\Framework\Search\Adapter\Mysql\Aggregation\Builder as AggregationBuilder;
1112
use Magento\Framework\Search\AdapterInterface;
1213
use Magento\Framework\Search\RequestInterface;
@@ -49,6 +50,16 @@ class Adapter implements AdapterInterface
4950
*/
5051
private $temporaryStorageFactory;
5152

53+
/**
54+
* Query Select Parts to be skipped when prepare query for count
55+
*
56+
* @var array
57+
*/
58+
private $countSqlSkipParts = [
59+
\Magento\Framework\DB\Select::LIMIT_COUNT => true,
60+
\Magento\Framework\DB\Select::LIMIT_OFFSET => true,
61+
];
62+
5263
/**
5364
* @param Mapper $mapper
5465
* @param ResponseFactory $responseFactory
@@ -86,7 +97,7 @@ public function query(RequestInterface $request)
8697
$response = [
8798
'documents' => $documents,
8899
'aggregations' => $aggregations,
89-
'total' => count($documents)
100+
'total' => $this->getSize($query)
90101
];
91102
return $this->responseFactory->create($response);
92103
}
@@ -115,4 +126,39 @@ private function getConnection()
115126
{
116127
return $this->resource->getConnection();
117128
}
129+
130+
/**
131+
* Get rows size
132+
*
133+
* @param Select $query
134+
* @return int
135+
*/
136+
private function getSize(Select $query): int
137+
{
138+
$sql = $this->getSelectCountSql($query);
139+
$parentSelect = $this->getConnection()->select();
140+
$parentSelect->from(['core_select' => $sql]);
141+
$parentSelect->reset(\Magento\Framework\DB\Select::COLUMNS);
142+
$parentSelect->columns('COUNT(*)');
143+
$totalRecords = $this->getConnection()->fetchOne($parentSelect);
144+
145+
return intval($totalRecords);
146+
}
147+
148+
/**
149+
* Reset limit and offset
150+
*
151+
* @param Select $query
152+
* @return Select
153+
*/
154+
private function getSelectCountSql(Select $query): Select
155+
{
156+
foreach ($this->countSqlSkipParts as $part => $toSkip) {
157+
if ($toSkip) {
158+
$query->reset($part);
159+
}
160+
}
161+
162+
return $query;
163+
}
118164
}

lib/internal/Magento/Framework/Search/Test/Unit/Adapter/Mysql/AdapterTest.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,10 +161,16 @@ public function testQuery()
161161
$select = $this->getMockBuilder(\Magento\Framework\DB\Select::class)
162162
->disableOriginalConstructor()
163163
->getMock();
164-
$this->connectionAdapter->expects($this->once())
164+
165+
$this->connectionAdapter->expects($this->exactly(2))
165166
->method('select')
166167
->willReturn($select);
167168

169+
$this->connectionAdapter->expects($this->once())
170+
->method('fetchOne')
171+
->with($select)
172+
->willReturn($selectResult['total']);
173+
168174
$table = $this->getMockBuilder(\Magento\Framework\DB\Ddl\Table::class)
169175
->disableOriginalConstructor()
170176
->getMock();

0 commit comments

Comments
 (0)