Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

use ComplexHeart\Domain\Criteria\Criteria;
use Illuminate\Contracts\Database\Query\Builder;
use Illuminate\Contracts\Pagination\LengthAwarePaginator;

/**
* Interface IlluminateCriteriaParser
Expand All @@ -20,7 +21,7 @@ interface IlluminateCriteriaParser
*
* @param Builder $builder
* @param Criteria $criteria
* @return Builder
* @return Builder|LengthAwarePaginator
*/
public function applyCriteria(Builder $builder, Criteria $criteria): Builder;
public function applyCriteria(Builder $builder, Criteria $criteria): Builder|LengthAwarePaginator;
}
28 changes: 17 additions & 11 deletions src/Infrastructure/Laravel/Persistence/EloquentCriteriaParser.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,22 +12,25 @@
use ComplexHeart\Domain\Criteria\Page;
use ComplexHeart\Infrastructure\Laravel\Persistence\Contracts\IlluminateCriteriaParser;
use Illuminate\Contracts\Database\Query\Builder;
use Illuminate\Contracts\Pagination\LengthAwarePaginator;

/**
* Class EloquentCriteriaParser
*
* @author Unay Santisteban <usantisteban@othercode.io>
* @package ComplexHeart\Infrastructure\Laravel\Persistence
*/
class EloquentCriteriaParser implements IlluminateCriteriaParser
readonly class EloquentCriteriaParser implements IlluminateCriteriaParser
{
/**
* DefaultCriteriaParser constructor.
*
* @param array<string, string> $filterAttributes
*/
public function __construct(private readonly array $filterAttributes = [])
{
public function __construct(
private array $filterAttributes = [],
private bool $paginator = false
) {
}

/**
Expand Down Expand Up @@ -63,9 +66,9 @@ private function filterAttribute(string $fieldAttribute): string
*
* @param Builder $builder
* @param Criteria $criteria
* @return Builder
* @return Builder|LengthAwarePaginator
*/
public function applyCriteria(Builder $builder, Criteria $criteria): Builder
public function applyCriteria(Builder $builder, Criteria $criteria): Builder|LengthAwarePaginator
{
$builder = $this->applyFilterGroups($builder, $criteria->groups());
$builder = $this->applyOrdering($builder, $criteria->order());
Expand Down Expand Up @@ -144,10 +147,6 @@ private function applyFilter(Builder $builder, Filter $filter): Builder

/**
* Apply the ordering settings into the given QueryBuilder.
*
* @param Builder $builder
* @param Order $ordering
* @return Builder
*/
private function applyOrdering(Builder $builder, Order $ordering): Builder
{
Expand All @@ -167,11 +166,18 @@ private function applyOrdering(Builder $builder, Order $ordering): Builder
*
* @param Builder $builder
* @param Page $page
* @return Builder
* @return Builder|LengthAwarePaginator
*/
private function applyPage(Builder $builder, Page $page): Builder
private function applyPage(Builder $builder, Page $page): Builder|LengthAwarePaginator
{
if ($page->limit() > 0) {
if ($this->paginator) {
return $builder->paginate(
perPage: $page->limit(),
page: ($page->offset() / $page->limit()) + 1,
);
}

$builder = $builder->limit($page->limit());
$builder = $builder->offset($page->offset());
}
Expand Down
11 changes: 11 additions & 0 deletions tests/Integration/EloquentCriteriaParserTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use ComplexHeart\Domain\Criteria\FilterGroup;
use ComplexHeart\Infrastructure\Laravel\Persistence\EloquentCriteriaParser;
use ComplexHeart\Tests\Fixtures\Infrastructure\Persistence\Laravel\Sources\UserDatabaseSource;
use Illuminate\Pagination\LengthAwarePaginator;

beforeEach(function () {
$this->createApplication();
Expand Down Expand Up @@ -252,4 +253,14 @@

expect($builder->toRawSql())
->toBe('select * from "users"');
});

test('EloquentCriteriaParser should return a LengthAwarePaginator object if option is true.', function () {
$parser = new EloquentCriteriaParser([], true);

$criteria = Criteria::default()
->withPageNumber(2, 25);
$page = $parser->applyCriteria(UserDatabaseSource::query(), $criteria);

expect($page)->toBeInstanceOf(LengthAwarePaginator::class);
});
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
->withFilterGroup(FilterGroup::create()
->addFilterEqual('name', 'Vincent'));

$repo = new UsersEloquentRepository();
$repo = new UsersEloquentRepository();
$users = $repo->match($criteria);

expect($users)->toHaveCount(1);
Expand Down