Skip to content
Snippets Groups Projects
Verified Commit f1ee5cc3 authored by Jiří Pudil's avatar Jiří Pudil
Browse files

implement ordering by specific values

parent 72c88610
No related branches found
No related tags found
1 merge request!51implement ordering by specific values
Pipeline #48899 passed
......@@ -10,6 +10,8 @@ use Grifart\Tables\Conditions\IsNull;
use Grifart\Tables\OrderBy\Direction;
use Grifart\Tables\OrderBy\Nulls;
use Grifart\Tables\OrderBy\OrderBy;
use Grifart\Tables\OrderBy\OrderByDirection;
use Grifart\Tables\OrderBy\OrderByValues;
/**
* @template ValueType
......@@ -35,11 +37,19 @@ abstract class ExpressionWithShorthands implements Expression
public function ascending(Nulls|null $nulls = null): OrderBy
{
return new OrderBy($this, nulls: $nulls);
return new OrderByDirection($this, nulls: $nulls);
}
public function descending(Nulls|null $nulls = null): OrderBy
{
return new OrderBy($this, direction: Direction::Descending, nulls: $nulls);
return new OrderByDirection($this, direction: Direction::Descending, nulls: $nulls);
}
/**
* @param list<ValueType> $values
*/
public function byValues(array $values): OrderBy
{
return new OrderByValues($this, $values);
}
}
......@@ -5,31 +5,11 @@ declare(strict_types=1);
namespace Grifart\Tables\OrderBy;
use Dibi\Expression as DibiExpression;
use Grifart\Tables\Expression;
final class OrderBy
interface OrderBy
{
private readonly Nulls $nulls;
/**
* @param Expression<mixed> $expression
* @return DibiExpression the ORDER BY part of a Dibi query
*/
public function __construct(
private readonly Expression $expression,
private readonly Direction $direction = Direction::Ascending,
Nulls|null $nulls = null,
)
{
$this->nulls = $nulls ?? Nulls::default($this->direction);
}
public function toSql(): DibiExpression
{
return new DibiExpression(
'? %ex %ex',
$this->expression->toSql(),
$this->direction->toSql(),
$this->nulls->toSql(),
);
}
public function toSql(): DibiExpression;
}
<?php
declare(strict_types=1);
namespace Grifart\Tables\OrderBy;
use Dibi\Expression as DibiExpression;
use Grifart\Tables\Expression;
final class OrderByDirection implements OrderBy
{
private readonly Nulls $nulls;
/**
* @param Expression<mixed> $expression
*/
public function __construct(
private readonly Expression $expression,
private readonly Direction $direction = Direction::Ascending,
Nulls|null $nulls = null,
)
{
$this->nulls = $nulls ?? Nulls::default($this->direction);
}
public function toSql(): DibiExpression
{
return new DibiExpression(
'? %ex %ex',
$this->expression->toSql(),
$this->direction->toSql(),
$this->nulls->toSql(),
);
}
}
<?php
declare(strict_types=1);
namespace Grifart\Tables\OrderBy;
use Dibi\Expression as DibiExpression;
use Grifart\Tables\Expression;
use Grifart\Tables\Types\ArrayType;
/**
* @template ValueType
*/
final class OrderByValues implements OrderBy
{
/**
* @param Expression<ValueType> $expression
* @param ValueType[] $values
*/
public function __construct(
private readonly Expression $expression,
private readonly array $values,
) {}
public function toSql(): DibiExpression
{
return new DibiExpression(
'array_position(?, ?)',
(ArrayType::of($this->expression->getType()))->toDatabase($this->values),
$this->expression->toSql(),
);
}
}
......@@ -8,6 +8,7 @@ use Dibi\Connection;
use Grifart\Tables\Conditions\Composite;
use Grifart\Tables\Conditions\Condition;
use Grifart\Tables\OrderBy\OrderBy;
use Grifart\Tables\OrderBy\OrderByDirection;
use Nette\Utils\Paginator;
use function Functional\map;
......@@ -85,7 +86,7 @@ final class TableManager
'ORDER BY %by', \count($orderBy) > 0
? map($orderBy, function (OrderBy|Expression $orderBy) {
if ($orderBy instanceof Expression) {
$orderBy = new OrderBy($orderBy);
$orderBy = new OrderByDirection($orderBy);
}
return $orderBy->toSql()->getValues();
......
......@@ -72,6 +72,16 @@ $orderByNullsLast = $table->findBy([], orderBy: [$table->details()->ascending(Nu
Assert::count(3, $orderByNullsLast);
Assert::same(null, $orderByNullsLast[2]->getDetails());
$orderByValues = $table->findBy([], orderBy: [$table->id()->byValues([
new Uuid('2bec3f23-a210-455c-b907-bb69a99d07b2'),
new Uuid('9493decd-4b9c-45d6-9960-0c94dc9be353'),
new Uuid('fb05a832-5729-4b1f-b064-fbc08cacbe43'),
])]);
Assert::count(3, $orderByValues);
Assert::same('2bec3f23-a210-455c-b907-bb69a99d07b2', $orderByValues[0]->getId()->get());
Assert::same('9493decd-4b9c-45d6-9960-0c94dc9be353', $orderByValues[1]->getId()->get());
Assert::same('fb05a832-5729-4b1f-b064-fbc08cacbe43', $orderByValues[2]->getId()->get());
$paginator = new Paginator();
$paginator->setItemsPerPage(1);
$paginator->setPage(2);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment