Skip to content

Commit

Permalink
Introduce Order enum
Browse files Browse the repository at this point in the history
The plan is to ultimately use it and only it dealing with
Criteria::$orderings.
  • Loading branch information
greg0ire committed Feb 18, 2024
1 parent 9ee74e0 commit ef0de41
Show file tree
Hide file tree
Showing 7 changed files with 50 additions and 16 deletions.
2 changes: 1 addition & 1 deletion docs/en/expressions.rst
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ orderBy
Sets the ordering of the result of this Criteria.

.. code-block:: php
$criteria->orderBy(['name' => Criteria::ASC]);
$criteria->orderBy(['name' => Order::Ascending]);
setFirstResult
--------------
Expand Down
2 changes: 1 addition & 1 deletion src/ArrayCollection.php
Original file line number Diff line number Diff line change
Expand Up @@ -471,7 +471,7 @@ public function matching(Criteria $criteria)
if ($orderings) {
$next = null;
foreach (array_reverse($orderings) as $field => $ordering) {
$next = ClosureExpressionVisitor::sortByField($field, $ordering === Criteria::DESC ? -1 : 1, $next);
$next = ClosureExpressionVisitor::sortByField($field, $ordering === Order::DESC->value ? -1 : 1, $next);

Check failure on line 474 in src/ArrayCollection.php

View workflow job for this annotation

GitHub Actions / Static Analysis / PHPStan (8.1)

Access to undefined constant Doctrine\Common\Collections\Order::DESC.

Check failure on line 474 in src/ArrayCollection.php

View workflow job for this annotation

GitHub Actions / Static Analysis / Psalm (8.1)

UndefinedConstant

src/ArrayCollection.php:474:85: UndefinedConstant: Constant Doctrine\Common\Collections\Order::DESC is not defined (see https://psalm.dev/020)

Check failure on line 474 in src/ArrayCollection.php

View workflow job for this annotation

GitHub Actions / Static Analysis / Psalm (8.1)

MixedPropertyFetch

src/ArrayCollection.php:474:85: MixedPropertyFetch: Cannot fetch property on mixed var Doctrine\Common\Collections\Order::DESC (see https://psalm.dev/034)
}

uasort($filtered, $next);
Expand Down
31 changes: 25 additions & 6 deletions src/Criteria.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ class Criteria

private static ExpressionBuilder|null $expressionBuilder = null;

/** @var array<string, string> */
/** @var array<string, Order> */
private array $orderings = [];

private int|null $firstResult = null;
Expand Down Expand Up @@ -154,26 +154,45 @@ public function getWhereExpression()
* @return array<string, string>
*/
public function getOrderings()
{
return array_map(
static fn (Order $ordering): string => $ordering->value,
$this->orderings,
);
}

/**
* Gets the current orderings of this Criteria.
*
* @return array<string, Order>
*/
public function orderings(): array
{
return $this->orderings;
}

/**
* Sets the ordering of the result of this Criteria.
*
* Keys are field and values are the order, being either ASC or DESC.
* Keys are field and values are the order, being a valid Order enum case.
*
* @see Criteria::ASC
* @see Criteria::DESC
* @see Order::Ascending
* @see Order::Descending
*
* @param array<string, string> $orderings
* @param array<string, string|Order> $orderings
*
* @return $this
*/
public function orderBy(array $orderings)
{
$this->orderings = array_map(
static fn (string $ordering): string => strtoupper($ordering) === self::ASC ? self::ASC : self::DESC,
static function (string|Order $ordering): Order {
if ($ordering instanceof Order) {
return $ordering;
}

return strtoupper($ordering) === Order::Ascending->value ? Order::Ascending : Order::Descending;
},
$orderings,
);

Expand Down
11 changes: 11 additions & 0 deletions src/Order.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

declare(strict_types=1);

namespace Doctrine\Common\Collections;

enum Order: string
{
case Ascending = 'ASC';
case Descending = 'DESC';
}
5 changes: 3 additions & 2 deletions tests/BaseArrayCollectionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

use Doctrine\Common\Collections\Collection;
use Doctrine\Common\Collections\Criteria;
use Doctrine\Common\Collections\Order;
use Doctrine\Common\Collections\Selectable;
use PHPUnit\Framework\TestCase;
use stdClass;
Expand Down Expand Up @@ -331,7 +332,7 @@ public function testMatchingWithSortingPreserveKeys(): void
'object1' => $object1,
],
$collection
->matching(new Criteria(null, ['sortField' => Criteria::ASC]))
->matching(new Criteria(null, ['sortField' => Order::Ascending]))
->toArray(),
);
}
Expand Down Expand Up @@ -443,7 +444,7 @@ public function testMultiColumnSortAppliesAllSorts(): void
self::assertSame(
$expected,
$collection
->matching(new Criteria(null, ['foo' => Criteria::DESC, 'bar' => Criteria::DESC]))
->matching(new Criteria(null, ['foo' => Order::DESC, 'bar' => Order::DESC]))
->toArray(),
);
}
Expand Down
3 changes: 2 additions & 1 deletion tests/CollectionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use Doctrine\Common\Collections\Criteria;
use Doctrine\Common\Collections\Expr\Expression;
use Doctrine\Common\Collections\Expr\Value;
use Doctrine\Common\Collections\Order;
use RuntimeException;
use stdClass;

Expand Down Expand Up @@ -72,7 +73,7 @@ public function testMatchingOrdering(): void
{
$this->fillMatchingFixture();

$col = $this->collection->matching(new Criteria(null, ['foo' => 'DESC']));
$col = $this->collection->matching(new Criteria(null, ['foo' => Order::DESC]));

self::assertInstanceOf(Collection::class, $col);
self::assertNotSame($col, $this->collection);
Expand Down
12 changes: 7 additions & 5 deletions tests/CriteriaTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use Doctrine\Common\Collections\Expr\Comparison;
use Doctrine\Common\Collections\Expr\CompositeExpression;
use Doctrine\Common\Collections\ExpressionBuilder;
use Doctrine\Common\Collections\Order;
use Doctrine\Deprecations\PHPUnit\VerifyDeprecations;
use PHPUnit\Framework\TestCase;

Expand All @@ -25,10 +26,10 @@ public function testCreate(): void
public function testConstructor(): void
{
$expr = new Comparison('field', '=', 'value');
$criteria = new Criteria($expr, ['foo' => 'ASC'], 10, 20);
$criteria = new Criteria($expr, ['foo' => Order::Ascending], 10, 20);

self::assertSame($expr, $criteria->getWhereExpression());
self::assertSame(['foo' => 'ASC'], $criteria->getOrderings());
self::assertSame(['foo' => Order::Ascending->value], $criteria->getOrderings());
self::assertSame(10, $criteria->getFirstResult());
self::assertSame(20, $criteria->getMaxResults());
}
Expand All @@ -38,10 +39,11 @@ public function testDeprecatedNullOffset(): void
$expr = new Comparison('field', '=', 'value');

$this->expectDeprecationWithIdentifier('https://github.com/doctrine/collections/pull/311');
$criteria = new Criteria($expr, ['foo' => 'ASC'], null, 20);
$criteria = new Criteria($expr, ['foo' => Order::Ascending], null, 20);

self::assertSame($expr, $criteria->getWhereExpression());
self::assertSame(['foo' => 'ASC'], $criteria->getOrderings());
self::assertSame(['foo' => Order::Ascending], $criteria->orderings());
self::assertNull($criteria->getFirstResult());
self::assertSame(20, $criteria->getMaxResults());
}
Expand Down Expand Up @@ -122,9 +124,9 @@ public function testOrWhereWithoutWhere(): void
public function testOrderings(): void
{
$criteria = Criteria::create()
->orderBy(['foo' => 'ASC']);
->orderBy(['foo' => Order::Ascending]);

self::assertEquals(['foo' => 'ASC'], $criteria->getOrderings());
self::assertEquals(['foo' => Order::Ascending], $criteria->orderings());
}

public function testExpr(): void
Expand Down

0 comments on commit ef0de41

Please sign in to comment.