From 7dd7c044dddad203b8b6b3f7b687663903dbf109 Mon Sep 17 00:00:00 2001 From: Jan Nedbal Date: Thu, 27 Jan 2022 12:50:13 +0100 Subject: [PATCH 1/2] queryResultTest: more tests --- .../Doctrine/data/QueryResult/queryResult.php | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) diff --git a/tests/Type/Doctrine/data/QueryResult/queryResult.php b/tests/Type/Doctrine/data/QueryResult/queryResult.php index 1b583bb1..6170ab4e 100644 --- a/tests/Type/Doctrine/data/QueryResult/queryResult.php +++ b/tests/Type/Doctrine/data/QueryResult/queryResult.php @@ -5,6 +5,7 @@ use Doctrine\ORM\AbstractQuery; use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\Query; +use QueryResult\Entities\Many; use function PHPStan\Testing\assertType; class QueryResultTest @@ -317,4 +318,93 @@ public function testReturnTypeOfQueryMethodsWithReturnTypeIsNonVoidTemplate(Enti $query->getOneOrNullResult(AbstractQuery::HYDRATE_OBJECT) ); } + + public function testReturnTypeOfMixedResult(EntityManagerInterface $em): void + { + $query = $em->createQuery(' + SELECT m.intColumn, m + FROM QueryResult\Entities\Many m + '); + + assertType( + 'array', + $query->getResult() + ); + assertType( + 'array{0: QueryResult\Entities\Many, intColumn: int}|null', + $query->getOneOrNullResult() + ); + } + + public function testReturnTypeOfAggregateFunctions(EntityManagerInterface $em): void + { + $query = $em->createQuery(' + SELECT COUNT(m) AS count, COUNT(DISTINCT m) AS count_distinct, SUM(m.intColumn) AS sum, AVG(m.intColumn) AS avg + FROM QueryResult\Entities\Many m + '); + + assertType( + 'array|numeric-string, count_distinct: int<0, max>|numeric-string, sum: int|numeric-string|null, avg: int|numeric-string|null}>', + $query->getResult() + ); + assertType( + 'array{count: int<0, max>|numeric-string, count_distinct: int<0, max>|numeric-string, sum: int|numeric-string|null, avg: int|numeric-string|null}|null', + $query->getOneOrNullResult() + ); + } + + public function testReturnTypeOfDqlFunctions(EntityManagerInterface $em): void + { + $query = $em->createQuery(' + SELECT + CONCAT(m.stringColumn, COALESCE(m.stringNullColumn, m.stringColumn)) AS concat_coalesce, + CASE + WHEN m.stringNullColumn IS NULL + THEN m.intColumn + ELSE 1 + END AS case_int, + LENGTH(m.stringColumn) AS length_int, + SUBSTRING(m.stringColumn, 0, 1) AS substring_string, + LOWER(m.stringColumn) AS lower_string, + UPPER(m.stringColumn) AS upper_string, + IDENTITY(m.one) AS identity_string + + FROM QueryResult\Entities\Many m + '); + + assertType( + 'array|numeric-string, substring_string: string, lower_string: string, upper_string: string, identity_string: mixed}>', + $query->getResult() + ); + assertType( + 'array{concat_coalesce: string, case_int: int|numeric-string, length_int: int<0, max>|numeric-string}', + $query->getOneOrNullResult() + ); + } + + public function testReturnFieldTypesWithQueryBuilderAndDifferentSelectMethods(EntityManagerInterface $em): void + { + $query = $em->createQueryBuilder() + ->addSelect(' + m.id, + m.intColumn, + m.stringColumn AS stringColumnAlias + ') + ->addSelect('o.stringNullColumn') + ->addSelect([ + 'm.datetimeColumn', + 'm.datetimeImmutableColumn', + ]) + ->from(Many::class, 'm') + ->join('m.one', 'o'); + + assertType( + 'array', + $query->getQuery()->getResult() + ); + assertType( + 'array{id: string, intColumn: int, stringColumnAlias: string, stringNullColumn: string|null, datetimeColumn: DateTime, datetimeImmutableColumn: DateTimeImmutable}', + $query->getQuery()->getOneOrNullResult() + ); + } } From 32720d8aeaa36b47519a16e577a37c9658f9ff61 Mon Sep 17 00:00:00 2001 From: Jan Nedbal Date: Thu, 27 Jan 2022 13:10:27 +0100 Subject: [PATCH 2/2] fix expected types of getOneOrNullResult --- tests/Type/Doctrine/data/QueryResult/queryResult.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Type/Doctrine/data/QueryResult/queryResult.php b/tests/Type/Doctrine/data/QueryResult/queryResult.php index 6170ab4e..34738a84 100644 --- a/tests/Type/Doctrine/data/QueryResult/queryResult.php +++ b/tests/Type/Doctrine/data/QueryResult/queryResult.php @@ -377,7 +377,7 @@ public function testReturnTypeOfDqlFunctions(EntityManagerInterface $em): void $query->getResult() ); assertType( - 'array{concat_coalesce: string, case_int: int|numeric-string, length_int: int<0, max>|numeric-string}', + 'array{concat_coalesce: string, case_int: int|numeric-string, length_int: int<0, max>|numeric-string, substring_string: string, lower_string: string, upper_string: string, identity_string: mixed}|null', $query->getOneOrNullResult() ); } @@ -403,7 +403,7 @@ public function testReturnFieldTypesWithQueryBuilderAndDifferentSelectMethods(En $query->getQuery()->getResult() ); assertType( - 'array{id: string, intColumn: int, stringColumnAlias: string, stringNullColumn: string|null, datetimeColumn: DateTime, datetimeImmutableColumn: DateTimeImmutable}', + 'array{id: string, intColumn: int, stringColumnAlias: string, stringNullColumn: string|null, datetimeColumn: DateTime, datetimeImmutableColumn: DateTimeImmutable}|null', $query->getQuery()->getOneOrNullResult() ); }