From 595fe313397c37af6a4180ec15fc35e57aaf2a92 Mon Sep 17 00:00:00 2001 From: akDeveloper Date: Mon, 18 Nov 2024 17:56:21 +0200 Subject: [PATCH 1/2] Add sorting support for monogdb query --- src/Doctrine/Dbal/DoctrineDbalResult.php | 2 +- src/MongoDb/MongoDbResult.php | 28 +++++++++++++++---- .../Dbal/DoctrineDbalPaginatorTest.php | 8 +++--- .../Dbal/DoctrineDbalSearchEngineTest.php | 3 +- 4 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/Doctrine/Dbal/DoctrineDbalResult.php b/src/Doctrine/Dbal/DoctrineDbalResult.php index 549a03e..8f466cf 100644 --- a/src/Doctrine/Dbal/DoctrineDbalResult.php +++ b/src/Doctrine/Dbal/DoctrineDbalResult.php @@ -44,7 +44,7 @@ public function count(): int } else { $sql = sprintf('COUNT(%s) AS total_results', $this->getCountField()); $qb->select($sql) - ->resetQueryPart('orderBy') + ->resetOrderBy() ->setMaxResults(1); } diff --git a/src/MongoDb/MongoDbResult.php b/src/MongoDb/MongoDbResult.php index 5052732..c329a0b 100644 --- a/src/MongoDb/MongoDbResult.php +++ b/src/MongoDb/MongoDbResult.php @@ -21,7 +21,9 @@ public function __construct( public function fetch(int $offset, int $limit): array { $filter = $this->normalizeFilter(); - $iterator = $this->collection->find($filter, ['skip' => $offset, 'limit' => $limit]); + $options = ['skip' => $offset, 'limit' => $limit]; + $options = $this->addSorting($filter, $options); + $iterator = $this->collection->find($filter, $options); return iterator_to_array($iterator); } @@ -41,7 +43,20 @@ public function setCountCallable(callable $function): void public function count(): int { - return $this->collection->countDocuments($this->normalizeFilter()); + $filter = $this->normalizeFilter(); + $options = $this->addSorting($filter, []); + + return $this->collection->countDocuments($filter, $options); + } + + private function addSorting(array &$filter, array $options): array + { + if (isset($filter['sort'])) { + $options['sort'] = $filter['sort']; + unset($filter['sort']); + } + + return $options; } private function normalizeFilter(): array @@ -50,10 +65,11 @@ private function normalizeFilter(): array return $this->filter; } - $this->filter = array_reduce($this->filterBuilder->getArrayCopy(), function (array $result, array $item) { - $result = array_merge($result, $item); - return $result; - }, []); + $this->filter = array_reduce( + $this->filterBuilder->getArrayCopy(), + fn (array $result, array $item) => array_merge($result, $item), + [] + ); return $this->filter; } diff --git a/tests/Doctrine/Dbal/DoctrineDbalPaginatorTest.php b/tests/Doctrine/Dbal/DoctrineDbalPaginatorTest.php index b3b662c..0aa89c5 100644 --- a/tests/Doctrine/Dbal/DoctrineDbalPaginatorTest.php +++ b/tests/Doctrine/Dbal/DoctrineDbalPaginatorTest.php @@ -4,11 +4,11 @@ namespace Larium\Search\Doctrine\Dbal; -use Larium\Search\Criteria; use Larium\Search\Result; use PHPUnit\Framework\TestCase; use ArrayIterator; use Larium\Search\Criteria\Paginating; +use Larium\Search\ResultPaginator; class DoctrineDbalPaginatorTest extends TestCase { @@ -17,7 +17,7 @@ class DoctrineDbalPaginatorTest extends TestCase public function setUp(): void { $this->result = $this->createMock(Result::class); - $this->result->expects($this->any())->method('count')->will($this->returnValue(20)); + $this->result->expects($this->any())->method('count')->willReturn(20); $this->result->expects($this->any())->method('fetch')->willReturn([ ['id' => 1, 'amount' => 1000], ['id' => 2, 'amount' => 4500], @@ -30,7 +30,7 @@ public function setUp(): void public function testPaginator(): void { $paginating = Paginating::fromQueryParams(['page' => 1, 'limit' => 5]); - $p = new DoctrineDbalPaginator($this->result, $paginating); + $p = new ResultPaginator($this->result, $paginating); $iterator = $p->getIterator(); $this->assertEquals(1, $p->getCurrentPage()); @@ -41,7 +41,7 @@ public function testPaginator(): void $this->assertInstanceOf(ArrayIterator::class, $iterator); $paginating = Paginating::fromQueryParams(['page' => 2, 'limit' => 5]); - $p = new DoctrineDbalPaginator($this->result, $paginating); + $p = new ResultPaginator($this->result, $paginating); $this->assertEquals(2, $p->getCurrentPage()); $this->assertEquals(4, $p->getTotalPages()); $this->assertTrue($p->hasMore()); diff --git a/tests/Doctrine/Dbal/DoctrineDbalSearchEngineTest.php b/tests/Doctrine/Dbal/DoctrineDbalSearchEngineTest.php index 0faa1b8..d43dbba 100644 --- a/tests/Doctrine/Dbal/DoctrineDbalSearchEngineTest.php +++ b/tests/Doctrine/Dbal/DoctrineDbalSearchEngineTest.php @@ -11,11 +11,12 @@ use Larium\Search\Doctrine\Dbal\Builder\TransactionBuilder; use Larium\Search\Doctrine\Dbal\Builder\TransactionStatusBuilder; use Larium\Search\Result; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; class DoctrineDbalSearchEngineTest extends TestCase { - private $conn; + private Connection|MockObject $conn; public function setUp(): void { From d186e765eff18f83a20744f7052922f67b03ddcc Mon Sep 17 00:00:00 2001 From: akDeveloper Date: Mon, 18 Nov 2024 17:57:18 +0200 Subject: [PATCH 2/2] Remove version from composer --- composer.json | 1 - 1 file changed, 1 deletion(-) diff --git a/composer.json b/composer.json index 068a1c0..c7fbe6e 100644 --- a/composer.json +++ b/composer.json @@ -4,7 +4,6 @@ "keywords": ["http search", "search", "filtering", "criteria"], "type": "library", "license": "MIT", - "version": "1.1.0", "authors": [ { "name": "Andreas Kollaros",