Skip to content

Commit

Permalink
Merge pull request #4 from Larium/feature/sort-query
Browse files Browse the repository at this point in the history
[Feature] Sort query for MongoDb
  • Loading branch information
akDeveloper authored Nov 18, 2024
2 parents 8381397 + d186e76 commit 760126e
Show file tree
Hide file tree
Showing 5 changed files with 29 additions and 13 deletions.
1 change: 0 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
"keywords": ["http search", "search", "filtering", "criteria"],
"type": "library",
"license": "MIT",
"version": "1.1.0",
"authors": [
{
"name": "Andreas Kollaros",
Expand Down
2 changes: 1 addition & 1 deletion src/Doctrine/Dbal/DoctrineDbalResult.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
28 changes: 22 additions & 6 deletions src/MongoDb/MongoDbResult.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand All @@ -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
Expand All @@ -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;
}
Expand Down
8 changes: 4 additions & 4 deletions tests/Doctrine/Dbal/DoctrineDbalPaginatorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand All @@ -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],
Expand All @@ -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());
Expand All @@ -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());
Expand Down
3 changes: 2 additions & 1 deletion tests/Doctrine/Dbal/DoctrineDbalSearchEngineTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down

0 comments on commit 760126e

Please sign in to comment.