From 343e0e29dd73e73accf9f2144497bbc92e576ac3 Mon Sep 17 00:00:00 2001 From: Ondrej Mirtes Date: Wed, 5 Apr 2023 17:01:29 +0200 Subject: [PATCH] Query type inference failures reproductions --- .../QueryBuilderReproductionsTest.php | 38 +++++++++++++++++++ .../data/QueryResult/Entities/OrderItem.php | 20 ++++++++++ .../data/QueryResult/Entities/Product.php | 17 +++++++++ .../data/QueryResult/entity-manager.php | 11 ++++++ .../data/queryBuilderReproductions.php | 31 +++++++++++++++ 5 files changed, 117 insertions(+) create mode 100644 tests/Type/Doctrine/QueryBuilderReproductionsTest.php create mode 100644 tests/Type/Doctrine/data/QueryResult/Entities/OrderItem.php create mode 100644 tests/Type/Doctrine/data/QueryResult/Entities/Product.php create mode 100644 tests/Type/Doctrine/data/queryBuilderReproductions.php diff --git a/tests/Type/Doctrine/QueryBuilderReproductionsTest.php b/tests/Type/Doctrine/QueryBuilderReproductionsTest.php new file mode 100644 index 00000000..80c00e65 --- /dev/null +++ b/tests/Type/Doctrine/QueryBuilderReproductionsTest.php @@ -0,0 +1,38 @@ + + */ + public function dataFileAsserts(): iterable + { + yield from $this->gatherAssertTypes(__DIR__ . '/data/queryBuilderReproductions.php'); + } + + /** + * @dataProvider dataFileAsserts + * @param mixed ...$args + */ + public function testFileAsserts( + string $assertType, + string $file, + ...$args + ): void + { + $this->assertFileAsserts($assertType, $file, ...$args); + } + + public static function getAdditionalConfigFiles(): array + { + return [ + __DIR__ . '/data/QueryResult/config.neon', + ]; + } + +} diff --git a/tests/Type/Doctrine/data/QueryResult/Entities/OrderItem.php b/tests/Type/Doctrine/data/QueryResult/Entities/OrderItem.php new file mode 100644 index 00000000..b9b570c1 --- /dev/null +++ b/tests/Type/Doctrine/data/QueryResult/Entities/OrderItem.php @@ -0,0 +1,20 @@ + true])] + private ?int $id = null; + +} diff --git a/tests/Type/Doctrine/data/QueryResult/entity-manager.php b/tests/Type/Doctrine/data/QueryResult/entity-manager.php index c9ba38af..2760d5f4 100644 --- a/tests/Type/Doctrine/data/QueryResult/entity-manager.php +++ b/tests/Type/Doctrine/data/QueryResult/entity-manager.php @@ -22,11 +22,22 @@ [__DIR__ . '/Entities'] ), 'QueryResult\Entities\\'); +if (PHP_VERSION_ID >= 80100) { + $metadataDriver->addDriver( + new AttributeDriver([__DIR__ . '/Entities']), + 'QueryResult\Entities\\' + ); +} + if (property_exists(Column::class, 'enumType') && PHP_VERSION_ID >= 80100) { $metadataDriver->addDriver(new AnnotationDriver( new AnnotationReader(), [__DIR__ . '/EntitiesEnum'] ), 'QueryResult\EntitiesEnum\\'); + $metadataDriver->addDriver( + new AttributeDriver([__DIR__ . '/EntitiesEnum']), + 'QueryResult\EntitiesEnum\\' + ); } $config->setMetadataDriverImpl($metadataDriver); diff --git a/tests/Type/Doctrine/data/queryBuilderReproductions.php b/tests/Type/Doctrine/data/queryBuilderReproductions.php new file mode 100644 index 00000000..e03479fc --- /dev/null +++ b/tests/Type/Doctrine/data/queryBuilderReproductions.php @@ -0,0 +1,31 @@ +entityManager = $entityManager; + } + + public function doFoo(): void + { + $result = $this->entityManager->createQueryBuilder() + ->select('DISTINCT IDENTITY(oi.product) AS id') + ->from(OrderItem::class, 'oi') + ->join('oi.product', 'p') + ->getQuery() + ->getArrayResult(); + assertType('list', $result); + } + +}