Skip to content

Commit

Permalink
Add GROUP BY support to fetch
Browse files Browse the repository at this point in the history
  • Loading branch information
WyriHaximus committed Apr 3, 2021
1 parent 1d37f22 commit ad2cca2
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 0 deletions.
24 changes: 24 additions & 0 deletions src/Query/GroupBy.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

declare(strict_types=1);

namespace WyriHaximus\React\SimpleORM\Query;

final class GroupBy implements SectionInterface
{
/** @var array<string> */
private array $columns = [];

public function __construct(string ...$columns)
{
$this->columns = $columns;
}

/**
* @return iterable<string>
*/
public function columns(): iterable
{
yield from $this->columns;
}
}
13 changes: 13 additions & 0 deletions src/Repository.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
use Rx\Scheduler\ImmediateScheduler;
use Safe\DateTimeImmutable;
use WyriHaximus\React\SimpleORM\Annotation\JoinInterface;
use WyriHaximus\React\SimpleORM\Query\GroupBy;
use WyriHaximus\React\SimpleORM\Query\Limit;
use WyriHaximus\React\SimpleORM\Query\Order;
use WyriHaximus\React\SimpleORM\Query\SectionInterface;
Expand All @@ -25,6 +26,7 @@
use WyriHaximus\React\SimpleORM\Query\Where\Field;

use function array_key_exists;
use function array_map;
use function array_values;
use function explode;
use function is_scalar;
Expand All @@ -37,6 +39,7 @@
use function Safe\substr;
use function spl_object_hash;
use function strpos;
use function WyriHaximus\iteratorOrArrayToArray;

use const WyriHaximus\Constants\Boolean\TRUE_;
use const WyriHaximus\Constants\Numeric\ONE;
Expand Down Expand Up @@ -184,6 +187,16 @@ private function buildSelectQuery(SectionInterface ...$sections): SelectQuery
$query = $query->orderBy($field, $by->order());
}

break;
case $section instanceof GroupBy:
/**
* @psalm-suppress ArgumentTypeCoercion
* @psalm-suppress UndefinedInterfaceMethod
*/
$query = $query->groupBy(array_map(
fn (string $column): string => $this->translateFieldName($column),
iteratorOrArrayToArray($section->columns())
));
break;
}
}
Expand Down
12 changes: 12 additions & 0 deletions tests/FunctionalTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
use WyriHaximus\React\SimpleORM\Client;
use WyriHaximus\React\SimpleORM\ClientInterface;
use WyriHaximus\React\SimpleORM\Middleware\QueryCountMiddleware;
use WyriHaximus\React\SimpleORM\Query\GroupBy;
use WyriHaximus\React\SimpleORM\Query\Limit;
use WyriHaximus\React\SimpleORM\Query\Where;
use WyriHaximus\React\Tests\SimpleORM\Stub\BlogPostStub;
Expand Down Expand Up @@ -584,4 +585,15 @@ public function countWithConstraints(): void
$count = $this->await($repository->count(new Where(new Where\Field('author_id', 'eq', ['fb175cbc-04cc-41c7-8e35-6b817ac016ca']))), $this->loop, self::AWAIT_TIMEOUT);
self::assertSame(1, $count);
}

/**
* @test
*/
public function groupBy(): void
{
$repository = $this->client->repository(BlogPostStub::class);

$count = $this->await($repository->fetch(new GroupBy('author_id'))->count()->toPromise(), $this->loop, self::AWAIT_TIMEOUT);
self::assertSame(1, $count);
}
}

0 comments on commit ad2cca2

Please sign in to comment.