diff --git a/src/batch-doctrine-dbal/src/DoctrineDBALJobExecutionStorage.php b/src/batch-doctrine-dbal/src/DoctrineDBALJobExecutionStorage.php index 21c8f278..c29518b8 100644 --- a/src/batch-doctrine-dbal/src/DoctrineDBALJobExecutionStorage.php +++ b/src/batch-doctrine-dbal/src/DoctrineDBALJobExecutionStorage.php @@ -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; @@ -147,34 +148,10 @@ 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; - } - switch ($query->sort()) { case Query::SORT_BY_START_ASC: $qb->orderBy('start_time', 'asc'); @@ -193,7 +170,19 @@ public function query(Query $query): iterable $qb->setMaxResults($query->limit()); $qb->setFirstResult($query->offset()); - yield from $this->queryList($qb->getSQL(), $queryParameters, $queryTypes); + yield from $this->queryList($qb->getSQL(), ...$this->addWheres($query, $qb)); + } + + public function count(Query $query): int + { + $qb = $this->connection->createQueryBuilder(); + $qb->select('count(*)') + ->from($this->table); + + /** @var int $result */ + $result = $this->connection->executeQuery($qb->getSQL(), ...$this->addWheres($query, $qb))->fetchOne(); + + return $result; } private function getSchema(): Schema @@ -325,4 +314,36 @@ private function getNormalizer(): JobExecutionRowNormalizer return $this->normalizer; } + + /** + * @return array|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; + } + + return [$queryParameters, $queryTypes]; + } } diff --git a/src/batch/src/Storage/FilesystemJobExecutionStorage.php b/src/batch/src/Storage/FilesystemJobExecutionStorage.php index 1a7646a7..3c5789df 100644 --- a/src/batch/src/Storage/FilesystemJobExecutionStorage.php +++ b/src/batch/src/Storage/FilesystemJobExecutionStorage.php @@ -139,6 +139,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]) . diff --git a/src/batch/src/Storage/QueryableJobExecutionStorageInterface.php b/src/batch/src/Storage/QueryableJobExecutionStorageInterface.php index 50f798f9..c4b1c90f 100644 --- a/src/batch/src/Storage/QueryableJobExecutionStorageInterface.php +++ b/src/batch/src/Storage/QueryableJobExecutionStorageInterface.php @@ -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; } diff --git a/src/batch/tests/Storage/FilesystemJobExecutionStorageTest.php b/src/batch/tests/Storage/FilesystemJobExecutionStorageTest.php index 3d34c8a2..1a5a8497 100644 --- a/src/batch/tests/Storage/FilesystemJobExecutionStorageTest.php +++ b/src/batch/tests/Storage/FilesystemJobExecutionStorageTest.php @@ -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