3 namespace Doctrine\Tests\ORM\Functional;
5 use Doctrine\Tests\Models\Company\CompanyManager;
7 require_once __DIR__ . '/../../TestInit.php';
10 * Functional Query tests.
14 class QueryDqlFunctionTest extends \Doctrine\Tests\OrmFunctionalTestCase
16 protected function setUp()
18 $this->useModelSet('company');
21 $this->generateFixture();
24 public function testAggregateSum()
26 $salarySum = $this->_em->createQuery('SELECT SUM(m.salary) AS salary FROM Doctrine\Tests\Models\Company\CompanyManager m')
29 $this->assertEquals(1500000, $salarySum['salary']);
32 public function testAggregateAvg()
34 $salaryAvg = $this->_em->createQuery('SELECT AVG(m.salary) AS salary FROM Doctrine\Tests\Models\Company\CompanyManager m')
37 $this->assertEquals(375000, round($salaryAvg['salary'], 0));
40 public function testAggregateMin()
42 $salary = $this->_em->createQuery('SELECT MIN(m.salary) AS salary FROM Doctrine\Tests\Models\Company\CompanyManager m')
45 $this->assertEquals(100000, $salary['salary']);
48 public function testAggregateMax()
50 $salary = $this->_em->createQuery('SELECT MAX(m.salary) AS salary FROM Doctrine\Tests\Models\Company\CompanyManager m')
53 $this->assertEquals(800000, $salary['salary']);
56 public function testAggregateCount()
58 $managerCount = $this->_em->createQuery('SELECT COUNT(m.id) AS managers FROM Doctrine\Tests\Models\Company\CompanyManager m')
61 $this->assertEquals(4, $managerCount['managers']);
64 public function testFunctionAbs()
66 $result = $this->_em->createQuery('SELECT m, ABS(m.salary * -1) AS abs FROM Doctrine\Tests\Models\Company\CompanyManager m')
69 $this->assertEquals(4, count($result));
70 $this->assertEquals(100000, $result[0]['abs']);
71 $this->assertEquals(200000, $result[1]['abs']);
72 $this->assertEquals(400000, $result[2]['abs']);
73 $this->assertEquals(800000, $result[3]['abs']);
76 public function testFunctionConcat()
78 $arg = $this->_em->createQuery('SELECT m, CONCAT(m.name, m.department) AS namedep FROM Doctrine\Tests\Models\Company\CompanyManager m')
81 $this->assertEquals(4, count($arg));
82 $this->assertEquals('Roman B.IT', $arg[0]['namedep']);
83 $this->assertEquals('Benjamin E.HR', $arg[1]['namedep']);
84 $this->assertEquals('Guilherme B.Complaint Department', $arg[2]['namedep']);
85 $this->assertEquals('Jonathan W.Administration', $arg[3]['namedep']);
88 public function testFunctionLength()
90 $result = $this->_em->createQuery('SELECT m, LENGTH(CONCAT(m.name, m.department)) AS namedeplength FROM Doctrine\Tests\Models\Company\CompanyManager m')
93 $this->assertEquals(4, count($result));
94 $this->assertEquals(10, $result[0]['namedeplength']);
95 $this->assertEquals(13, $result[1]['namedeplength']);
96 $this->assertEquals(32, $result[2]['namedeplength']);
97 $this->assertEquals(25, $result[3]['namedeplength']);
100 public function testFunctionLocate()
102 $dql = "SELECT m, LOCATE('e', LOWER(m.name)) AS loc, LOCATE('e', LOWER(m.name), 7) AS loc2 ".
103 "FROM Doctrine\Tests\Models\Company\CompanyManager m";
105 $result = $this->_em->createQuery($dql)
108 $this->assertEquals(4, count($result));
109 $this->assertEquals(0, $result[0]['loc']);
110 $this->assertEquals(2, $result[1]['loc']);
111 $this->assertEquals(6, $result[2]['loc']);
112 $this->assertEquals(0, $result[3]['loc']);
113 $this->assertEquals(0, $result[0]['loc2']);
114 $this->assertEquals(10, $result[1]['loc2']);
115 $this->assertEquals(9, $result[2]['loc2']);
116 $this->assertEquals(0, $result[3]['loc2']);
119 public function testFunctionLower()
121 $result = $this->_em->createQuery("SELECT m, LOWER(m.name) AS lowername FROM Doctrine\Tests\Models\Company\CompanyManager m")
124 $this->assertEquals(4, count($result));
125 $this->assertEquals('roman b.', $result[0]['lowername']);
126 $this->assertEquals('benjamin e.', $result[1]['lowername']);
127 $this->assertEquals('guilherme b.', $result[2]['lowername']);
128 $this->assertEquals('jonathan w.', $result[3]['lowername']);
131 public function testFunctionMod()
133 $result = $this->_em->createQuery("SELECT m, MOD(m.salary, 3500) AS amod FROM Doctrine\Tests\Models\Company\CompanyManager m")
136 $this->assertEquals(4, count($result));
137 $this->assertEquals(2000, $result[0]['amod']);
138 $this->assertEquals(500, $result[1]['amod']);
139 $this->assertEquals(1000, $result[2]['amod']);
140 $this->assertEquals(2000, $result[3]['amod']);
143 public function testFunctionSqrt()
145 $result = $this->_em->createQuery("SELECT m, SQRT(m.salary) AS sqrtsalary FROM Doctrine\Tests\Models\Company\CompanyManager m")
148 $this->assertEquals(4, count($result));
149 $this->assertEquals(316, round($result[0]['sqrtsalary']));
150 $this->assertEquals(447, round($result[1]['sqrtsalary']));
151 $this->assertEquals(632, round($result[2]['sqrtsalary']));
152 $this->assertEquals(894, round($result[3]['sqrtsalary']));
155 public function testFunctionUpper()
157 $result = $this->_em->createQuery("SELECT m, UPPER(m.name) AS uppername FROM Doctrine\Tests\Models\Company\CompanyManager m")
160 $this->assertEquals(4, count($result));
161 $this->assertEquals('ROMAN B.', $result[0]['uppername']);
162 $this->assertEquals('BENJAMIN E.', $result[1]['uppername']);
163 $this->assertEquals('GUILHERME B.', $result[2]['uppername']);
164 $this->assertEquals('JONATHAN W.', $result[3]['uppername']);
167 public function testFunctionSubstring()
169 $dql = "SELECT m, SUBSTRING(m.name, 1, 3) AS str1, SUBSTRING(m.name, 5) AS str2 ".
170 "FROM Doctrine\Tests\Models\Company\CompanyManager m ORDER BY m.name";
172 $result = $this->_em->createQuery($dql)
175 $this->assertEquals(4, count($result));
176 $this->assertEquals('Ben', $result[0]['str1']);
177 $this->assertEquals('Gui', $result[1]['str1']);
178 $this->assertEquals('Jon', $result[2]['str1']);
179 $this->assertEquals('Rom', $result[3]['str1']);
181 $this->assertEquals('amin E.', $result[0]['str2']);
182 $this->assertEquals('herme B.', $result[1]['str2']);
183 $this->assertEquals('than W.', $result[2]['str2']);
184 $this->assertEquals('n B.', $result[3]['str2']);
187 public function testFunctionTrim()
189 $dql = "SELECT m, TRIM(TRAILING '.' FROM m.name) AS str1, ".
190 " TRIM(LEADING '.' FROM m.name) AS str2, TRIM(CONCAT(' ', CONCAT(m.name, ' '))) AS str3 ".
191 "FROM Doctrine\Tests\Models\Company\CompanyManager m";
193 $result = $this->_em->createQuery($dql)->getArrayResult();
195 $this->assertEquals(4, count($result));
196 $this->assertEquals('Roman B', $result[0]['str1']);
197 $this->assertEquals('Benjamin E', $result[1]['str1']);
198 $this->assertEquals('Guilherme B', $result[2]['str1']);
199 $this->assertEquals('Jonathan W', $result[3]['str1']);
200 $this->assertEquals('Roman B.', $result[0]['str2']);
201 $this->assertEquals('Benjamin E.', $result[1]['str2']);
202 $this->assertEquals('Guilherme B.', $result[2]['str2']);
203 $this->assertEquals('Jonathan W.', $result[3]['str2']);
204 $this->assertEquals('Roman B.', $result[0]['str3']);
205 $this->assertEquals('Benjamin E.', $result[1]['str3']);
206 $this->assertEquals('Guilherme B.', $result[2]['str3']);
207 $this->assertEquals('Jonathan W.', $result[3]['str3']);
210 public function testOperatorAdd()
212 $result = $this->_em->createQuery('SELECT m, m.salary+2500 AS add FROM Doctrine\Tests\Models\Company\CompanyManager m')
215 $this->assertEquals(4, count($result));
216 $this->assertEquals(102500, $result[0]['add']);
217 $this->assertEquals(202500, $result[1]['add']);
218 $this->assertEquals(402500, $result[2]['add']);
219 $this->assertEquals(802500, $result[3]['add']);
222 public function testOperatorSub()
224 $result = $this->_em->createQuery('SELECT m, m.salary-2500 AS sub FROM Doctrine\Tests\Models\Company\CompanyManager m')
227 $this->assertEquals(4, count($result));
228 $this->assertEquals(97500, $result[0]['sub']);
229 $this->assertEquals(197500, $result[1]['sub']);
230 $this->assertEquals(397500, $result[2]['sub']);
231 $this->assertEquals(797500, $result[3]['sub']);
234 public function testOperatorMultiply()
236 $result = $this->_em->createQuery('SELECT m, m.salary*2 AS op FROM Doctrine\Tests\Models\Company\CompanyManager m')
239 $this->assertEquals(4, count($result));
240 $this->assertEquals(200000, $result[0]['op']);
241 $this->assertEquals(400000, $result[1]['op']);
242 $this->assertEquals(800000, $result[2]['op']);
243 $this->assertEquals(1600000, $result[3]['op']);
249 public function testOperatorDiv()
251 $result = $this->_em->createQuery('SELECT m, (m.salary/0.5) AS op FROM Doctrine\Tests\Models\Company\CompanyManager m')
254 $this->assertEquals(4, count($result));
255 $this->assertEquals(200000, $result[0]['op']);
256 $this->assertEquals(400000, $result[1]['op']);
257 $this->assertEquals(800000, $result[2]['op']);
258 $this->assertEquals(1600000, $result[3]['op']);
261 public function testConcatFunction()
263 $arg = $this->_em->createQuery('SELECT CONCAT(m.name, m.department) AS namedep FROM Doctrine\Tests\Models\Company\CompanyManager m order by namedep desc')
266 $this->assertEquals(4, count($arg));
267 $this->assertEquals('Roman B.IT', $arg[0]['namedep']);
268 $this->assertEquals('Jonathan W.Administration', $arg[1]['namedep']);
269 $this->assertEquals('Guilherme B.Complaint Department', $arg[2]['namedep']);
270 $this->assertEquals('Benjamin E.HR', $arg[3]['namedep']);
276 public function testDateDiff()
278 $query = $this->_em->createQuery("SELECT DATE_DIFF(CURRENT_TIMESTAMP(), DATE_ADD(CURRENT_TIMESTAMP(), 10, 'day')) AS diff FROM Doctrine\Tests\Models\Company\CompanyManager m");
279 $arg = $query->getArrayResult();
281 $this->assertEquals(-10, $arg[0]['diff'], "Should be roughly -10 (or -9)", 1);
283 $query = $this->_em->createQuery("SELECT DATE_DIFF(DATE_ADD(CURRENT_TIMESTAMP(), 10, 'day'), CURRENT_TIMESTAMP()) AS diff FROM Doctrine\Tests\Models\Company\CompanyManager m");
284 $arg = $query->getArrayResult();
286 $this->assertEquals(10, $arg[0]['diff'], "Should be roughly 10 (or 9)", 1);
292 public function testDateAdd()
294 $arg = $this->_em->createQuery("SELECT DATE_ADD(CURRENT_TIMESTAMP(), 10, 'day') AS add FROM Doctrine\Tests\Models\Company\CompanyManager m")
297 $this->assertTrue(strtotime($arg[0]['add']) > 0);
299 $arg = $this->_em->createQuery("SELECT DATE_ADD(CURRENT_TIMESTAMP(), 10, 'month') AS add FROM Doctrine\Tests\Models\Company\CompanyManager m")
302 $this->assertTrue(strtotime($arg[0]['add']) > 0);
308 public function testDateSub()
310 $arg = $this->_em->createQuery("SELECT DATE_SUB(CURRENT_TIMESTAMP(), 10, 'day') AS add FROM Doctrine\Tests\Models\Company\CompanyManager m")
313 $this->assertTrue(strtotime($arg[0]['add']) > 0);
315 $arg = $this->_em->createQuery("SELECT DATE_SUB(CURRENT_TIMESTAMP(), 10, 'month') AS add FROM Doctrine\Tests\Models\Company\CompanyManager m")
318 $this->assertTrue(strtotime($arg[0]['add']) > 0);
324 public function testBitOrComparison()
326 $dql = 'SELECT m, ' .
327 'BIT_OR(4, 2) AS bit_or,' .
328 'BIT_OR( (m.salary/100000) , 2 ) AS salary_bit_or ' .
329 'FROM Doctrine\Tests\Models\Company\CompanyManager m ' .
332 $result = $this->_em->createQuery($dql)->getArrayResult();
334 $this->assertEquals(4 | 2, $result[0]['bit_or']);
335 $this->assertEquals(4 | 2, $result[1]['bit_or']);
336 $this->assertEquals(4 | 2, $result[2]['bit_or']);
337 $this->assertEquals(4 | 2, $result[3]['bit_or']);
339 $this->assertEquals(($result[0][0]['salary']/100000) | 2, $result[0]['salary_bit_or']);
340 $this->assertEquals(($result[1][0]['salary']/100000) | 2, $result[1]['salary_bit_or']);
341 $this->assertEquals(($result[2][0]['salary']/100000) | 2, $result[2]['salary_bit_or']);
342 $this->assertEquals(($result[3][0]['salary']/100000) | 2, $result[3]['salary_bit_or']);
348 public function testBitAndComparison()
350 $dql = 'SELECT m, ' .
351 'BIT_AND(4, 2) AS bit_and,' .
352 'BIT_AND( (m.salary/100000) , 2 ) AS salary_bit_and ' .
353 'FROM Doctrine\Tests\Models\Company\CompanyManager m ' .
356 $result = $this->_em->createQuery($dql)->getArrayResult();
358 $this->assertEquals(4 & 2, $result[0]['bit_and']);
359 $this->assertEquals(4 & 2, $result[1]['bit_and']);
360 $this->assertEquals(4 & 2, $result[2]['bit_and']);
361 $this->assertEquals(4 & 2, $result[3]['bit_and']);
363 $this->assertEquals(($result[0][0]['salary']/100000) & 2, $result[0]['salary_bit_and']);
364 $this->assertEquals(($result[1][0]['salary']/100000) & 2, $result[1]['salary_bit_and']);
365 $this->assertEquals(($result[2][0]['salary']/100000) & 2, $result[2]['salary_bit_and']);
366 $this->assertEquals(($result[3][0]['salary']/100000) & 2, $result[3]['salary_bit_and']);
369 protected function generateFixture()
371 $manager1 = new CompanyManager();
372 $manager1->setName('Roman B.');
373 $manager1->setTitle('Foo');
374 $manager1->setDepartment('IT');
375 $manager1->setSalary(100000);
377 $manager2 = new CompanyManager();
378 $manager2->setName('Benjamin E.');
379 $manager2->setTitle('Foo');
380 $manager2->setDepartment('HR');
381 $manager2->setSalary(200000);
383 $manager3 = new CompanyManager();
384 $manager3->setName('Guilherme B.');
385 $manager3->setTitle('Foo');
386 $manager3->setDepartment('Complaint Department');
387 $manager3->setSalary(400000);
389 $manager4 = new CompanyManager();
390 $manager4->setName('Jonathan W.');
391 $manager4->setTitle('Foo');
392 $manager4->setDepartment('Administration');
393 $manager4->setSalary(800000);
395 $this->_em->persist($manager1);
396 $this->_em->persist($manager2);
397 $this->_em->persist($manager3);
398 $this->_em->persist($manager4);