Skip to content

Commit d7e3ec9

Browse files
committed
feature #98 Total count JobExecution matched by query
1 parent f6f6826 commit d7e3ec9

File tree

5 files changed

+61
-23
lines changed

5 files changed

+61
-23
lines changed

src/batch-doctrine-dbal/src/DoctrineDBALJobExecutionStorage.php

Lines changed: 46 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Doctrine\DBAL\Connection;
88
use Doctrine\DBAL\Driver\Result;
99
use Doctrine\DBAL\Exception as DBALException;
10+
use Doctrine\DBAL\Query\QueryBuilder;
1011
use Doctrine\DBAL\Schema\Comparator;
1112
use Doctrine\DBAL\Schema\Schema;
1213
use Doctrine\DBAL\Types\Types;
@@ -147,33 +148,11 @@ public function list(string $jobName): iterable
147148

148149
public function query(Query $query): iterable
149150
{
150-
$queryParameters = [];
151-
$queryTypes = [];
152-
153151
$qb = $this->connection->createQueryBuilder();
154152
$qb->select('*')
155153
->from($this->table);
156154

157-
$names = $query->jobs();
158-
if (\count($names) > 0) {
159-
$qb->andWhere($qb->expr()->in('job_name', ':jobNames'));
160-
$queryParameters['jobNames'] = $names;
161-
$queryTypes['jobNames'] = Connection::PARAM_STR_ARRAY;
162-
}
163-
164-
$ids = $query->ids();
165-
if (\count($ids) > 0) {
166-
$qb->andWhere($qb->expr()->in('id', ':ids'));
167-
$queryParameters['ids'] = $ids;
168-
$queryTypes['ids'] = Connection::PARAM_STR_ARRAY;
169-
}
170-
171-
$statuses = $query->statuses();
172-
if (\count($statuses) > 0) {
173-
$qb->andWhere($qb->expr()->in('status', ':statuses'));
174-
$queryParameters['statuses'] = $statuses;
175-
$queryTypes['statuses'] = Connection::PARAM_INT_ARRAY;
176-
}
155+
[$queryParameters, $queryTypes] = $this->addWheres($query, $qb);
177156

178157
switch ($query->sort()) {
179158
case Query::SORT_BY_START_ASC:
@@ -196,6 +175,18 @@ public function query(Query $query): iterable
196175
yield from $this->queryList($qb->getSQL(), $queryParameters, $queryTypes);
197176
}
198177

178+
public function count(Query $query): int
179+
{
180+
$qb = $this->connection->createQueryBuilder();
181+
$qb->select('count(*)')
182+
->from($this->table);
183+
184+
/** @var int $result */
185+
$result = $this->connection->executeQuery($qb->getSQL(), ...$this->addWheres($query, $qb))->fetchOne();
186+
187+
return $result;
188+
}
189+
199190
private function getSchema(): Schema
200191
{
201192
$schema = new Schema();
@@ -325,4 +316,36 @@ private function getNormalizer(): JobExecutionRowNormalizer
325316

326317
return $this->normalizer;
327318
}
319+
320+
/**
321+
* @return array<int, array<string, array<int|string>|int>>
322+
*/
323+
private function addWheres(Query $query, QueryBuilder $qb): array
324+
{
325+
$queryParameters = [];
326+
$queryTypes = [];
327+
328+
$names = $query->jobs();
329+
if (\count($names) > 0) {
330+
$qb->andWhere($qb->expr()->in('job_name', ':jobNames'));
331+
$queryParameters['jobNames'] = $names;
332+
$queryTypes['jobNames'] = Connection::PARAM_STR_ARRAY;
333+
}
334+
335+
$ids = $query->ids();
336+
if (\count($ids) > 0) {
337+
$qb->andWhere($qb->expr()->in('id', ':ids'));
338+
$queryParameters['ids'] = $ids;
339+
$queryTypes['ids'] = Connection::PARAM_STR_ARRAY;
340+
}
341+
342+
$statuses = $query->statuses();
343+
if (\count($statuses) > 0) {
344+
$qb->andWhere($qb->expr()->in('status', ':statuses'));
345+
$queryParameters['statuses'] = $statuses;
346+
$queryTypes['statuses'] = Connection::PARAM_INT_ARRAY;
347+
}
348+
349+
return [$queryParameters, $queryTypes];
350+
}
328351
}

src/batch-doctrine-dbal/tests/DoctrineDBALJobExecutionStorageTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,7 @@ public function testQuery(QueryBuilder $queryBuilder, array $expectedCouples): v
282282
$this->loadFixtures($storage);
283283

284284
self::assertExecutions($expectedCouples, $storage->query($queryBuilder->getQuery()));
285+
self::assertSame(\count($expectedCouples), $storage->count($queryBuilder->getQuery()));
285286
}
286287

287288
public function queries(): Generator

src/batch/src/Storage/FilesystemJobExecutionStorage.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,14 @@ public function query(Query $query): iterable
139139
return \array_slice($candidates, $query->offset(), $query->limit());
140140
}
141141

142+
public function count(Query $query): int
143+
{
144+
/** @var JobExecution[] $result */
145+
$result = $this->query($query);
146+
147+
return \count($result);
148+
}
149+
142150
private function buildFilePath(string $jobName, string $executionId): string
143151
{
144152
return \implode(DIRECTORY_SEPARATOR, [$this->directory, $jobName, $executionId]) .

src/batch/src/Storage/QueryableJobExecutionStorageInterface.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,9 @@ interface QueryableJobExecutionStorageInterface extends ListableJobExecutionStor
1717
* @return iterable|JobExecution[]
1818
*/
1919
public function query(Query $query): iterable;
20+
21+
/**
22+
* Execute query against stored job executions, and return count result.
23+
*/
24+
public function count(Query $query): int;
2025
}

src/batch/tests/Storage/FilesystemJobExecutionStorageTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ public function testQueryWithProvider(QueryBuilder $query, array $expectedCouple
150150
);
151151

152152
self::assertExecutions($expectedCouples, $storage->query($query->getQuery()));
153+
self::assertEquals(\count($expectedCouples), $storage->count($query->getQuery()));
153154
}
154155

155156
public function query(): \Generator

0 commit comments

Comments
 (0)