PageRenderTime 51ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/Doctrine/Tests/ORM/Query/SelectSqlGenerationTest.php

https://github.com/EdgarPost/doctrine2
PHP | 877 lines | 665 code | 122 blank | 90 comment | 4 complexity | fdd23efa124849208be43b7f066be51a MD5 | raw file
Possible License(s): LGPL-2.1
  1. <?php
  2. namespace Doctrine\Tests\ORM\Query;
  3. use Doctrine\ORM\Query;
  4. require_once __DIR__ . '/../../TestInit.php';
  5. class SelectSqlGenerationTest extends \Doctrine\Tests\OrmTestCase
  6. {
  7. private $_em;
  8. protected function setUp()
  9. {
  10. $this->_em = $this->_getTestEntityManager();
  11. }
  12. /**
  13. * Assert a valid SQL generation.
  14. *
  15. * @param string $dqlToBeTested
  16. * @param string $sqlToBeConfirmed
  17. * @param array $queryHints
  18. * @param array $queryParams
  19. */
  20. public function assertSqlGeneration($dqlToBeTested, $sqlToBeConfirmed, array $queryHints = array(), array $queryParams = array())
  21. {
  22. try {
  23. $query = $this->_em->createQuery($dqlToBeTested);
  24. foreach ($queryParams AS $name => $value) {
  25. $query->setParameter($name, $value);
  26. }
  27. $query->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true)
  28. ->useQueryCache(false);
  29. foreach ($queryHints AS $name => $value) {
  30. $query->setHint($name, $value);
  31. }
  32. parent::assertEquals($sqlToBeConfirmed, $query->getSql());
  33. $query->free();
  34. } catch (\Exception $e) {
  35. $this->fail($e->getMessage());
  36. }
  37. }
  38. /**
  39. * Asser an invalid SQL generation.
  40. *
  41. * @param string $dqlToBeTested
  42. * @param string $expectedException
  43. * @param array $queryHints
  44. * @param array $queryParams
  45. */
  46. public function assertInvalidSqlGeneration($dqlToBeTested, $expectedException, array $queryHints = array(), array $queryParams = array())
  47. {
  48. $this->setExpectedException($expectedException);
  49. $query = $this->_em->createQuery($dqlToBeTested);
  50. foreach ($queryParams AS $name => $value) {
  51. $query->setParameter($name, $value);
  52. }
  53. $query->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true)
  54. ->useQueryCache(false);
  55. foreach ($queryHints AS $name => $value) {
  56. $query->setHint($name, $value);
  57. }
  58. $sql = $query->getSql();
  59. $query->free();
  60. // If we reached here, test failed
  61. $this->fail($sql);
  62. }
  63. public function testSupportsSelectForAllFields()
  64. {
  65. $this->assertSqlGeneration(
  66. 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u',
  67. 'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_'
  68. );
  69. }
  70. public function testSupportsSelectForOneField()
  71. {
  72. $this->assertSqlGeneration(
  73. 'SELECT u.id FROM Doctrine\Tests\Models\CMS\CmsUser u',
  74. 'SELECT c0_.id AS id0 FROM cms_users c0_'
  75. );
  76. }
  77. public function testSupportsSelectForOneNestedField()
  78. {
  79. $this->assertSqlGeneration(
  80. 'SELECT u.id FROM Doctrine\Tests\Models\CMS\CmsArticle a JOIN a.user u',
  81. 'SELECT c0_.id AS id0 FROM cms_articles c1_ INNER JOIN cms_users c0_ ON c1_.user_id = c0_.id'
  82. );
  83. }
  84. public function testSupportsSelectForAllNestedField()
  85. {
  86. $this->assertSqlGeneration(
  87. 'SELECT a FROM Doctrine\Tests\Models\CMS\CmsArticle a JOIN a.user u ORDER BY u.name ASC',
  88. 'SELECT c0_.id AS id0, c0_.topic AS topic1, c0_.text AS text2, c0_.version AS version3 FROM cms_articles c0_ INNER JOIN cms_users c1_ ON c0_.user_id = c1_.id ORDER BY c1_.name ASC'
  89. );
  90. }
  91. public function testSupportsSelectForMultipleColumnsOfASingleComponent()
  92. {
  93. $this->assertSqlGeneration(
  94. 'SELECT u.username, u.name FROM Doctrine\Tests\Models\CMS\CmsUser u',
  95. 'SELECT c0_.username AS username0, c0_.name AS name1 FROM cms_users c0_'
  96. );
  97. }
  98. public function testSupportsSelectUsingMultipleFromComponents()
  99. {
  100. $this->assertSqlGeneration(
  101. 'SELECT u, p FROM Doctrine\Tests\Models\CMS\CmsUser u, Doctrine\Tests\Models\CMS\CmsPhonenumber p WHERE u = p.user',
  102. 'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3, c1_.phonenumber AS phonenumber4 FROM cms_users c0_, cms_phonenumbers c1_ WHERE c0_.id = c1_.user_id'
  103. );
  104. }
  105. public function testSupportsSelectWithCollectionAssociationJoin()
  106. {
  107. $this->assertSqlGeneration(
  108. 'SELECT u, p FROM Doctrine\Tests\Models\CMS\CmsUser u JOIN u.phonenumbers p',
  109. 'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3, c1_.phonenumber AS phonenumber4 FROM cms_users c0_ INNER JOIN cms_phonenumbers c1_ ON c0_.id = c1_.user_id'
  110. );
  111. }
  112. public function testSupportsSelectWithSingleValuedAssociationJoin()
  113. {
  114. $this->assertSqlGeneration(
  115. 'SELECT u, a FROM Doctrine\Tests\Models\Forum\ForumUser u JOIN u.avatar a',
  116. 'SELECT f0_.id AS id0, f0_.username AS username1, f1_.id AS id2 FROM forum_users f0_ INNER JOIN forum_avatars f1_ ON f0_.avatar_id = f1_.id'
  117. );
  118. }
  119. public function testSelectCorrelatedSubqueryComplexMathematicalExpression()
  120. {
  121. $this->assertSqlGeneration(
  122. 'SELECT (SELECT (count(p.phonenumber)+5)*10 FROM Doctrine\Tests\Models\CMS\CmsPhonenumber p JOIN p.user ui WHERE ui.id = u.id) AS c FROM Doctrine\Tests\Models\CMS\CmsUser u',
  123. 'SELECT (SELECT (count(c0_.phonenumber) + 5) * 10 AS sclr1 FROM cms_phonenumbers c0_ INNER JOIN cms_users c1_ ON c0_.user_id = c1_.id WHERE c1_.id = c2_.id) AS sclr0 FROM cms_users c2_'
  124. );
  125. }
  126. public function testSelectComplexMathematicalExpression()
  127. {
  128. $this->assertSqlGeneration(
  129. 'SELECT (count(p.phonenumber)+5)*10 FROM Doctrine\Tests\Models\CMS\CmsPhonenumber p JOIN p.user ui WHERE ui.id = ?1',
  130. 'SELECT (count(c0_.phonenumber) + 5) * 10 AS sclr0 FROM cms_phonenumbers c0_ INNER JOIN cms_users c1_ ON c0_.user_id = c1_.id WHERE c1_.id = ?'
  131. );
  132. }
  133. /* NOT (YET?) SUPPORTED.
  134. Can be supported if SimpleSelectExpresion supports SingleValuedPathExpression instead of StateFieldPathExpression.
  135. public function testSingleAssociationPathExpressionInSubselect()
  136. {
  137. $this->assertSqlGeneration(
  138. 'SELECT (SELECT p.user FROM Doctrine\Tests\Models\CMS\CmsPhonenumber p WHERE p.user = u) user_id FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = ?1',
  139. 'SELECT (SELECT c0_.user_id FROM cms_phonenumbers c0_ WHERE c0_.user_id = c1_.id) AS sclr0 FROM cms_users c1_ WHERE c1_.id = ?'
  140. );
  141. }*/
  142. public function testSupportsOrderByWithAscAsDefault()
  143. {
  144. $this->assertSqlGeneration(
  145. 'SELECT u FROM Doctrine\Tests\Models\Forum\ForumUser u ORDER BY u.id',
  146. 'SELECT f0_.id AS id0, f0_.username AS username1 FROM forum_users f0_ ORDER BY f0_.id ASC'
  147. );
  148. }
  149. public function testSupportsOrderByAsc()
  150. {
  151. $this->assertSqlGeneration(
  152. 'SELECT u FROM Doctrine\Tests\Models\Forum\ForumUser u ORDER BY u.id asc',
  153. 'SELECT f0_.id AS id0, f0_.username AS username1 FROM forum_users f0_ ORDER BY f0_.id ASC'
  154. );
  155. }
  156. public function testSupportsOrderByDesc()
  157. {
  158. $this->assertSqlGeneration(
  159. 'SELECT u FROM Doctrine\Tests\Models\Forum\ForumUser u ORDER BY u.id desc',
  160. 'SELECT f0_.id AS id0, f0_.username AS username1 FROM forum_users f0_ ORDER BY f0_.id DESC'
  161. );
  162. }
  163. public function testSupportsSelectDistinct()
  164. {
  165. $this->assertSqlGeneration(
  166. 'SELECT DISTINCT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u',
  167. 'SELECT DISTINCT c0_.name AS name0 FROM cms_users c0_'
  168. );
  169. }
  170. public function testSupportsAggregateFunctionInSelectedFields()
  171. {
  172. $this->assertSqlGeneration(
  173. 'SELECT COUNT(u.id) FROM Doctrine\Tests\Models\CMS\CmsUser u GROUP BY u.id',
  174. 'SELECT COUNT(c0_.id) AS sclr0 FROM cms_users c0_ GROUP BY c0_.id'
  175. );
  176. }
  177. public function testSupportsWhereClauseWithPositionalParameter()
  178. {
  179. $this->assertSqlGeneration(
  180. 'select u from Doctrine\Tests\Models\Forum\ForumUser u where u.id = ?1',
  181. 'SELECT f0_.id AS id0, f0_.username AS username1 FROM forum_users f0_ WHERE f0_.id = ?'
  182. );
  183. }
  184. public function testSupportsWhereClauseWithNamedParameter()
  185. {
  186. $this->assertSqlGeneration(
  187. 'select u from Doctrine\Tests\Models\Forum\ForumUser u where u.username = :name',
  188. 'SELECT f0_.id AS id0, f0_.username AS username1 FROM forum_users f0_ WHERE f0_.username = ?'
  189. );
  190. }
  191. public function testSupportsWhereAndClauseWithNamedParameters()
  192. {
  193. $this->assertSqlGeneration(
  194. 'select u from Doctrine\Tests\Models\Forum\ForumUser u where u.username = :name and u.username = :name2',
  195. 'SELECT f0_.id AS id0, f0_.username AS username1 FROM forum_users f0_ WHERE f0_.username = ? AND f0_.username = ?'
  196. );
  197. }
  198. public function testSupportsCombinedWhereClauseWithNamedParameter()
  199. {
  200. $this->assertSqlGeneration(
  201. 'select u from Doctrine\Tests\Models\Forum\ForumUser u where (u.username = :name OR u.username = :name2) AND u.id = :id',
  202. 'SELECT f0_.id AS id0, f0_.username AS username1 FROM forum_users f0_ WHERE (f0_.username = ? OR f0_.username = ?) AND f0_.id = ?'
  203. );
  204. }
  205. public function testSupportsAggregateFunctionInASelectDistinct()
  206. {
  207. $this->assertSqlGeneration(
  208. 'SELECT COUNT(DISTINCT u.name) FROM Doctrine\Tests\Models\CMS\CmsUser u',
  209. 'SELECT COUNT(DISTINCT c0_.name) AS sclr0 FROM cms_users c0_'
  210. );
  211. }
  212. // Ticket #668
  213. public function testSupportsASqlKeywordInAStringLiteralParam()
  214. {
  215. $this->assertSqlGeneration(
  216. "SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name LIKE '%foo OR bar%'",
  217. "SELECT c0_.name AS name0 FROM cms_users c0_ WHERE c0_.name LIKE '%foo OR bar%'"
  218. );
  219. }
  220. public function testSupportsArithmeticExpressionsInWherePart()
  221. {
  222. $this->assertSqlGeneration(
  223. 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE ((u.id + 5000) * u.id + 3) < 10000000',
  224. 'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ WHERE (c0_.id + 5000) * c0_.id + 3 < 10000000'
  225. );
  226. }
  227. public function testSupportsMultipleEntitiesInFromClause()
  228. {
  229. $this->assertSqlGeneration(
  230. 'SELECT u, a FROM Doctrine\Tests\Models\CMS\CmsUser u, Doctrine\Tests\Models\CMS\CmsArticle a JOIN a.user u2 WHERE u.id = u2.id',
  231. 'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3, c1_.id AS id4, c1_.topic AS topic5, c1_.text AS text6, c1_.version AS version7 FROM cms_users c0_, cms_articles c1_ INNER JOIN cms_users c2_ ON c1_.user_id = c2_.id WHERE c0_.id = c2_.id'
  232. );
  233. }
  234. public function testSupportsMultipleEntitiesInFromClauseUsingPathExpression()
  235. {
  236. $this->assertSqlGeneration(
  237. 'SELECT u, a FROM Doctrine\Tests\Models\CMS\CmsUser u, Doctrine\Tests\Models\CMS\CmsArticle a WHERE u.id = a.user',
  238. 'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3, c1_.id AS id4, c1_.topic AS topic5, c1_.text AS text6, c1_.version AS version7 FROM cms_users c0_, cms_articles c1_ WHERE c0_.id = c1_.user_id'
  239. );
  240. }
  241. public function testSupportsPlainJoinWithoutClause()
  242. {
  243. $this->assertSqlGeneration(
  244. 'SELECT u.id, a.id from Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.articles a',
  245. 'SELECT c0_.id AS id0, c1_.id AS id1 FROM cms_users c0_ LEFT JOIN cms_articles c1_ ON c0_.id = c1_.user_id'
  246. );
  247. $this->assertSqlGeneration(
  248. 'SELECT u.id, a.id from Doctrine\Tests\Models\CMS\CmsUser u JOIN u.articles a',
  249. 'SELECT c0_.id AS id0, c1_.id AS id1 FROM cms_users c0_ INNER JOIN cms_articles c1_ ON c0_.id = c1_.user_id'
  250. );
  251. }
  252. /**
  253. * @group DDC-135
  254. */
  255. public function testSupportsJoinAndWithClauseRestriction()
  256. {
  257. $this->assertSqlGeneration(
  258. "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.articles a WITH a.topic LIKE '%foo%'",
  259. "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ LEFT JOIN cms_articles c1_ ON c0_.id = c1_.user_id AND (c1_.topic LIKE '%foo%')"
  260. );
  261. $this->assertSqlGeneration(
  262. "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u INNER JOIN u.articles a WITH a.topic LIKE '%foo%'",
  263. "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ INNER JOIN cms_articles c1_ ON c0_.id = c1_.user_id AND (c1_.topic LIKE '%foo%')"
  264. );
  265. }
  266. /**
  267. * @group DDC-135
  268. * @group DDC-177
  269. */
  270. public function testJoinOnClause_NotYetSupported_ThrowsException()
  271. {
  272. $this->setExpectedException('Doctrine\ORM\Query\QueryException');
  273. $sql = $this->_em->createQuery(
  274. "SELECT u, a FROM Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.articles a ON a.topic LIKE '%foo%'"
  275. )->getSql();
  276. }
  277. public function testSupportsMultipleJoins()
  278. {
  279. $this->assertSqlGeneration(
  280. 'SELECT u.id, a.id, p, c.id from Doctrine\Tests\Models\CMS\CmsUser u JOIN u.articles a JOIN u.phonenumbers p JOIN a.comments c',
  281. 'SELECT c0_.id AS id0, c1_.id AS id1, c2_.phonenumber AS phonenumber2, c3_.id AS id3 FROM cms_users c0_ INNER JOIN cms_articles c1_ ON c0_.id = c1_.user_id INNER JOIN cms_phonenumbers c2_ ON c0_.id = c2_.user_id INNER JOIN cms_comments c3_ ON c1_.id = c3_.article_id'
  282. );
  283. }
  284. public function testSupportsTrimFunction()
  285. {
  286. $this->assertSqlGeneration(
  287. "SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE TRIM(TRAILING ' ' FROM u.name) = 'someone'",
  288. "SELECT c0_.name AS name0 FROM cms_users c0_ WHERE TRIM(TRAILING ' ' FROM c0_.name) = 'someone'"
  289. );
  290. }
  291. // Ticket 894
  292. public function testSupportsBetweenClauseWithPositionalParameters()
  293. {
  294. $this->assertSqlGeneration(
  295. "SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id BETWEEN ?1 AND ?2",
  296. "SELECT c0_.name AS name0 FROM cms_users c0_ WHERE c0_.id BETWEEN ? AND ?"
  297. );
  298. }
  299. public function testSupportsFunctionalExpressionsInWherePart()
  300. {
  301. $this->assertSqlGeneration(
  302. "SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE TRIM(u.name) = 'someone'",
  303. // String quoting in the SQL usually depends on the database platform.
  304. // This test works with a mock connection which uses ' for string quoting.
  305. "SELECT c0_.name AS name0 FROM cms_users c0_ WHERE TRIM(c0_.name) = 'someone'"
  306. );
  307. }
  308. public function testSupportsInstanceOfExpressionsInWherePart()
  309. {
  310. $this->assertSqlGeneration(
  311. "SELECT u FROM Doctrine\Tests\Models\Company\CompanyPerson u WHERE u INSTANCE OF Doctrine\Tests\Models\Company\CompanyEmployee",
  312. "SELECT c0_.id AS id0, c0_.name AS name1, c0_.discr AS discr2 FROM company_persons c0_ WHERE c0_.discr = 'employee'"
  313. );
  314. }
  315. public function testSupportsInstanceOfExpressionsInWherePartInDeeperLevel()
  316. {
  317. $this->assertSqlGeneration(
  318. "SELECT u FROM Doctrine\Tests\Models\Company\CompanyEmployee u WHERE u INSTANCE OF Doctrine\Tests\Models\Company\CompanyManager",
  319. "SELECT c0_.id AS id0, c0_.name AS name1, c1_.salary AS salary2, c1_.department AS department3, c0_.discr AS discr4 FROM company_employees c1_ INNER JOIN company_persons c0_ ON c1_.id = c0_.id WHERE c0_.discr = 'manager'"
  320. );
  321. }
  322. public function testSupportsInstanceOfExpressionsInWherePartInDeepestLevel()
  323. {
  324. $this->assertSqlGeneration(
  325. "SELECT u FROM Doctrine\Tests\Models\Company\CompanyManager u WHERE u INSTANCE OF Doctrine\Tests\Models\Company\CompanyManager",
  326. "SELECT c0_.id AS id0, c0_.name AS name1, c1_.salary AS salary2, c1_.department AS department3, c2_.title AS title4, c0_.discr AS discr5 FROM company_managers c2_ INNER JOIN company_employees c1_ ON c2_.id = c1_.id INNER JOIN company_persons c0_ ON c2_.id = c0_.id WHERE c0_.discr = 'manager'"
  327. );
  328. }
  329. public function testSupportsInstanceOfExpressionsUsingInputParameterInWherePart()
  330. {
  331. $this->assertSqlGeneration(
  332. "SELECT u FROM Doctrine\Tests\Models\Company\CompanyPerson u WHERE u INSTANCE OF ?1",
  333. "SELECT c0_.id AS id0, c0_.name AS name1, c0_.discr AS discr2 FROM company_persons c0_ WHERE c0_.discr = 'employee'",
  334. array(), array(1 => $this->_em->getClassMetadata('Doctrine\Tests\Models\Company\CompanyEmployee'))
  335. );
  336. }
  337. // Ticket #973
  338. public function testSupportsSingleValuedInExpressionWithoutSpacesInWherePart()
  339. {
  340. $this->assertSqlGeneration(
  341. "SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id IN(46)",
  342. "SELECT c0_.name AS name0 FROM cms_users c0_ WHERE c0_.id IN (46)"
  343. );
  344. }
  345. public function testSupportsMultipleValuedInExpressionInWherePart()
  346. {
  347. $this->assertSqlGeneration(
  348. 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id IN (1, 2)',
  349. 'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ WHERE c0_.id IN (1, 2)'
  350. );
  351. }
  352. public function testSupportsNotInExpressionInWherePart()
  353. {
  354. $this->assertSqlGeneration(
  355. 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id NOT IN (1)',
  356. 'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ WHERE c0_.id NOT IN (1)'
  357. );
  358. }
  359. public function testInExpressionWithSingleValuedAssociationPathExpressionInWherePart()
  360. {
  361. $this->assertSqlGeneration(
  362. 'SELECT u FROM Doctrine\Tests\Models\Forum\ForumUser u WHERE u.avatar IN (?1, ?2)',
  363. 'SELECT f0_.id AS id0, f0_.username AS username1 FROM forum_users f0_ WHERE f0_.avatar_id IN (?, ?)'
  364. );
  365. }
  366. public function testInvalidInExpressionWithSingleValuedAssociationPathExpressionOnInverseSide()
  367. {
  368. // We do not support SingleValuedAssociationPathExpression on inverse side
  369. $this->assertInvalidSqlGeneration(
  370. "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.address IN (?1, ?2)",
  371. "Doctrine\ORM\Query\QueryException"
  372. );
  373. }
  374. public function testSupportsConcatFunctionForMysqlAndPostgresql()
  375. {
  376. $connMock = $this->_em->getConnection();
  377. $orgPlatform = $connMock->getDatabasePlatform();
  378. $connMock->setDatabasePlatform(new \Doctrine\DBAL\Platforms\MySqlPlatform);
  379. $this->assertSqlGeneration(
  380. "SELECT u.id FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE CONCAT(u.name, 's') = ?1",
  381. "SELECT c0_.id AS id0 FROM cms_users c0_ WHERE CONCAT(c0_.name, 's') = ?"
  382. );
  383. $this->assertSqlGeneration(
  384. "SELECT CONCAT(u.id, u.name) FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = ?1",
  385. "SELECT CONCAT(c0_.id, c0_.name) AS sclr0 FROM cms_users c0_ WHERE c0_.id = ?"
  386. );
  387. $connMock->setDatabasePlatform(new \Doctrine\DBAL\Platforms\PostgreSqlPlatform);
  388. $this->assertSqlGeneration(
  389. "SELECT u.id FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE CONCAT(u.name, 's') = ?1",
  390. "SELECT c0_.id AS id0 FROM cms_users c0_ WHERE c0_.name || 's' = ?"
  391. );
  392. $this->assertSqlGeneration(
  393. "SELECT CONCAT(u.id, u.name) FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = ?1",
  394. "SELECT c0_.id || c0_.name AS sclr0 FROM cms_users c0_ WHERE c0_.id = ?"
  395. );
  396. $connMock->setDatabasePlatform($orgPlatform);
  397. }
  398. public function testSupportsExistsExpressionInWherePartWithCorrelatedSubquery()
  399. {
  400. $this->assertSqlGeneration(
  401. 'SELECT u.id FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE EXISTS (SELECT p.phonenumber FROM Doctrine\Tests\Models\CMS\CmsPhonenumber p WHERE p.phonenumber = u.id)',
  402. 'SELECT c0_.id AS id0 FROM cms_users c0_ WHERE EXISTS (SELECT c1_.phonenumber FROM cms_phonenumbers c1_ WHERE c1_.phonenumber = c0_.id)'
  403. );
  404. }
  405. /**
  406. * @group DDC-593
  407. */
  408. public function testSubqueriesInComparisonExpression()
  409. {
  410. $this->assertSqlGeneration(
  411. 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE (u.id >= (SELECT u2.id FROM Doctrine\Tests\Models\CMS\CmsUser u2 WHERE u2.name = :name)) AND (u.id <= (SELECT u3.id FROM Doctrine\Tests\Models\CMS\CmsUser u3 WHERE u3.name = :name))',
  412. 'SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ WHERE (c0_.id >= (SELECT c1_.id FROM cms_users c1_ WHERE c1_.name = ?)) AND (c0_.id <= (SELECT c2_.id FROM cms_users c2_ WHERE c2_.name = ?))'
  413. );
  414. }
  415. public function testSupportsMemberOfExpression()
  416. {
  417. // "Get all users who have $phone as a phonenumber." (*cough* doesnt really make sense...)
  418. $q1 = $this->_em->createQuery('SELECT u.id FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE :param MEMBER OF u.phonenumbers');
  419. $q1->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true);
  420. $phone = new \Doctrine\Tests\Models\CMS\CmsPhonenumber;
  421. $phone->phonenumber = 101;
  422. $q1->setParameter('param', $phone);
  423. $this->assertEquals(
  424. 'SELECT c0_.id AS id0 FROM cms_users c0_ WHERE EXISTS (SELECT 1 FROM cms_phonenumbers c1_ WHERE c0_.id = c1_.user_id AND c1_.phonenumber = ?)',
  425. $q1->getSql()
  426. );
  427. // "Get all users who are members of $group."
  428. $q2 = $this->_em->createQuery('SELECT u.id FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE :param MEMBER OF u.groups');
  429. $q2->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true);
  430. $group = new \Doctrine\Tests\Models\CMS\CmsGroup;
  431. $group->id = 101;
  432. $q2->setParameter('param', $group);
  433. $this->assertEquals(
  434. 'SELECT c0_.id AS id0 FROM cms_users c0_ WHERE EXISTS (SELECT 1 FROM cms_users_groups c1_ INNER JOIN cms_groups c2_ ON c1_.group_id = c2_.id WHERE c1_.user_id = c0_.id AND c2_.id = ?)',
  435. $q2->getSql()
  436. );
  437. // "Get all persons who have $person as a friend."
  438. // Tough one: Many-many self-referencing ("friends") with class table inheritance
  439. $q3 = $this->_em->createQuery('SELECT p FROM Doctrine\Tests\Models\Company\CompanyPerson p WHERE :param MEMBER OF p.friends');
  440. $person = new \Doctrine\Tests\Models\Company\CompanyPerson;
  441. $this->_em->getClassMetadata(get_class($person))->setIdentifierValues($person, array('id' => 101));
  442. $q3->setParameter('param', $person);
  443. $this->assertEquals(
  444. 'SELECT c0_.id AS id0, c0_.name AS name1, c1_.title AS title2, c1_.car_id AS car_id3, c2_.salary AS salary4, c2_.department AS department5, c0_.discr AS discr6, c0_.spouse_id AS spouse_id7 FROM company_persons c0_ LEFT JOIN company_managers c1_ ON c0_.id = c1_.id LEFT JOIN company_employees c2_ ON c0_.id = c2_.id WHERE EXISTS (SELECT 1 FROM company_persons_friends c3_ INNER JOIN company_persons c4_ ON c3_.friend_id = c4_.id WHERE c3_.person_id = c0_.id AND c4_.id = ?)',
  445. $q3->getSql()
  446. );
  447. }
  448. public function testSupportsCurrentDateFunction()
  449. {
  450. $q = $this->_em->createQuery('SELECT d.id FROM Doctrine\Tests\Models\Generic\DateTimeModel d WHERE d.datetime > current_date()');
  451. $q->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true);
  452. $this->assertEquals('SELECT d0_.id AS id0 FROM date_time_model d0_ WHERE d0_.col_datetime > CURRENT_DATE', $q->getSql());
  453. }
  454. public function testSupportsCurrentTimeFunction()
  455. {
  456. $q = $this->_em->createQuery('SELECT d.id FROM Doctrine\Tests\Models\Generic\DateTimeModel d WHERE d.time > current_time()');
  457. $q->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true);
  458. $this->assertEquals('SELECT d0_.id AS id0 FROM date_time_model d0_ WHERE d0_.col_time > CURRENT_TIME', $q->getSql());
  459. }
  460. public function testSupportsCurrentTimestampFunction()
  461. {
  462. $q = $this->_em->createQuery('SELECT d.id FROM Doctrine\Tests\Models\Generic\DateTimeModel d WHERE d.datetime > current_timestamp()');
  463. $q->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true);
  464. $this->assertEquals('SELECT d0_.id AS id0 FROM date_time_model d0_ WHERE d0_.col_datetime > CURRENT_TIMESTAMP', $q->getSql());
  465. }
  466. public function testExistsExpressionInWhereCorrelatedSubqueryAssocCondition()
  467. {
  468. $this->assertSqlGeneration(
  469. // DQL
  470. // The result of this query consists of all employees whose spouses are also employees.
  471. 'SELECT DISTINCT emp FROM Doctrine\Tests\Models\CMS\CmsEmployee emp
  472. WHERE EXISTS (
  473. SELECT spouseEmp
  474. FROM Doctrine\Tests\Models\CMS\CmsEmployee spouseEmp
  475. WHERE spouseEmp = emp.spouse)',
  476. // SQL
  477. 'SELECT DISTINCT c0_.id AS id0, c0_.name AS name1 FROM cms_employees c0_'
  478. . ' WHERE EXISTS ('
  479. . 'SELECT c1_.id FROM cms_employees c1_ WHERE c1_.id = c0_.spouse_id'
  480. . ')'
  481. );
  482. }
  483. public function testLimitFromQueryClass()
  484. {
  485. $q = $this->_em
  486. ->createQuery('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u')
  487. ->setMaxResults(10);
  488. $this->assertEquals('SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ LIMIT 10', $q->getSql());
  489. }
  490. public function testLimitAndOffsetFromQueryClass()
  491. {
  492. $q = $this->_em
  493. ->createQuery('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u')
  494. ->setMaxResults(10)
  495. ->setFirstResult(0);
  496. $this->assertEquals('SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ LIMIT 10 OFFSET 0', $q->getSql());
  497. }
  498. public function testSizeFunction()
  499. {
  500. $this->assertSqlGeneration(
  501. "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE SIZE(u.phonenumbers) > 1",
  502. "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ WHERE (SELECT COUNT(*) FROM cms_phonenumbers c1_ WHERE c1_.user_id = c0_.id) > 1"
  503. );
  504. }
  505. public function testSizeFunctionSupportsManyToMany()
  506. {
  507. $this->assertSqlGeneration(
  508. "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE SIZE(u.groups) > 1",
  509. "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ WHERE (SELECT COUNT(*) FROM cms_users_groups c1_ WHERE c1_.user_id = c0_.id) > 1"
  510. );
  511. }
  512. public function testEmptyCollectionComparisonExpression()
  513. {
  514. $this->assertSqlGeneration(
  515. "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.phonenumbers IS EMPTY",
  516. "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ WHERE (SELECT COUNT(*) FROM cms_phonenumbers c1_ WHERE c1_.user_id = c0_.id) = 0"
  517. );
  518. $this->assertSqlGeneration(
  519. "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.phonenumbers IS NOT EMPTY",
  520. "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ WHERE (SELECT COUNT(*) FROM cms_phonenumbers c1_ WHERE c1_.user_id = c0_.id) > 0"
  521. );
  522. }
  523. public function testNestedExpressions()
  524. {
  525. $this->assertSqlGeneration(
  526. "select u from Doctrine\Tests\Models\CMS\CmsUser u where u.id > 10 and u.id < 42 and ((u.id * 2) > 5)",
  527. "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ WHERE c0_.id > 10 AND c0_.id < 42 AND (c0_.id * 2 > 5)"
  528. );
  529. }
  530. public function testNestedExpressions2()
  531. {
  532. $this->assertSqlGeneration(
  533. "select u from Doctrine\Tests\Models\CMS\CmsUser u where (u.id > 10) and (u.id < 42 and ((u.id * 2) > 5)) or u.id <> 42",
  534. "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ WHERE (c0_.id > 10) AND (c0_.id < 42 AND (c0_.id * 2 > 5)) OR c0_.id <> 42"
  535. );
  536. }
  537. public function testNestedExpressions3()
  538. {
  539. $this->assertSqlGeneration(
  540. "select u from Doctrine\Tests\Models\CMS\CmsUser u where (u.id > 10) and (u.id between 1 and 10 or u.id in (1, 2, 3, 4, 5))",
  541. "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ WHERE (c0_.id > 10) AND (c0_.id BETWEEN 1 AND 10 OR c0_.id IN (1, 2, 3, 4, 5))"
  542. );
  543. }
  544. public function testOrderByCollectionAssociationSize()
  545. {
  546. $this->assertSqlGeneration(
  547. "select u, size(u.articles) as numArticles from Doctrine\Tests\Models\CMS\CmsUser u order by numArticles",
  548. "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3, (SELECT COUNT(*) FROM cms_articles c1_ WHERE c1_.user_id = c0_.id) AS sclr4 FROM cms_users c0_ ORDER BY sclr4 ASC"
  549. );
  550. }
  551. public function testBooleanLiteralInWhereOnSqlite()
  552. {
  553. $oldPlat = $this->_em->getConnection()->getDatabasePlatform();
  554. $this->_em->getConnection()->setDatabasePlatform(new \Doctrine\DBAL\Platforms\SqlitePlatform);
  555. $this->assertSqlGeneration(
  556. "SELECT b FROM Doctrine\Tests\Models\Generic\BooleanModel b WHERE b.booleanField = true",
  557. "SELECT b0_.id AS id0, b0_.booleanField AS booleanField1 FROM boolean_model b0_ WHERE b0_.booleanField = 1"
  558. );
  559. $this->assertSqlGeneration(
  560. "SELECT b FROM Doctrine\Tests\Models\Generic\BooleanModel b WHERE b.booleanField = false",
  561. "SELECT b0_.id AS id0, b0_.booleanField AS booleanField1 FROM boolean_model b0_ WHERE b0_.booleanField = 0"
  562. );
  563. $this->_em->getConnection()->setDatabasePlatform($oldPlat);
  564. }
  565. public function testBooleanLiteralInWhereOnPostgres()
  566. {
  567. $oldPlat = $this->_em->getConnection()->getDatabasePlatform();
  568. $this->_em->getConnection()->setDatabasePlatform(new \Doctrine\DBAL\Platforms\PostgreSqlPlatform);
  569. $this->assertSqlGeneration(
  570. "SELECT b FROM Doctrine\Tests\Models\Generic\BooleanModel b WHERE b.booleanField = true",
  571. "SELECT b0_.id AS id0, b0_.booleanField AS booleanField1 FROM boolean_model b0_ WHERE b0_.booleanField = 'true'"
  572. );
  573. $this->assertSqlGeneration(
  574. "SELECT b FROM Doctrine\Tests\Models\Generic\BooleanModel b WHERE b.booleanField = false",
  575. "SELECT b0_.id AS id0, b0_.booleanField AS booleanField1 FROM boolean_model b0_ WHERE b0_.booleanField = 'false'"
  576. );
  577. $this->_em->getConnection()->setDatabasePlatform($oldPlat);
  578. }
  579. public function testSingleValuedAssociationFieldInWhere()
  580. {
  581. $this->assertSqlGeneration(
  582. "SELECT p FROM Doctrine\Tests\Models\CMS\CmsPhonenumber p WHERE p.user = ?1",
  583. "SELECT c0_.phonenumber AS phonenumber0 FROM cms_phonenumbers c0_ WHERE c0_.user_id = ?"
  584. );
  585. }
  586. public function testSingleValuedAssociationNullCheckOnOwningSide()
  587. {
  588. $this->assertSqlGeneration(
  589. "SELECT a FROM Doctrine\Tests\Models\CMS\CmsAddress a WHERE a.user IS NULL",
  590. "SELECT c0_.id AS id0, c0_.country AS country1, c0_.zip AS zip2, c0_.city AS city3 FROM cms_addresses c0_ WHERE c0_.user_id IS NULL"
  591. );
  592. }
  593. // Null check on inverse side has to happen through explicit JOIN.
  594. // "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.address IS NULL"
  595. // where the CmsUser is the inverse side is not supported.
  596. public function testSingleValuedAssociationNullCheckOnInverseSide()
  597. {
  598. $this->assertSqlGeneration(
  599. "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u LEFT JOIN u.address a WHERE a.id IS NULL",
  600. "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ LEFT JOIN cms_addresses c1_ ON c0_.id = c1_.user_id WHERE c1_.id IS NULL"
  601. );
  602. }
  603. /**
  604. * @group DDC-339
  605. */
  606. public function testStringFunctionLikeExpression()
  607. {
  608. $this->assertSqlGeneration(
  609. "SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE LOWER(u.name) LIKE '%foo OR bar%'",
  610. "SELECT c0_.name AS name0 FROM cms_users c0_ WHERE LOWER(c0_.name) LIKE '%foo OR bar%'"
  611. );
  612. $this->assertSqlGeneration(
  613. "SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE LOWER(u.name) LIKE :str",
  614. "SELECT c0_.name AS name0 FROM cms_users c0_ WHERE LOWER(c0_.name) LIKE ?"
  615. );
  616. $this->assertSqlGeneration(
  617. "SELECT u.name FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE CONCAT(UPPER(u.name), '_moo') LIKE :str",
  618. "SELECT c0_.name AS name0 FROM cms_users c0_ WHERE UPPER(c0_.name) || '_moo' LIKE ?"
  619. );
  620. }
  621. /**
  622. * @group DDC-338
  623. */
  624. public function testOrderedCollectionFetchJoined()
  625. {
  626. $this->assertSqlGeneration(
  627. "SELECT r, l FROM Doctrine\Tests\Models\Routing\RoutingRoute r JOIN r.legs l",
  628. "SELECT r0_.id AS id0, r1_.id AS id1, r1_.departureDate AS departureDate2, r1_.arrivalDate AS arrivalDate3 FROM RoutingRoute r0_ INNER JOIN RoutingRouteLegs r2_ ON r0_.id = r2_.route_id INNER JOIN RoutingLeg r1_ ON r1_.id = r2_.leg_id ".
  629. "ORDER BY r1_.departureDate ASC"
  630. );
  631. }
  632. public function testSubselectInSelect()
  633. {
  634. $this->assertSqlGeneration(
  635. "SELECT u.name, (SELECT COUNT(p.phonenumber) FROM Doctrine\Tests\Models\CMS\CmsPhonenumber p WHERE p.phonenumber = 1234) pcount FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.name = 'jon'",
  636. "SELECT c0_.name AS name0, (SELECT COUNT(c1_.phonenumber) AS dctrn__1 FROM cms_phonenumbers c1_ WHERE c1_.phonenumber = 1234) AS sclr1 FROM cms_users c0_ WHERE c0_.name = 'jon'"
  637. );
  638. }
  639. /**
  640. * @group locking
  641. * @group DDC-178
  642. */
  643. public function testPessimisticWriteLockQueryHint()
  644. {
  645. if ($this->_em->getConnection()->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\SqlitePlatform) {
  646. $this->markTestSkipped('SqLite does not support Row locking at all.');
  647. }
  648. $this->assertSqlGeneration(
  649. "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.username = 'gblanco'",
  650. "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 ".
  651. "FROM cms_users c0_ WHERE c0_.username = 'gblanco' FOR UPDATE",
  652. array(Query::HINT_LOCK_MODE => \Doctrine\DBAL\LockMode::PESSIMISTIC_WRITE)
  653. );
  654. }
  655. /**
  656. * @group locking
  657. * @group DDC-178
  658. */
  659. public function testPessimisticReadLockQueryHintPostgreSql()
  660. {
  661. $this->_em->getConnection()->setDatabasePlatform(new \Doctrine\DBAL\Platforms\PostgreSqlPlatform);
  662. $this->assertSqlGeneration(
  663. "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.username = 'gblanco'",
  664. "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 ".
  665. "FROM cms_users c0_ WHERE c0_.username = 'gblanco' FOR SHARE",
  666. array(Query::HINT_LOCK_MODE => \Doctrine\DBAL\LockMode::PESSIMISTIC_READ)
  667. );
  668. }
  669. /**
  670. * @group DDC-430
  671. */
  672. public function testSupportSelectWithMoreThan10InputParameters()
  673. {
  674. $this->assertSqlGeneration(
  675. "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = ?1 OR u.id = ?2 OR u.id = ?3 OR u.id = ?4 OR u.id = ?5 OR u.id = ?6 OR u.id = ?7 OR u.id = ?8 OR u.id = ?9 OR u.id = ?10 OR u.id = ?11",
  676. "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 FROM cms_users c0_ WHERE c0_.id = ? OR c0_.id = ? OR c0_.id = ? OR c0_.id = ? OR c0_.id = ? OR c0_.id = ? OR c0_.id = ? OR c0_.id = ? OR c0_.id = ? OR c0_.id = ? OR c0_.id = ?"
  677. );
  678. }
  679. /**
  680. * @group locking
  681. * @group DDC-178
  682. */
  683. public function testPessimisticReadLockQueryHintMySql()
  684. {
  685. $this->_em->getConnection()->setDatabasePlatform(new \Doctrine\DBAL\Platforms\MySqlPlatform);
  686. $this->assertSqlGeneration(
  687. "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.username = 'gblanco'",
  688. "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 ".
  689. "FROM cms_users c0_ WHERE c0_.username = 'gblanco' LOCK IN SHARE MODE",
  690. array(Query::HINT_LOCK_MODE => \Doctrine\DBAL\LockMode::PESSIMISTIC_READ)
  691. );
  692. }
  693. /**
  694. * @group locking
  695. * @group DDC-178
  696. */
  697. public function testPessimisticReadLockQueryHintOracle()
  698. {
  699. $this->_em->getConnection()->setDatabasePlatform(new \Doctrine\DBAL\Platforms\OraclePlatform);
  700. $this->assertSqlGeneration(
  701. "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.username = 'gblanco'",
  702. "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 ".
  703. "FROM cms_users c0_ WHERE c0_.username = 'gblanco' FOR UPDATE",
  704. array(Query::HINT_LOCK_MODE => \Doctrine\DBAL\LockMode::PESSIMISTIC_READ)
  705. );
  706. }
  707. /**
  708. * @group DDC-431
  709. */
  710. public function testSupportToCustomDQLFunctions()
  711. {
  712. $config = $this->_em->getConfiguration();
  713. $config->addCustomNumericFunction('MYABS', 'Doctrine\Tests\ORM\Query\MyAbsFunction');
  714. $this->assertSqlGeneration(
  715. 'SELECT MYABS(p.phonenumber) FROM Doctrine\Tests\Models\CMS\CmsPhonenumber p',
  716. 'SELECT ABS(c0_.phonenumber) AS sclr0 FROM cms_phonenumbers c0_'
  717. );
  718. $config->setCustomNumericFunctions(array());
  719. }
  720. /**
  721. * @group DDC-826
  722. */
  723. public function testMappedSuperclassAssociationJoin()
  724. {
  725. $this->assertSqlGeneration(
  726. 'SELECT f FROM Doctrine\Tests\Models\DirectoryTree\File f JOIN f.parentDirectory d WHERE f.id = ?1',
  727. 'SELECT f0_.id AS id0, f0_.extension AS extension1, f0_.name AS name2 FROM "file" f0_ INNER JOIN Directory d1_ ON f0_.parentDirectory_id = d1_.id WHERE f0_.id = ?'
  728. );
  729. }
  730. }
  731. class MyAbsFunction extends \Doctrine\ORM\Query\AST\Functions\FunctionNode
  732. {
  733. public $simpleArithmeticExpression;
  734. /**
  735. * @override
  736. */
  737. public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
  738. {
  739. return 'ABS(' . $sqlWalker->walkSimpleArithmeticExpression(
  740. $this->simpleArithmeticExpression
  741. ) . ')';
  742. }
  743. /**
  744. * @override
  745. */
  746. public function parse(\Doctrine\ORM\Query\Parser $parser)
  747. {
  748. $lexer = $parser->getLexer();
  749. $parser->match(\Doctrine\ORM\Query\Lexer::T_IDENTIFIER);
  750. $parser->match(\Doctrine\ORM\Query\Lexer::T_OPEN_PARENTHESIS);
  751. $this->simpleArithmeticExpression = $parser->SimpleArithmeticExpression();
  752. $parser->match(\Doctrine\ORM\Query\Lexer::T_CLOSE_PARENTHESIS);
  753. }
  754. }