Skip to content

Commit d519fc7

Browse files
committed
Enforce where and order fully through objects
1 parent 846069d commit d519fc7

14 files changed

+197
-94
lines changed

infection.json.dist

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
"Foreach_": false,
2222
"CloneRemoval": false,
2323
"Decrement": false,
24+
"Coalesce": false,
2425
"FunctionCallRemoval": {
2526
"ignore": [
2627
"WyriHaximus\\TestUtilities\\TestCase::waitUntilTheNextSecond"

phpstan.neon

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,14 @@ parameters:
1111
- '#Variable property access on \$this\(WyriHaximus\\React\\SimpleORM\\Annotation\\LeftJoin\).#'
1212
- '#Parameter \#1 \$argument of class ReflectionClass constructor expects class-string<T of object>\|T of object, string given.#'
1313
- '#Variable property access on#'
14+
- '#Method WyriHaximus\\React\\SimpleORM\\RepositoryInterface::page\(\) has parameter \$order#'
15+
- '#Method WyriHaximus\\React\\SimpleORM\\RepositoryInterface::page\(\) has parameter \$where#'
16+
- '#Method WyriHaximus\\React\\SimpleORM\\RepositoryInterface::fetch\(\) has parameter \$order#'
17+
- '#Method WyriHaximus\\React\\SimpleORM\\RepositoryInterface::fetch\(\) has parameter \$where#'
18+
- '#Method WyriHaximus\\React\\SimpleORM\\Repository::page\(\) has parameter \$order#'
19+
- '#Method WyriHaximus\\React\\SimpleORM\\Repository::page\(\) has parameter \$where#'
20+
- '#Method WyriHaximus\\React\\SimpleORM\\Repository::fetch\(\) has parameter \$order#'
21+
- '#Method WyriHaximus\\React\\SimpleORM\\Repository::fetch\(\) has parameter \$where#'
1422
ergebnis:
1523
classesAllowedToBeExtended:
1624
- WyriHaximus\TestUtilities\TestCase

src/Query/Order.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace WyriHaximus\React\SimpleORM\Query;
4+
5+
final class Order
6+
{
7+
/** @var array<OrderInterface> */
8+
private array $orders = [];
9+
10+
public function __construct(OrderInterface ...$orders)
11+
{
12+
$this->orders = $orders;
13+
}
14+
15+
/**
16+
* @return iterable<OrderInterface>
17+
*/
18+
public function orders(): iterable
19+
{
20+
yield from $this->orders;
21+
}
22+
}

src/Query/Order/Asc.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace WyriHaximus\React\SimpleORM\Query\Order;
4+
5+
use WyriHaximus\React\SimpleORM\Query\OrderInterface;
6+
7+
final class Asc implements OrderInterface
8+
{
9+
private string $field;
10+
11+
public function __construct(string $field)
12+
{
13+
$this->field = $field;
14+
}
15+
16+
public function field(): string
17+
{
18+
return $this->field;
19+
}
20+
21+
public function order(): string
22+
{
23+
return 'ASC';
24+
}
25+
}

src/Query/Order/Desc.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace WyriHaximus\React\SimpleORM\Query\Order;
4+
5+
use WyriHaximus\React\SimpleORM\Query\OrderInterface;
6+
7+
final class Desc implements OrderInterface
8+
{
9+
private string $field;
10+
11+
public function __construct(string $field)
12+
{
13+
$this->field = $field;
14+
}
15+
16+
public function field(): string
17+
{
18+
return $this->field;
19+
}
20+
21+
public function order(): string
22+
{
23+
return 'DESC';
24+
}
25+
}

src/Query/OrderInterface.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace WyriHaximus\React\SimpleORM\Query;
4+
5+
interface OrderInterface
6+
{
7+
public function field(): string;
8+
9+
public function order(): string;
10+
}

src/Query/Where.php

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,33 +2,21 @@
22

33
namespace WyriHaximus\React\SimpleORM\Query;
44

5-
use Latitude\QueryBuilder\Builder\CriteriaBuilder;
6-
use Latitude\QueryBuilder\CriteriaInterface;
7-
85
final class Where
96
{
10-
private string $field;
11-
private string $criteria;
12-
/** @var mixed[] */
13-
private array $criteriaArguments = [];
14-
15-
/**
16-
* @param mixed[] $criteriaArguments
17-
*/
18-
public function __construct(string $field, string $criteria, array $criteriaArguments)
19-
{
20-
$this->field = $field;
21-
$this->criteria = $criteria;
22-
$this->criteriaArguments = $criteriaArguments;
23-
}
7+
/** @var array<WhereInterface> */
8+
private array $wheres = [];
249

25-
public function field(): string
10+
public function __construct(WhereInterface ...$wheres)
2611
{
27-
return $this->field;
12+
$this->wheres = $wheres;
2813
}
2914

30-
public function applyCriteria(CriteriaBuilder $criteria): CriteriaInterface
15+
/**
16+
* @return iterable<WhereInterface>
17+
*/
18+
public function wheres(): iterable
3119
{
32-
return $criteria->{$this->criteria}(...$this->criteriaArguments);
20+
yield from $this->wheres;
3321
}
3422
}

src/Query/ExpressionWhere.php renamed to src/Query/Where/Expression.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
<?php declare(strict_types=1);
22

3-
namespace WyriHaximus\React\SimpleORM\Query;
3+
namespace WyriHaximus\React\SimpleORM\Query\Where;
44

55
use Latitude\QueryBuilder\Builder\CriteriaBuilder;
66
use Latitude\QueryBuilder\CriteriaInterface;
77
use Latitude\QueryBuilder\ExpressionInterface;
8+
use WyriHaximus\React\SimpleORM\Query\WhereInterface;
89

9-
final class ExpressionWhere
10+
final class Expression implements WhereInterface
1011
{
1112
private ExpressionInterface $expression;
1213
private string $criteria;

src/Query/Where/Field.php

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace WyriHaximus\React\SimpleORM\Query\Where;
4+
5+
use Latitude\QueryBuilder\Builder\CriteriaBuilder;
6+
use Latitude\QueryBuilder\CriteriaInterface;
7+
use WyriHaximus\React\SimpleORM\Query\WhereInterface;
8+
9+
final class Field implements WhereInterface
10+
{
11+
private string $field;
12+
private string $criteria;
13+
/** @var mixed[] */
14+
private array $criteriaArguments = [];
15+
16+
/**
17+
* @param mixed[] $criteriaArguments
18+
*/
19+
public function __construct(string $field, string $criteria, array $criteriaArguments)
20+
{
21+
$this->field = $field;
22+
$this->criteria = $criteria;
23+
$this->criteriaArguments = $criteriaArguments;
24+
}
25+
26+
public function field(): string
27+
{
28+
return $this->field;
29+
}
30+
31+
public function applyCriteria(CriteriaBuilder $criteria): CriteriaInterface
32+
{
33+
return $criteria->{$this->criteria}(...$this->criteriaArguments);
34+
}
35+
}

src/Query/WhereInterface.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace WyriHaximus\React\SimpleORM\Query;
4+
5+
interface WhereInterface
6+
{
7+
}

0 commit comments

Comments
 (0)