_em = $this->_getTestEntityManager(); } public function testGetParameters() { $query = $this->_em->createQuery("select u from Doctrine\Tests\Models\CMS\CmsUser u where u.username = ?1"); $parameters = new ArrayCollection(); $this->assertEquals($parameters, $query->getParameters()); } public function testGetParameters_HasSomeAlready() { $query = $this->_em->createQuery("select u from Doctrine\Tests\Models\CMS\CmsUser u where u.username = ?1"); $query->setParameter(2, 84); $parameters = new ArrayCollection(); $parameters->add(new Parameter(2, 84)); $this->assertEquals($parameters, $query->getParameters()); } public function testSetParameters() { $query = $this->_em->createQuery("select u from Doctrine\Tests\Models\CMS\CmsUser u where u.username = ?1"); $parameters = new ArrayCollection(); $parameters->add(new Parameter(1, 'foo')); $parameters->add(new Parameter(2, 'bar')); $query->setParameters($parameters); $this->assertEquals($parameters, $query->getParameters()); } public function testFree() { $query = $this->_em->createQuery("select u from Doctrine\Tests\Models\CMS\CmsUser u where u.username = ?1"); $query->setParameter(2, 84, \PDO::PARAM_INT); $query->free(); $this->assertEquals(0, count($query->getParameters())); } public function testClone() { $dql = "select u from Doctrine\Tests\Models\CMS\CmsUser u where u.username = ?1"; $query = $this->_em->createQuery($dql); $query->setParameter(2, 84, \PDO::PARAM_INT); $query->setHint('foo', 'bar'); $cloned = clone $query; $this->assertEquals($dql, $cloned->getDQL()); $this->assertEquals(0, count($cloned->getParameters())); $this->assertFalse($cloned->getHint('foo')); } public function testFluentQueryInterface() { $q = $this->_em->createQuery("select a from Doctrine\Tests\Models\CMS\CmsArticle a"); $q2 = $q->expireQueryCache(true) ->setQueryCacheLifetime(3600) ->setQueryCacheDriver(null) ->expireResultCache(true) ->setHint('foo', 'bar') ->setHint('bar', 'baz') ->setParameter(1, 'bar') ->setParameters(new ArrayCollection([new Parameter(2, 'baz')])) ->setResultCacheDriver(null) ->setResultCacheId('foo') ->setDQL('foo') ->setFirstResult(10) ->setMaxResults(10); $this->assertSame($q2, $q); } /** * @group DDC-968 */ public function testHints() { $q = $this->_em->createQuery("select a from Doctrine\Tests\Models\CMS\CmsArticle a"); $q->setHint('foo', 'bar')->setHint('bar', 'baz'); $this->assertEquals('bar', $q->getHint('foo')); $this->assertEquals('baz', $q->getHint('bar')); $this->assertEquals(['foo' => 'bar', 'bar' => 'baz'], $q->getHints()); $this->assertTrue($q->hasHint('foo')); $this->assertFalse($q->hasHint('barFooBaz')); } /** * @group DDC-1588 */ public function testQueryDefaultResultCache() { $this->_em->getConfiguration()->setResultCacheImpl(new ArrayCache()); $q = $this->_em->createQuery("select a from Doctrine\Tests\Models\CMS\CmsArticle a"); $q->useResultCache(true); $this->assertSame($this->_em->getConfiguration()->getResultCacheImpl(), $q->getQueryCacheProfile()->getResultCacheDriver()); } /** * @expectedException Doctrine\ORM\Query\QueryException **/ public function testIterateWithNoDistinctAndWrongSelectClause() { $q = $this->_em->createQuery("select u, a from Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.articles a"); $q->iterate(); } /** * @expectedException Doctrine\ORM\Query\QueryException **/ public function testIterateWithNoDistinctAndWithValidSelectClause() { $q = $this->_em->createQuery("select u from Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.articles a"); $q->iterate(); } public function testIterateWithDistinct() { $q = $this->_em->createQuery("SELECT DISTINCT u from Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.articles a"); self::assertInstanceOf(IterableResult::class, $q->iterate()); } /** * @group DDC-1697 */ public function testCollectionParameters() { $cities = [ 0 => "Paris", 3 => "Canne", 9 => "St Julien" ]; $query = $this->_em ->createQuery("SELECT a FROM Doctrine\Tests\Models\CMS\CmsAddress a WHERE a.city IN (:cities)") ->setParameter('cities', $cities); $parameters = $query->getParameters(); $parameter = $parameters->first(); $this->assertEquals('cities', $parameter->getName()); $this->assertEquals($cities, $parameter->getValue()); } /** * @group DDC-2224 */ public function testProcessParameterValueClassMetadata() { $query = $this->_em->createQuery("SELECT a FROM Doctrine\Tests\Models\CMS\CmsAddress a WHERE a.city IN (:cities)"); $this->assertEquals( CmsAddress::class, $query->processParameterValue($this->_em->getClassMetadata(CmsAddress::class)) ); } public function testProcessParameterValueObject() : void { $query = $this->_em->createQuery('SELECT a FROM Doctrine\Tests\Models\CMS\CmsAddress a WHERE a.user = :user'); $user = new CmsUser(); $user->id = 12345; self::assertSame( 12345, $query->processParameterValue($user) ); } public function testProcessParameterValueNull() : void { $query = $this->_em->createQuery('SELECT a FROM Doctrine\Tests\Models\CMS\CmsAddress a WHERE a.user = :user'); self::assertNull($query->processParameterValue(null)); } public function testDefaultQueryHints() { $config = $this->_em->getConfiguration(); $defaultHints = [ 'hint_name_1' => 'hint_value_1', 'hint_name_2' => 'hint_value_2', 'hint_name_3' => 'hint_value_3', ]; $config->setDefaultQueryHints($defaultHints); $query = $this->_em->createQuery(); $this->assertSame($config->getDefaultQueryHints(), $query->getHints()); $this->_em->getConfiguration()->setDefaultQueryHint('hint_name_1', 'hint_another_value_1'); $this->assertNotSame($config->getDefaultQueryHints(), $query->getHints()); $q2 = clone $query; $this->assertSame($config->getDefaultQueryHints(), $q2->getHints()); } /** * @group DDC-3714 */ public function testResultCacheCaching() { $this->_em->getConfiguration()->setResultCacheImpl(new ArrayCache()); $this->_em->getConfiguration()->setQueryCacheImpl(new ArrayCache()); /** @var DriverConnectionMock $driverConnectionMock */ $driverConnectionMock = $this->_em->getConnection()->getWrappedConnection(); $stmt = new StatementArrayMock([ [ 'id_0' => 1, ] ]); $driverConnectionMock->setStatementMock($stmt); $res = $this->_em->createQuery("select u from Doctrine\Tests\Models\CMS\CmsUser u") ->useQueryCache(true) ->useResultCache(true, 60) //let it cache ->getResult(); $this->assertCount(1, $res); $driverConnectionMock->setStatementMock(null); $res = $this->_em->createQuery("select u from Doctrine\Tests\Models\CMS\CmsUser u") ->useQueryCache(true) ->useResultCache(false) ->getResult(); $this->assertCount(0, $res); } /** * @group DDC-3741 */ public function testSetHydrationCacheProfileNull() { $query = $this->_em->createQuery(); $query->setHydrationCacheProfile(null); $this->assertNull($query->getHydrationCacheProfile()); } /** * @group 2947 */ public function testResultCacheEviction() { $this->_em->getConfiguration()->setResultCacheImpl(new ArrayCache()); $query = $this->_em->createQuery("SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u") ->useResultCache(true); /** @var DriverConnectionMock $driverConnectionMock */ $driverConnectionMock = $this->_em->getConnection() ->getWrappedConnection(); $driverConnectionMock->setStatementMock(new StatementArrayMock([['id_0' => 1]])); // Performs the query and sets up the initial cache self::assertCount(1, $query->getResult()); $driverConnectionMock->setStatementMock(new StatementArrayMock([['id_0' => 1], ['id_0' => 2]])); // Retrieves cached data since expire flag is false and we have a cached result set self::assertCount(1, $query->getResult()); // Performs the query and caches the result set since expire flag is true self::assertCount(2, $query->expireResultCache(true)->getResult()); $driverConnectionMock->setStatementMock(new StatementArrayMock([['id_0' => 1]])); // Retrieves cached data since expire flag is false and we have a cached result set self::assertCount(2, $query->expireResultCache(false)->getResult()); } /** * @group #6162 */ public function testSelectJoinSubquery() { $query = $this->_em->createQuery("select u from Doctrine\Tests\Models\CMS\CmsUser u JOIN (SELECT )"); $this->expectException(QueryException::class); $this->expectExceptionMessage('Subquery'); $query->getSQL(); } /** * @group #6162 */ public function testSelectFromSubquery() { $query = $this->_em->createQuery("select u from (select Doctrine\Tests\Models\CMS\CmsUser c) as u"); $this->expectException(QueryException::class); $this->expectExceptionMessage('Subquery'); $query->getSQL(); } /** * @group 6699 */ public function testGetParameterTypeJuggling() : void { $query = $this->_em->createQuery('select u from ' . CmsUser::class . ' u where u.id = ?0'); $query->setParameter(0, 0); self::assertCount(1, $query->getParameters()); self::assertSame(0, $query->getParameter(0)->getValue()); self::assertSame(0, $query->getParameter('0')->getValue()); } /** * @group 6699 */ public function testSetParameterWithNameZeroIsNotOverridden() : void { $query = $this->_em->createQuery('select u from ' . CmsUser::class . ' u where u.id != ?0 and u.username = :name'); $query->setParameter(0, 0); $query->setParameter('name', 'Doctrine'); self::assertCount(2, $query->getParameters()); self::assertSame(0, $query->getParameter('0')->getValue()); self::assertSame('Doctrine', $query->getParameter('name')->getValue()); } /** * @group 6699 */ public function testSetParameterWithNameZeroDoesNotOverrideAnotherParameter() : void { $query = $this->_em->createQuery('select u from ' . CmsUser::class . ' u where u.id != ?0 and u.username = :name'); $query->setParameter('name', 'Doctrine'); $query->setParameter(0, 0); self::assertCount(2, $query->getParameters()); self::assertSame(0, $query->getParameter(0)->getValue()); self::assertSame('Doctrine', $query->getParameter('name')->getValue()); } /** * @group 6699 */ public function testSetParameterWithTypeJugglingWorks() : void { $query = $this->_em->createQuery('select u from ' . CmsUser::class . ' u where u.id != ?0 and u.username = :name'); $query->setParameter('0', 1); $query->setParameter('name', 'Doctrine'); $query->setParameter(0, 2); $query->setParameter('0', 3); self::assertCount(2, $query->getParameters()); self::assertSame(3, $query->getParameter(0)->getValue()); self::assertSame(3, $query->getParameter('0')->getValue()); self::assertSame('Doctrine', $query->getParameter('name')->getValue()); } /** * @group 6748 */ public function testResultCacheProfileCanBeRemovedViaSetter() : void { $this->_em->getConfiguration()->setResultCacheImpl(new ArrayCache()); $query = $this->_em->createQuery('SELECT u FROM ' . CmsUser::class . ' u'); $query->useResultCache(true); $query->setResultCacheProfile(); self::assertAttributeSame(null, '_queryCacheProfile', $query); } }