From ebf7b40585b8dfa920e563c6eb00ce971b847cf1 Mon Sep 17 00:00:00 2001 From: Guicherd Date: Thu, 11 Jan 2024 17:13:41 +0100 Subject: [PATCH] feature #98 Total count JobExecution matched by query --- .../src/DoctrineDBALJobExecutionStorage.php | 71 ++++++++++++------- .../DoctrineDBALJobExecutionStorageTest.php | 1 + .../Storage/FilesystemJobExecutionStorage.php | 8 +++ .../QueryableJobExecutionStorageInterface.php | 5 ++ .../FilesystemJobExecutionStorageTest.php | 1 + 5 files changed, 62 insertions(+), 24 deletions(-) diff --git a/src/batch-doctrine-dbal/src/DoctrineDBALJobExecutionStorage.php b/src/batch-doctrine-dbal/src/DoctrineDBALJobExecutionStorage.php index 21c8f278..7ab803d0 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,33 +148,11 @@ 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; - } + [$queryParameters, $queryTypes] = $this->addWheres($query, $qb); switch ($query->sort()) { case Query::SORT_BY_START_ASC: @@ -196,6 +175,18 @@ 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); + + /** @var int $result */ + $result = $this->connection->executeQuery($qb->getSQL(), ...$this->addWheres($query, $qb))->fetchOne(); + + return $result; + } + private function getSchema(): Schema { $schema = new Schema(); @@ -287,7 +278,7 @@ private function fetchRow(string $jobName, string $id): array /** * @phpstan-param array $parameters - * @phpstan-param array $types + * @phpstan-param array|int> $types * * @phpstan-return Generator */ @@ -325,4 +316,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-doctrine-dbal/tests/DoctrineDBALJobExecutionStorageTest.php b/src/batch-doctrine-dbal/tests/DoctrineDBALJobExecutionStorageTest.php index 027ad8db..ce6dcad6 100644 --- a/src/batch-doctrine-dbal/tests/DoctrineDBALJobExecutionStorageTest.php +++ b/src/batch-doctrine-dbal/tests/DoctrineDBALJobExecutionStorageTest.php @@ -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[0]), $storage->count($queryBuilder->getQuery())); } public function queries(): Generator 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