From ecb9d24f9349e4b7687f5759398bc5207de6f840 Mon Sep 17 00:00:00 2001 From: soyuka Date: Thu, 30 Mar 2017 08:27:01 +0200 Subject: [PATCH 1/3] Fix #1021 order by hidden eager loading --- .../Extension/FilterEagerLoadingExtension.php | 3 + .../FilterEagerLoadingExtensionTest.php | 84 +++++++++++++++++++ 2 files changed, 87 insertions(+) diff --git a/src/Bridge/Doctrine/Orm/Extension/FilterEagerLoadingExtension.php b/src/Bridge/Doctrine/Orm/Extension/FilterEagerLoadingExtension.php index 486ee2d9a86..63ba9adba50 100644 --- a/src/Bridge/Doctrine/Orm/Extension/FilterEagerLoadingExtension.php +++ b/src/Bridge/Doctrine/Orm/Extension/FilterEagerLoadingExtension.php @@ -80,6 +80,9 @@ private function getQueryBuilderWithNewAliases(QueryBuilder $queryBuilder, Query //reset parts $queryBuilderClone->resetDQLPart('join'); $queryBuilderClone->resetDQLPart('where'); + $queryBuilderClone->resetDQLPart('orderBy'); + $queryBuilderClone->resetDQLPart('groupBy'); + $queryBuilderClone->resetDQLPart('having'); //Change from alias $from = $queryBuilderClone->getDQLPart('from')[0]; diff --git a/tests/Bridge/Doctrine/Orm/Extension/FilterEagerLoadingExtensionTest.php b/tests/Bridge/Doctrine/Orm/Extension/FilterEagerLoadingExtensionTest.php index 78dbdec3212..8b4af2f89ef 100644 --- a/tests/Bridge/Doctrine/Orm/Extension/FilterEagerLoadingExtensionTest.php +++ b/tests/Bridge/Doctrine/Orm/Extension/FilterEagerLoadingExtensionTest.php @@ -129,4 +129,88 @@ public function testApplyCollection() $this->assertEquals('SELECT o FROM ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\DummyCar o LEFT JOIN o.colors colors WHERE o IN(SELECT o_2 FROM ApiPlatform\Core\Tests\Fixtures\TestBundle\Entity\DummyCar o_2 LEFT JOIN o_2.colors colors_2 WHERE o_2.colors = :foo)', $qb->getDQL()); } + + /** + * https://github.com/api-platform/core/issues/1021. + */ + public function testHiddenOrderBy() + { + $resourceMetadataFactoryProphecy = $this->prophesize(ResourceMetadataFactoryInterface::class); + $resourceMetadataFactoryProphecy->create(DummyCar::class)->willReturn(new ResourceMetadata(DummyCar::class)); + + $em = $this->prophesize(EntityManager::class); + $em->getExpressionBuilder()->shouldBeCalled()->willReturn(new Expr()); + + $qb = new QueryBuilder($em->reveal()); + + $qb->select('o', 'CASE WHEN o.dateCreated IS NULL THEN 0 ELSE 1 END AS HIDDEN _o_dateCreated_null_rank') + ->from(DummyCar::class, 'o') + ->leftJoin('o.colors', 'colors') + ->where('o.colors = :foo') + ->orderBy('_o_dateCreated_null_rank DESC') + ->setParameter('foo', 1); + + $queryNameGenerator = $this->prophesize(QueryNameGeneratorInterface::class); + $queryNameGenerator->generateJoinAlias('colors')->shouldBeCalled()->willReturn('colors_2'); + $filterEagerLoadingExtension = new FilterEagerLoadingExtension($resourceMetadataFactoryProphecy->reveal(), true); + $filterEagerLoadingExtension->applyToCollection($qb, $queryNameGenerator->reveal(), DummyCar::class, 'get'); + + $expected = <<