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 6b56e71
Show file tree
Hide file tree
Showing 7 changed files with 60 additions and 17 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
4 changes: 2 additions & 2 deletions src/ArrayCollection.php
Original file line number Diff line number Diff line change
Expand Up @@ -466,12 +466,12 @@ public function matching(Criteria $criteria)
$filtered = array_filter($filtered, $filter);
}

$orderings = $criteria->getOrderings();
$orderings = $criteria->orderings();

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::Descending ? -1 : 1, $next);
}

uasort($filtered, $next);
Expand Down
33 changes: 26 additions & 7 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 @@ -57,7 +57,7 @@ public static function expr()
/**
* Construct a new Criteria.
*
* @param array<string, string>|null $orderings
* @param array<string, string|Order>|null $orderings
*/
public function __construct(
private Expression|null $expression = 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;

Check warning on line 194 in src/Criteria.php

View check run for this annotation

Codecov / codecov/patch

src/Criteria.php#L194

Added line #L194 was not covered by tests
},
$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';
}
12 changes: 11 additions & 1 deletion 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 @@ -334,6 +335,15 @@ public function testMatchingWithSortingPreserveKeys(): void
->matching(new Criteria(null, ['sortField' => Criteria::ASC]))
->toArray(),
);
self::assertSame(
[
'object2' => $object2,
'object1' => $object1,
],
$collection
->matching(new Criteria(null, ['sortField' => Order::Ascending]))
->toArray(),
);
}

/**
Expand Down Expand Up @@ -443,7 +453,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::Descending, 'bar' => Order::Descending]))
->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::Descending]));

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 6b56e71

Please sign in to comment.