Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
143 changes: 88 additions & 55 deletions src/batch-doctrine-dbal/src/DoctrineDBALJobExecutionStorage.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
use Doctrine\DBAL\Connection;
use Doctrine\DBAL\Driver\Result;
use Doctrine\DBAL\Exception as DBALException;
use Doctrine\DBAL\Query\QueryBuilder;
use Doctrine\DBAL\Schema\Comparator;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\DBAL\Types\Types;
Expand Down Expand Up @@ -147,65 +148,15 @@ public function list(string $jobName): iterable

public function query(Query $query): iterable
{
$queryParameters = [];
$queryTypes = [];

$qb = $this->connection->createQueryBuilder();
$qb->select('*')
->from($this->table);

$names = $query->jobs();
if (\count($names) > 0) {
$qb->andWhere($qb->expr()->in('job_name', ':jobNames'));
$queryParameters['jobNames'] = $names;
$queryTypes['jobNames'] = Connection::PARAM_STR_ARRAY;
}

$ids = $query->ids();
if (\count($ids) > 0) {
$qb->andWhere($qb->expr()->in('id', ':ids'));
$queryParameters['ids'] = $ids;
$queryTypes['ids'] = Connection::PARAM_STR_ARRAY;
}

$statuses = $query->statuses();
if (\count($statuses) > 0) {
$qb->andWhere($qb->expr()->in('status', ':statuses'));
$queryParameters['statuses'] = $statuses;
$queryTypes['statuses'] = Connection::PARAM_INT_ARRAY;
}

if ($query->startTime()) {
$qb->andWhere($qb->expr()->isNotNull('start_time'));
}
$startDateFrom = $query->startTime()?->getFrom();
if ($startDateFrom) {
$qb->andWhere($qb->expr()->gte('start_time', ':startDateFrom'));
$queryParameters['startDateFrom'] = $startDateFrom;
$queryTypes['startDateFrom'] = Types::DATETIME_IMMUTABLE;
}
$startDateTo = $query->startTime()?->getTo();
if ($startDateTo) {
$qb->andWhere($qb->expr()->lte('start_time', ':startDateTo'));
$queryParameters['startDateTo'] = $startDateTo;
$queryTypes['startDateTo'] = Types::DATETIME_IMMUTABLE;
}

if ($query->endTime()) {
$qb->andWhere($qb->expr()->isNotNull('start_time'));
}
$endDateFrom = $query->endTime()?->getFrom();
if ($endDateFrom) {
$qb->andWhere($qb->expr()->gte('end_time', ':endDateFrom'));
$queryParameters['endDateFrom'] = $endDateFrom;
$queryTypes['endDateFrom'] = Types::DATETIME_IMMUTABLE;
}
$endDateTo = $query->endTime()?->getTo();
if ($endDateTo) {
$qb->andWhere($qb->expr()->lte('end_time', ':endDateTo'));
$queryParameters['endDateTo'] = $endDateTo;
$queryTypes['endDateTo'] = Types::DATETIME_IMMUTABLE;
}
/**
* @phpstan-var array<string, mixed> $queryParameters
* @phpstan-var array<string, string|int> $queryTypes
*/
[$queryParameters, $queryTypes] = $this->addWheres($query, $qb);

switch ($query->sort()) {
case Query::SORT_BY_START_ASC:
Expand All @@ -228,6 +179,24 @@ public function query(Query $query): iterable
yield from $this->queryList($qb->getSQL(), $queryParameters, $queryTypes);
}

public function count(Query $query): int
{
$qb = $this->connection->createQueryBuilder();
$qb->select('count(*)')
->from($this->table);

/**
* @phpstan-var array<string, mixed> $queryParameters
* @phpstan-var array<string, string|int> $queryTypes
*/
[$queryParameters, $queryTypes] = $this->addWheres($query, $qb);

/** @var int $result */
$result = $this->connection->executeQuery($qb->getSQL(), $queryParameters, $queryTypes)->fetchOne();

return $result;
}

private function getSchema(): Schema
{
$schema = new Schema();
Expand Down Expand Up @@ -357,4 +326,68 @@ private function getNormalizer(): JobExecutionRowNormalizer

return $this->normalizer;
}

/**
* @return array{array<string, mixed>, array<string, string|int>}
*/
private function addWheres(Query $query, QueryBuilder $qb): array
{
$queryParameters = [];
$queryTypes = [];

$names = $query->jobs();
if (\count($names) > 0) {
$qb->andWhere($qb->expr()->in('job_name', ':jobNames'));
$queryParameters['jobNames'] = $names;
$queryTypes['jobNames'] = Connection::PARAM_STR_ARRAY;
}

$ids = $query->ids();
if (\count($ids) > 0) {
$qb->andWhere($qb->expr()->in('id', ':ids'));
$queryParameters['ids'] = $ids;
$queryTypes['ids'] = Connection::PARAM_STR_ARRAY;
}

$statuses = $query->statuses();
if (\count($statuses) > 0) {
$qb->andWhere($qb->expr()->in('status', ':statuses'));
$queryParameters['statuses'] = $statuses;
$queryTypes['statuses'] = Connection::PARAM_INT_ARRAY;
}

if ($query->startTime()) {
$qb->andWhere($qb->expr()->isNotNull('start_time'));
}
$startDateFrom = $query->startTime()?->getFrom();
if ($startDateFrom) {
$qb->andWhere($qb->expr()->gte('start_time', ':startDateFrom'));
$queryParameters['startDateFrom'] = $startDateFrom;
$queryTypes['startDateFrom'] = Types::DATETIME_IMMUTABLE;
}
$startDateTo = $query->startTime()?->getTo();
if ($startDateTo) {
$qb->andWhere($qb->expr()->lte('start_time', ':startDateTo'));
$queryParameters['startDateTo'] = $startDateTo;
$queryTypes['startDateTo'] = Types::DATETIME_IMMUTABLE;
}

if ($query->endTime()) {
$qb->andWhere($qb->expr()->isNotNull('start_time'));
}
$endDateFrom = $query->endTime()?->getFrom();
if ($endDateFrom) {
$qb->andWhere($qb->expr()->gte('end_time', ':endDateFrom'));
$queryParameters['endDateFrom'] = $endDateFrom;
$queryTypes['endDateFrom'] = Types::DATETIME_IMMUTABLE;
}
$endDateTo = $query->endTime()?->getTo();
if ($endDateTo) {
$qb->andWhere($qb->expr()->lte('end_time', ':endDateTo'));
$queryParameters['endDateTo'] = $endDateTo;
$queryTypes['endDateTo'] = Types::DATETIME_IMMUTABLE;
}

return [$queryParameters, $queryTypes];
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -282,6 +282,7 @@ public function testQuery(QueryBuilder $queryBuilder, array $expectedCouples): v
$this->loadFixtures($storage);

self::assertExecutions($expectedCouples, $storage->query($queryBuilder->getQuery()));
self::assertSame(\count($expectedCouples), $storage->count($queryBuilder->getQuery()));
}

public function queries(): Generator
Expand Down
8 changes: 8 additions & 0 deletions src/batch/src/Storage/FilesystemJobExecutionStorage.php
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,14 @@ public function query(Query $query): iterable
return \array_slice($candidates, $query->offset(), $query->limit());
}

public function count(Query $query): int
{
/** @var JobExecution[] $result */
$result = $this->query($query);

return \count($result);
}

private function buildFilePath(string $jobName, string $executionId): string
{
return \implode(DIRECTORY_SEPARATOR, [$this->directory, $jobName, $executionId]) .
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,9 @@ interface QueryableJobExecutionStorageInterface extends ListableJobExecutionStor
* @return iterable|JobExecution[]
*/
public function query(Query $query): iterable;

/**
* Execute query against stored job executions, and return count result.
*/
public function count(Query $query): int;
}
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@ public function testQueryWithProvider(QueryBuilder $query, array $expectedCouple
);

self::assertExecutions($expectedCouples, $storage->query($query->getQuery()));
self::assertEquals(\count($expectedCouples), $storage->count($query->getQuery()));
}

public function query(): \Generator
Expand Down
Loading