Completed
Pull Request — 2.6 (#7471)
by Andreas
07:27
created

QueryTest::testProcessParameterValueObject()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 6
nc 1
nop 0
dl 0
loc 9
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace Doctrine\Tests\ORM\Query;
4
5
use Doctrine\Common\Cache\ArrayCache;
6
use Doctrine\Common\Collections\ArrayCollection;
7
8
use Doctrine\DBAL\Cache\QueryCacheProfile;
9
use Doctrine\ORM\EntityManager;
10
use Doctrine\ORM\Internal\Hydration\IterableResult;
11
use Doctrine\ORM\Query\Parameter;
12
use Doctrine\ORM\Query\QueryException;
13
use Doctrine\Tests\Mocks\DriverConnectionMock;
14
use Doctrine\Tests\Mocks\StatementArrayMock;
15
use Doctrine\Tests\Models\CMS\CmsAddress;
16
use Doctrine\Tests\Models\CMS\CmsUser;
17
use Doctrine\Tests\OrmTestCase;
18
19
class QueryTest extends OrmTestCase
20
{
21
    /** @var EntityManager */
22
    protected $_em = null;
23
24
    protected function setUp()
25
    {
26
        $this->_em = $this->_getTestEntityManager();
27
    }
28
29
    public function testGetParameters()
30
    {
31
        $query = $this->_em->createQuery("select u from Doctrine\Tests\Models\CMS\CmsUser u where u.username = ?1");
32
33
        $parameters = new ArrayCollection();
34
35
        $this->assertEquals($parameters, $query->getParameters());
36
    }
37
38
    public function testGetParameters_HasSomeAlready()
39
    {
40
        $query = $this->_em->createQuery("select u from Doctrine\Tests\Models\CMS\CmsUser u where u.username = ?1");
41
        $query->setParameter(2, 84);
42
43
        $parameters = new ArrayCollection();
44
        $parameters->add(new Parameter(2, 84));
45
46
        $this->assertEquals($parameters, $query->getParameters());
47
    }
48
49
    public function testSetParameters()
50
    {
51
        $query = $this->_em->createQuery("select u from Doctrine\Tests\Models\CMS\CmsUser u where u.username = ?1");
52
53
        $parameters = new ArrayCollection();
54
        $parameters->add(new Parameter(1, 'foo'));
55
        $parameters->add(new Parameter(2, 'bar'));
56
57
        $query->setParameters($parameters);
58
59
        $this->assertEquals($parameters, $query->getParameters());
60
    }
61
62
    public function testFree()
63
    {
64
        $query = $this->_em->createQuery("select u from Doctrine\Tests\Models\CMS\CmsUser u where u.username = ?1");
65
        $query->setParameter(2, 84, \PDO::PARAM_INT);
66
67
        $query->free();
68
69
        $this->assertEquals(0, count($query->getParameters()));
70
    }
71
72
    public function testClone()
73
    {
74
        $dql = "select u from Doctrine\Tests\Models\CMS\CmsUser u where u.username = ?1";
75
76
        $query = $this->_em->createQuery($dql);
77
        $query->setParameter(2, 84, \PDO::PARAM_INT);
78
        $query->setHint('foo', 'bar');
79
80
        $cloned = clone $query;
81
82
        $this->assertEquals($dql, $cloned->getDQL());
83
        $this->assertEquals(0, count($cloned->getParameters()));
84
        $this->assertFalse($cloned->getHint('foo'));
85
    }
86
87
    public function testFluentQueryInterface()
88
    {
89
        $q = $this->_em->createQuery("select a from Doctrine\Tests\Models\CMS\CmsArticle a");
90
        $q2 = $q->expireQueryCache(true)
91
          ->setQueryCacheLifetime(3600)
92
          ->setQueryCacheDriver(null)
93
          ->expireResultCache(true)
94
          ->setHint('foo', 'bar')
95
          ->setHint('bar', 'baz')
96
          ->setParameter(1, 'bar')
97
          ->setParameters(new ArrayCollection([new Parameter(2, 'baz')]))
98
          ->setResultCacheDriver(null)
99
          ->setResultCacheId('foo')
100
          ->setDQL('foo')
101
          ->setFirstResult(10)
102
          ->setMaxResults(10);
103
104
        $this->assertSame($q2, $q);
105
    }
106
107
    /**
108
     * @group DDC-968
109
     */
110
    public function testHints()
111
    {
112
        $q = $this->_em->createQuery("select a from Doctrine\Tests\Models\CMS\CmsArticle a");
113
        $q->setHint('foo', 'bar')->setHint('bar', 'baz');
114
115
        $this->assertEquals('bar', $q->getHint('foo'));
116
        $this->assertEquals('baz', $q->getHint('bar'));
117
        $this->assertEquals(['foo' => 'bar', 'bar' => 'baz'], $q->getHints());
118
        $this->assertTrue($q->hasHint('foo'));
119
        $this->assertFalse($q->hasHint('barFooBaz'));
120
    }
121
122
    /**
123
     * @group DDC-1588
124
     */
125
    public function testQueryDefaultResultCache()
126
    {
127
        $this->_em->getConfiguration()->setResultCacheImpl(new ArrayCache());
128
        $q = $this->_em->createQuery("select a from Doctrine\Tests\Models\CMS\CmsArticle a");
129
        $q->useResultCache(true);
130
        $this->assertSame($this->_em->getConfiguration()->getResultCacheImpl(), $q->getQueryCacheProfile()->getResultCacheDriver());
131
    }
132
133
    /**
134
     * @expectedException Doctrine\ORM\Query\QueryException
135
     **/
136
    public function testIterateWithNoDistinctAndWrongSelectClause()
137
    {
138
        $q = $this->_em->createQuery("select u, a from Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.articles a");
139
        $q->iterate();
140
    }
141
142
    /**
143
     * @expectedException Doctrine\ORM\Query\QueryException
144
     **/
145
    public function testIterateWithNoDistinctAndWithValidSelectClause()
146
    {
147
        $q = $this->_em->createQuery("select u from Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.articles a");
148
        $q->iterate();
149
    }
150
151
    public function testIterateWithDistinct()
152
    {
153
        $q = $this->_em->createQuery("SELECT DISTINCT u from Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.articles a");
154
155
        self::assertInstanceOf(IterableResult::class, $q->iterate());
156
    }
157
158
    /**
159
     * @group DDC-1697
160
     */
161
    public function testCollectionParameters()
162
    {
163
        $cities = [
164
            0 => "Paris",
165
            3 => "Canne",
166
            9 => "St Julien"
167
        ];
168
169
        $query  = $this->_em
170
                ->createQuery("SELECT a FROM Doctrine\Tests\Models\CMS\CmsAddress a WHERE a.city IN (:cities)")
171
                ->setParameter('cities', $cities);
172
173
        $parameters = $query->getParameters();
174
        $parameter  = $parameters->first();
175
176
        $this->assertEquals('cities', $parameter->getName());
177
        $this->assertEquals($cities, $parameter->getValue());
178
    }
179
180
    /**
181
     * @group DDC-2224
182
     */
183
    public function testProcessParameterValueClassMetadata()
184
    {
185
        $query  = $this->_em->createQuery("SELECT a FROM Doctrine\Tests\Models\CMS\CmsAddress a WHERE a.city IN (:cities)");
186
        $this->assertEquals(
187
            CmsAddress::class,
188
            $query->processParameterValue($this->_em->getClassMetadata(CmsAddress::class))
189
        );
190
    }
191
192
    public function testProcessParameterValueObject(): void
193
    {
194
        $query = $this->_em->createQuery('SELECT a FROM Doctrine\Tests\Models\CMS\CmsAddress a WHERE a.user = :user');
195
        $user = new CmsUser();
196
        $user->id = 12345;
197
198
        self::assertSame(
199
            12345,
200
            $query->processParameterValue($user)
201
        );
202
    }
203
204
    public function testDefaultQueryHints()
205
    {
206
        $config = $this->_em->getConfiguration();
207
        $defaultHints = [
208
            'hint_name_1' => 'hint_value_1',
209
            'hint_name_2' => 'hint_value_2',
210
            'hint_name_3' => 'hint_value_3',
211
        ];
212
213
        $config->setDefaultQueryHints($defaultHints);
214
        $query = $this->_em->createQuery();
215
        $this->assertSame($config->getDefaultQueryHints(), $query->getHints());
216
        $this->_em->getConfiguration()->setDefaultQueryHint('hint_name_1', 'hint_another_value_1');
217
        $this->assertNotSame($config->getDefaultQueryHints(), $query->getHints());
218
        $q2 = clone $query;
219
        $this->assertSame($config->getDefaultQueryHints(), $q2->getHints());
220
    }
221
222
    /**
223
     * @group DDC-3714
224
     */
225
    public function testResultCacheCaching()
226
    {
227
        $this->_em->getConfiguration()->setResultCacheImpl(new ArrayCache());
228
        $this->_em->getConfiguration()->setQueryCacheImpl(new ArrayCache());
229
        /** @var DriverConnectionMock $driverConnectionMock */
230
        $driverConnectionMock = $this->_em->getConnection()->getWrappedConnection();
231
        $stmt = new StatementArrayMock([
232
            [
233
                'id_0' => 1,
234
            ]
235
        ]);
236
        $driverConnectionMock->setStatementMock($stmt);
237
        $res = $this->_em->createQuery("select u from Doctrine\Tests\Models\CMS\CmsUser u")
238
            ->useQueryCache(true)
239
            ->useResultCache(true, 60)
240
            //let it cache
241
            ->getResult();
242
243
        $this->assertCount(1, $res);
244
245
        $driverConnectionMock->setStatementMock(null);
246
247
        $res = $this->_em->createQuery("select u from Doctrine\Tests\Models\CMS\CmsUser u")
248
            ->useQueryCache(true)
249
            ->useResultCache(false)
250
            ->getResult();
251
        $this->assertCount(0, $res);
252
    }
253
254
    /**
255
     * @group DDC-3741
256
     */
257
    public function testSetHydrationCacheProfileNull()
258
    {
259
        $query = $this->_em->createQuery();
260
        $query->setHydrationCacheProfile(null);
261
        $this->assertNull($query->getHydrationCacheProfile());
262
    }
263
264
    /**
265
     * @group 2947
266
     */
267
    public function testResultCacheEviction()
268
    {
269
        $this->_em->getConfiguration()->setResultCacheImpl(new ArrayCache());
270
271
        $query = $this->_em->createQuery("SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u")
272
                           ->useResultCache(true);
273
274
        /** @var DriverConnectionMock $driverConnectionMock */
275
        $driverConnectionMock = $this->_em->getConnection()
276
                                          ->getWrappedConnection();
277
278
        $driverConnectionMock->setStatementMock(new StatementArrayMock([['id_0' => 1]]));
279
280
        // Performs the query and sets up the initial cache
281
        self::assertCount(1, $query->getResult());
282
283
        $driverConnectionMock->setStatementMock(new StatementArrayMock([['id_0' => 1], ['id_0' => 2]]));
284
285
        // Retrieves cached data since expire flag is false and we have a cached result set
286
        self::assertCount(1, $query->getResult());
287
288
        // Performs the query and caches the result set since expire flag is true
289
        self::assertCount(2, $query->expireResultCache(true)->getResult());
290
291
        $driverConnectionMock->setStatementMock(new StatementArrayMock([['id_0' => 1]]));
292
293
        // Retrieves cached data since expire flag is false and we have a cached result set
294
        self::assertCount(2, $query->expireResultCache(false)->getResult());
295
    }
296
297
    /**
298
     * @group #6162
299
     */
300
    public function testSelectJoinSubquery()
301
    {
302
        $query = $this->_em->createQuery("select u from Doctrine\Tests\Models\CMS\CmsUser u JOIN (SELECT )");
303
304
        $this->expectException(QueryException::class);
305
        $this->expectExceptionMessage('Subquery');
306
        $query->getSQL();
307
    }
308
309
    /**
310
     * @group #6162
311
     */
312
    public function testSelectFromSubquery()
313
    {
314
        $query = $this->_em->createQuery("select u from (select Doctrine\Tests\Models\CMS\CmsUser c) as u");
315
316
        $this->expectException(QueryException::class);
317
        $this->expectExceptionMessage('Subquery');
318
        $query->getSQL();
319
    }
320
321
    /**
322
     * @group 6699
323
     */
324
    public function testGetParameterTypeJuggling() : void
325
    {
326
        $query = $this->_em->createQuery('select u from ' . CmsUser::class . ' u where u.id = ?0');
327
328
        $query->setParameter(0, 0);
329
330
        self::assertCount(1, $query->getParameters());
331
        self::assertSame(0, $query->getParameter(0)->getValue());
332
        self::assertSame(0, $query->getParameter('0')->getValue());
333
    }
334
335
    /**
336
     * @group 6699
337
     */
338
    public function testSetParameterWithNameZeroIsNotOverridden() : void
339
    {
340
        $query = $this->_em->createQuery('select u from ' . CmsUser::class . ' u where u.id != ?0 and u.username = :name');
341
342
        $query->setParameter(0, 0);
343
        $query->setParameter('name', 'Doctrine');
344
345
        self::assertCount(2, $query->getParameters());
346
        self::assertSame(0, $query->getParameter('0')->getValue());
347
        self::assertSame('Doctrine', $query->getParameter('name')->getValue());
348
    }
349
350
    /**
351
     * @group 6699
352
     */
353
    public function testSetParameterWithNameZeroDoesNotOverrideAnotherParameter() : void
354
    {
355
        $query = $this->_em->createQuery('select u from ' . CmsUser::class . ' u where u.id != ?0 and u.username = :name');
356
357
        $query->setParameter('name', 'Doctrine');
358
        $query->setParameter(0, 0);
359
360
        self::assertCount(2, $query->getParameters());
361
        self::assertSame(0, $query->getParameter(0)->getValue());
362
        self::assertSame('Doctrine', $query->getParameter('name')->getValue());
363
    }
364
365
    /**
366
     * @group 6699
367
     */
368
    public function testSetParameterWithTypeJugglingWorks() : void
369
    {
370
        $query = $this->_em->createQuery('select u from ' . CmsUser::class . ' u where u.id != ?0 and u.username = :name');
371
372
        $query->setParameter('0', 1);
373
        $query->setParameter('name', 'Doctrine');
374
        $query->setParameter(0, 2);
375
        $query->setParameter('0', 3);
376
377
        self::assertCount(2, $query->getParameters());
378
        self::assertSame(3, $query->getParameter(0)->getValue());
379
        self::assertSame(3, $query->getParameter('0')->getValue());
380
        self::assertSame('Doctrine', $query->getParameter('name')->getValue());
381
    }
382
383
    /**
384
     * @group 6748
385
     */
386
    public function testResultCacheProfileCanBeRemovedViaSetter() : void
387
    {
388
        $this->_em->getConfiguration()->setResultCacheImpl(new ArrayCache());
389
390
        $query = $this->_em->createQuery('SELECT u FROM ' . CmsUser::class . ' u');
391
        $query->useResultCache(true);
392
        $query->setResultCacheProfile();
393
394
        self::assertAttributeSame(null, '_queryCacheProfile', $query);
395
    }
396
}
397