PageRenderTime 53ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 1ms

/propel/propel/test/testsuite/generator/builder/om/QueryBuilderTest.php

https://github.com/jbroadway/php-dbal-bench
PHP | 1116 lines | 896 code | 189 blank | 31 comment | 3 complexity | 67d19df274c5bf5144dfacbda20581a8 MD5 | raw file
Possible License(s): LGPL-2.1

Large files files are truncated, but you can click here to view the full file

  1. <?php
  2. /**
  3. * This file is part of the Propel package.
  4. * For the full copyright and license information, please view the LICENSE
  5. * file that was distributed with this source code.
  6. *
  7. * @license MIT License
  8. */
  9. require_once dirname(__FILE__) . '/../../../../tools/helpers/bookstore/BookstoreTestBase.php';
  10. require_once dirname(__FILE__) . '/../../../../tools/helpers/bookstore/BookstoreDataPopulator.php';
  11. /**
  12. * Test class for QueryBuilder.
  13. *
  14. * @author Franรงois Zaninotto
  15. * @version $Id: QueryBuilderTest.php 1347 2009-12-03 21:06:36Z francois $
  16. * @package generator.builder.om
  17. */
  18. class QueryBuilderTest extends BookstoreTestBase
  19. {
  20. public function testExtends()
  21. {
  22. $q = new BookQuery();
  23. $this->assertTrue($q instanceof ModelCriteria, 'Model query extends ModelCriteria');
  24. }
  25. public function testConstructor()
  26. {
  27. $query = new BookQuery();
  28. $this->assertEquals($query->getDbName(), 'bookstore', 'Constructor sets dabatase name');
  29. $this->assertEquals($query->getModelName(), 'Book', 'Constructor sets model name');
  30. }
  31. public function testCreate()
  32. {
  33. $query = BookQuery::create();
  34. $this->assertTrue($query instanceof BookQuery, 'create() returns an object of its class');
  35. $this->assertEquals($query->getDbName(), 'bookstore', 'create() sets dabatase name');
  36. $this->assertEquals($query->getModelName(), 'Book', 'create() sets model name');
  37. $query = BookQuery::create('foo');
  38. $this->assertTrue($query instanceof BookQuery, 'create() returns an object of its class');
  39. $this->assertEquals($query->getDbName(), 'bookstore', 'create() sets dabatase name');
  40. $this->assertEquals($query->getModelName(), 'Book', 'create() sets model name');
  41. $this->assertEquals($query->getModelAlias(), 'foo', 'create() can set the model alias');
  42. }
  43. public function testCreateCustom()
  44. {
  45. // see the myBookQuery class definition at the end of this file
  46. $query = myCustomBookQuery::create();
  47. $this->assertTrue($query instanceof myCustomBookQuery, 'create() returns an object of its class');
  48. $this->assertTrue($query instanceof BookQuery, 'create() returns an object of its class');
  49. $this->assertEquals($query->getDbName(), 'bookstore', 'create() sets dabatase name');
  50. $this->assertEquals($query->getModelName(), 'Book', 'create() sets model name');
  51. $query = myCustomBookQuery::create('foo');
  52. $this->assertTrue($query instanceof myCustomBookQuery, 'create() returns an object of its class');
  53. $this->assertEquals($query->getDbName(), 'bookstore', 'create() sets dabatase name');
  54. $this->assertEquals($query->getModelName(), 'Book', 'create() sets model name');
  55. $this->assertEquals($query->getModelAlias(), 'foo', 'create() can set the model alias');
  56. }
  57. public function testBasePreSelect()
  58. {
  59. $method = new ReflectionMethod('Table2Query', 'basePreSelect');
  60. $this->assertEquals('ModelCriteria', $method->getDeclaringClass()->getName(), 'BaseQuery does not override basePreSelect() by default');
  61. $method = new ReflectionMethod('Table3Query', 'basePreSelect');
  62. $this->assertEquals('BaseTable3Query', $method->getDeclaringClass()->getName(), 'BaseQuery overrides basePreSelect() when a behavior is registered');
  63. }
  64. public function testBasePreDelete()
  65. {
  66. $method = new ReflectionMethod('Table2Query', 'basePreDelete');
  67. $this->assertEquals('ModelCriteria', $method->getDeclaringClass()->getName(), 'BaseQuery does not override basePreDelete() by default');
  68. $method = new ReflectionMethod('Table3Query', 'basePreDelete');
  69. $this->assertEquals('BaseTable3Query', $method->getDeclaringClass()->getName(), 'BaseQuery overrides basePreDelete() when a behavior is registered');
  70. }
  71. public function testBasePostDelete()
  72. {
  73. $method = new ReflectionMethod('Table2Query', 'basePostDelete');
  74. $this->assertEquals('ModelCriteria', $method->getDeclaringClass()->getName(), 'BaseQuery does not override basePostDelete() by default');
  75. $method = new ReflectionMethod('Table3Query', 'basePostDelete');
  76. $this->assertEquals('BaseTable3Query', $method->getDeclaringClass()->getName(), 'BaseQuery overrides basePostDelete() when a behavior is registered');
  77. }
  78. public function testBasePreUpdate()
  79. {
  80. $method = new ReflectionMethod('Table2Query', 'basePreUpdate');
  81. $this->assertEquals('ModelCriteria', $method->getDeclaringClass()->getName(), 'BaseQuery does not override basePreUpdate() by default');
  82. $method = new ReflectionMethod('Table3Query', 'basePreUpdate');
  83. $this->assertEquals('BaseTable3Query', $method->getDeclaringClass()->getName(), 'BaseQuery overrides basePreUpdate() when a behavior is registered');
  84. }
  85. public function testBasePostUpdate()
  86. {
  87. $method = new ReflectionMethod('Table2Query', 'basePostUpdate');
  88. $this->assertEquals('ModelCriteria', $method->getDeclaringClass()->getName(), 'BaseQuery does not override basePostUpdate() by default');
  89. $method = new ReflectionMethod('Table3Query', 'basePostUpdate');
  90. $this->assertEquals('BaseTable3Query', $method->getDeclaringClass()->getName(), 'BaseQuery overrides basePostUpdate() when a behavior is registered');
  91. }
  92. public function testQuery()
  93. {
  94. BookstoreDataPopulator::depopulate();
  95. BookstoreDataPopulator::populate();
  96. $q = new BookQuery();
  97. $book = $q
  98. ->setModelAlias('b')
  99. ->where('b.Title like ?', 'Don%')
  100. ->orderBy('b.ISBN', 'desc')
  101. ->findOne();
  102. $this->assertTrue($book instanceof Book);
  103. $this->assertEquals('Don Juan', $book->getTitle());
  104. }
  105. public function testFindPk()
  106. {
  107. $method = new ReflectionMethod('Table4Query', 'findPk');
  108. $this->assertEquals('BaseTable4Query', $method->getDeclaringClass()->getName(), 'BaseQuery overrides findPk()');
  109. }
  110. public function testFindOneById()
  111. {
  112. $method = new ReflectionMethod('Table4Query', 'findOneById');
  113. $this->assertEquals('BaseTable4Query', $method->getDeclaringClass()->getName(), 'BaseQuery overrides findOneById()');
  114. }
  115. public function testFindPkReturnsCorrectObjectForSimplePrimaryKey()
  116. {
  117. $b = new Book();
  118. $b->setTitle('bar');
  119. $b->save($this->con);
  120. $count = $this->con->getQueryCount();
  121. BookPeer::clearInstancePool();
  122. $book = BookQuery::create()->findPk($b->getId(), $this->con);
  123. $this->assertEquals($b, $book);
  124. $this->assertEquals($count+1, $this->con->getQueryCount(), 'findPk() issues a database query when instance is not in pool');
  125. }
  126. public function testFindPkUsesInstancePoolingForSimplePrimaryKey()
  127. {
  128. $b = new Book();
  129. $b->setTitle('foo');
  130. $b->save($this->con);
  131. $count = $this->con->getQueryCount();
  132. $book = BookQuery::create()->findPk($b->getId(), $this->con);
  133. $this->assertSame($b, $book);
  134. $this->assertEquals($count, $this->con->getQueryCount(), 'findPk() does not issue a database query when instance is in pool');
  135. }
  136. public function testFindPkReturnsCorrectObjectForCompositePrimaryKey()
  137. {
  138. BookstoreDataPopulator::depopulate();
  139. BookstoreDataPopulator::populate();
  140. // save all books to make sure related objects are also saved - BookstoreDataPopulator keeps some unsaved
  141. $c = new ModelCriteria('bookstore', 'Book');
  142. $books = $c->find();
  143. foreach ($books as $book) {
  144. $book->save();
  145. }
  146. BookPeer::clearInstancePool();
  147. // retrieve the test data
  148. $c = new ModelCriteria('bookstore', 'BookListRel');
  149. $bookListRelTest = $c->findOne();
  150. $pk = $bookListRelTest->getPrimaryKey();
  151. $q = new BookListRelQuery();
  152. $bookListRel = $q->findPk($pk);
  153. $this->assertEquals($bookListRelTest, $bookListRel, 'BaseQuery overrides findPk() for composite primary keysto make it faster');
  154. }
  155. public function testFindPkUsesFindPkSimpleOnEmptyQueries()
  156. {
  157. BookQuery::create()->findPk(123, $this->con);
  158. $expected = 'SELECT ID, TITLE, ISBN, PRICE, PUBLISHER_ID, AUTHOR_ID FROM book WHERE ID = 123';
  159. $this->assertEquals($expected, $this->con->getLastExecutedQuery());
  160. }
  161. public function testFindPkSimpleAddsObjectToInstancePool()
  162. {
  163. $b = new Book();
  164. $b->setTitle('foo');
  165. $b->save($this->con);
  166. BookPeer::clearInstancePool();
  167. BookQuery::create()->findPk($b->getId(), $this->con);
  168. $count = $this->con->getQueryCount();
  169. $book = BookQuery::create()->findPk($b->getId(), $this->con);
  170. $this->assertEquals($b, $book);
  171. $this->assertEquals($count, $this->con->getQueryCount());
  172. }
  173. public function testFindOneByIdAddsObjectToInstancePool()
  174. {
  175. $b = new Book();
  176. $b->setTitle('foo');
  177. $b->save($this->con);
  178. BookPeer::clearInstancePool();
  179. BookQuery::create()->findOneById($b->getId(), $this->con);
  180. $count = $this->con->getQueryCount();
  181. $book = BookQuery::create()->findOneById($b->getId(), $this->con);
  182. $this->assertEquals($b, $book);
  183. $this->assertEquals($count, $this->con->getQueryCount());
  184. }
  185. public function testFindPkUsesFindPkComplexOnNonEmptyQueries()
  186. {
  187. BookQuery::create('b')->findPk(123, $this->con);
  188. $expected = 'SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID FROM `book` WHERE book.ID=123';
  189. $this->assertEquals($expected, $this->con->getLastExecutedQuery());
  190. }
  191. public function testFindPkComplexAddsObjectToInstancePool()
  192. {
  193. $b = new Book();
  194. $b->setTitle('foo');
  195. $b->save($this->con);
  196. BookPeer::clearInstancePool();
  197. BookQuery::create('b')->findPk($b->getId(), $this->con);
  198. $count = $this->con->getQueryCount();
  199. $book = BookQuery::create()->findPk($b->getId(), $this->con);
  200. $this->assertEquals($b, $book);
  201. $this->assertEquals($count, $this->con->getQueryCount());
  202. }
  203. public function testFindPkCallsPreSelect()
  204. {
  205. $q = new mySecondBookQuery();
  206. $this->assertFalse($q::$preSelectWasCalled);
  207. $q->findPk(123);
  208. $this->assertTrue($q::$preSelectWasCalled);
  209. }
  210. public function testFindPkDoesNotCallPreSelectWhenUsingInstancePool()
  211. {
  212. $b = new Book();
  213. $b->setTitle('foo');
  214. $b->save();
  215. $q = new mySecondBookQuery();
  216. $this->assertFalse($q::$preSelectWasCalled);
  217. $q->findPk($b->getId());
  218. $this->assertFalse($q::$preSelectWasCalled);
  219. }
  220. public function testFindPks()
  221. {
  222. $method = new ReflectionMethod('Table4Query', 'findPks');
  223. $this->assertEquals('BaseTable4Query', $method->getDeclaringClass()->getName(), 'BaseQuery overrides findPks()');
  224. }
  225. public function testFindPksSimpleKey()
  226. {
  227. BookstoreDataPopulator::depopulate();
  228. BookstoreDataPopulator::populate();
  229. BookPeer::clearInstancePool();
  230. // prepare the test data
  231. $c = new ModelCriteria('bookstore', 'Book');
  232. $c->orderBy('Book.Id', 'desc');
  233. $testBooks = $c->find();
  234. $testBook1 = $testBooks->pop();
  235. $testBook2 = $testBooks->pop();
  236. $q = new BookQuery();
  237. $books = $q->findPks(array($testBook1->getId(), $testBook2->getId()));
  238. $this->assertEquals(array($testBook1, $testBook2), $books->getData(), 'BaseQuery overrides findPks() to make it faster');
  239. }
  240. public function testFindPksCompositeKey()
  241. {
  242. BookstoreDataPopulator::depopulate();
  243. BookstoreDataPopulator::populate();
  244. // save all books to make sure related objects are also saved - BookstoreDataPopulator keeps some unsaved
  245. $c = new ModelCriteria('bookstore', 'Book');
  246. $books = $c->find();
  247. foreach ($books as $book) {
  248. $book->save();
  249. }
  250. BookPeer::clearInstancePool();
  251. // retrieve the test data
  252. $c = new ModelCriteria('bookstore', 'BookListRel');
  253. $bookListRelTest = $c->find();
  254. $search = array();
  255. foreach ($bookListRelTest as $obj) {
  256. $search[]= $obj->getPrimaryKey();
  257. }
  258. $q = new BookListRelQuery();
  259. $objs = $q->findPks($search);
  260. $this->assertEquals($bookListRelTest, $objs, 'BaseQuery overrides findPks() for composite primary keys to make it work');
  261. }
  262. public function testFilterBy()
  263. {
  264. foreach (BookPeer::getFieldNames(BasePeer::TYPE_PHPNAME) as $colName) {
  265. $filterMethod = 'filterBy' . $colName;
  266. $this->assertTrue(method_exists('BookQuery', $filterMethod), 'QueryBuilder adds filterByColumn() methods for every column');
  267. $q = BookQuery::create()->$filterMethod(1);
  268. $this->assertTrue($q instanceof BookQuery, 'filterByColumn() returns the current query instance');
  269. }
  270. }
  271. public function testFilterByPrimaryKeySimpleKey()
  272. {
  273. $q = BookQuery::create()->filterByPrimaryKey(12);
  274. $q1 = BookQuery::create()->add(BookPeer::ID, 12, Criteria::EQUAL);
  275. $this->assertEquals($q1, $q, 'filterByPrimaryKey() translates to a Criteria::EQUAL in the PK column');
  276. $q = BookQuery::create()->setModelAlias('b', true)->filterByPrimaryKey(12);
  277. $q1 = BookQuery::create()->setModelAlias('b', true)->add('b.ID', 12, Criteria::EQUAL);
  278. $this->assertEquals($q1, $q, 'filterByPrimaryKey() uses true table alias if set');
  279. }
  280. public function testFilterByPrimaryKeyCompositeKey()
  281. {
  282. BookstoreDataPopulator::depopulate();
  283. BookstoreDataPopulator::populate();
  284. // save all books to make sure related objects are also saved - BookstoreDataPopulator keeps some unsaved
  285. $c = new ModelCriteria('bookstore', 'Book');
  286. $books = $c->find();
  287. foreach ($books as $book) {
  288. $book->save();
  289. }
  290. BookPeer::clearInstancePool();
  291. // retrieve the test data
  292. $c = new ModelCriteria('bookstore', 'BookListRel');
  293. $bookListRelTest = $c->findOne();
  294. $pk = $bookListRelTest->getPrimaryKey();
  295. $q = new BookListRelQuery();
  296. $q->filterByPrimaryKey($pk);
  297. $q1 = BookListRelQuery::create()
  298. ->add(BookListRelPeer::BOOK_ID, $pk[0], Criteria::EQUAL)
  299. ->add(BookListRelPeer::BOOK_CLUB_LIST_ID, $pk[1], Criteria::EQUAL);
  300. $this->assertEquals($q1, $q, 'filterByPrimaryKey() translates to a Criteria::EQUAL in the PK columns');
  301. }
  302. public function testFilterByPrimaryKeysSimpleKey()
  303. {
  304. $q = BookQuery::create()->filterByPrimaryKeys(array(10, 11, 12));
  305. $q1 = BookQuery::create()->add(BookPeer::ID, array(10, 11, 12), Criteria::IN);
  306. $this->assertEquals($q1, $q, 'filterByPrimaryKeys() translates to a Criteria::IN on the PK column');
  307. $q = BookQuery::create()->setModelAlias('b', true)->filterByPrimaryKeys(array(10, 11, 12));
  308. $q1 = BookQuery::create()->setModelAlias('b', true)->add('b.ID', array(10, 11, 12), Criteria::IN);
  309. $this->assertEquals($q1, $q, 'filterByPrimaryKeys() uses true table alias if set');
  310. }
  311. public function testFilterByPrimaryKeysCompositeKey()
  312. {
  313. BookstoreDataPopulator::depopulate();
  314. BookstoreDataPopulator::populate();
  315. // save all books to make sure related objects are also saved - BookstoreDataPopulator keeps some unsaved
  316. $c = new ModelCriteria('bookstore', 'Book');
  317. $books = $c->find();
  318. foreach ($books as $book) {
  319. $book->save();
  320. }
  321. BookPeer::clearInstancePool();
  322. // retrieve the test data
  323. $c = new ModelCriteria('bookstore', 'BookListRel');
  324. $bookListRelTest = $c->find();
  325. $search = array();
  326. foreach ($bookListRelTest as $obj) {
  327. $search[]= $obj->getPrimaryKey();
  328. }
  329. $q = new BookListRelQuery();
  330. $q->filterByPrimaryKeys($search);
  331. $q1 = BookListRelQuery::create();
  332. foreach ($search as $key) {
  333. $cton0 = $q1->getNewCriterion(BookListRelPeer::BOOK_ID, $key[0], Criteria::EQUAL);
  334. $cton1 = $q1->getNewCriterion(BookListRelPeer::BOOK_CLUB_LIST_ID, $key[1], Criteria::EQUAL);
  335. $cton0->addAnd($cton1);
  336. $q1->addOr($cton0);
  337. }
  338. $this->assertEquals($q1, $q, 'filterByPrimaryKeys() translates to a series of Criteria::EQUAL in the PK columns');
  339. $q = new BookListRelQuery();
  340. $q->filterByPrimaryKeys(array());
  341. $q1 = BookListRelQuery::create();
  342. $q1->add(null, '1<>1', Criteria::CUSTOM);
  343. $this->assertEquals($q1, $q, 'filterByPrimaryKeys() translates to an always failing test on empty arrays');
  344. }
  345. public function testFilterByIntegerPk()
  346. {
  347. $q = BookQuery::create()->filterById(12);
  348. $q1 = BookQuery::create()->add(BookPeer::ID, 12, Criteria::EQUAL);
  349. $this->assertEquals($q1, $q, 'filterByPkColumn() translates to a Criteria::EQUAL by default');
  350. $q = BookQuery::create()->filterById(12, Criteria::NOT_EQUAL);
  351. $q1 = BookQuery::create()->add(BookPeer::ID, 12, Criteria::NOT_EQUAL);
  352. $this->assertEquals($q1, $q, 'filterByPkColumn() accepts an optional comparison operator');
  353. $q = BookQuery::create()->setModelAlias('b', true)->filterById(12);
  354. $q1 = BookQuery::create()->setModelAlias('b', true)->add('b.ID', 12, Criteria::EQUAL);
  355. $this->assertEquals($q1, $q, 'filterByPkColumn() uses true table alias if set');
  356. $q = BookQuery::create()->filterById(array(10, 11, 12));
  357. $q1 = BookQuery::create()->add(BookPeer::ID, array(10, 11, 12), Criteria::IN);
  358. $this->assertEquals($q1, $q, 'filterByPkColumn() translates to a Criteria::IN when passed a simple array key');
  359. $q = BookQuery::create()->filterById(array(10, 11, 12), Criteria::NOT_IN);
  360. $q1 = BookQuery::create()->add(BookPeer::ID, array(10, 11, 12), Criteria::NOT_IN);
  361. $this->assertEquals($q1, $q, 'filterByPkColumn() accepts a comparison when passed a simple array key');
  362. }
  363. public function testFilterByNumber()
  364. {
  365. $q = BookQuery::create()->filterByPrice(12);
  366. $q1 = BookQuery::create()->add(BookPeer::PRICE, 12, Criteria::EQUAL);
  367. $this->assertEquals($q1, $q, 'filterByNumColumn() translates to a Criteria::EQUAL by default');
  368. $q = BookQuery::create()->filterByPrice(12, Criteria::NOT_EQUAL);
  369. $q1 = BookQuery::create()->add(BookPeer::PRICE, 12, Criteria::NOT_EQUAL);
  370. $this->assertEquals($q1, $q, 'filterByNumColumn() accepts an optional comparison operator');
  371. $q = BookQuery::create()->setModelAlias('b', true)->filterByPrice(12);
  372. $q1 = BookQuery::create()->setModelAlias('b', true)->add('b.PRICE', 12, Criteria::EQUAL);
  373. $this->assertEquals($q1, $q, 'filterByNumColumn() uses true table alias if set');
  374. $q = BookQuery::create()->filterByPrice(array(10, 11, 12));
  375. $q1 = BookQuery::create()->add(BookPeer::PRICE, array(10, 11, 12), Criteria::IN);
  376. $this->assertEquals($q1, $q, 'filterByNumColumn() translates to a Criteria::IN when passed a simple array key');
  377. $q = BookQuery::create()->filterByPrice(array(10, 11, 12), Criteria::NOT_IN);
  378. $q1 = BookQuery::create()->add(BookPeer::PRICE, array(10, 11, 12), Criteria::NOT_IN);
  379. $this->assertEquals($q1, $q, 'filterByNumColumn() accepts a comparison when passed a simple array key');
  380. $q = BookQuery::create()->filterByPrice(array('min' => 10));
  381. $q1 = BookQuery::create()->add(BookPeer::PRICE, 10, Criteria::GREATER_EQUAL);
  382. $this->assertEquals($q1, $q, 'filterByNumColumn() translates to a Criteria::GREATER_EQUAL when passed a \'min\' key');
  383. $q = BookQuery::create()->filterByPrice(array('max' => 12));
  384. $q1 = BookQuery::create()->add(BookPeer::PRICE, 12, Criteria::LESS_EQUAL);
  385. $this->assertEquals($q1, $q, 'filterByNumColumn() translates to a Criteria::LESS_EQUAL when passed a \'max\' key');
  386. $q = BookQuery::create()->filterByPrice(array('min' => 10, 'max' => 12));
  387. $q1 = BookQuery::create()
  388. ->add(BookPeer::PRICE, 10, Criteria::GREATER_EQUAL)
  389. ->addAnd(BookPeer::PRICE, 12, Criteria::LESS_EQUAL);
  390. $this->assertEquals($q1, $q, 'filterByNumColumn() translates to a between when passed both a \'min\' and a \'max\' key');
  391. }
  392. public function testFilterByTimestamp()
  393. {
  394. $q = BookstoreEmployeeAccountQuery::create()->filterByCreated(12);
  395. $q1 = BookstoreEmployeeAccountQuery::create()->add(BookstoreEmployeeAccountPeer::CREATED, 12, Criteria::EQUAL);
  396. $this->assertEquals($q1, $q, 'filterByDateColumn() translates to a Criteria::EQUAL by default');
  397. $q = BookstoreEmployeeAccountQuery::create()->filterByCreated(12, Criteria::NOT_EQUAL);
  398. $q1 = BookstoreEmployeeAccountQuery::create()->add(BookstoreEmployeeAccountPeer::CREATED, 12, Criteria::NOT_EQUAL);
  399. $this->assertEquals($q1, $q, 'filterByDateColumn() accepts an optional comparison operator');
  400. $q = BookstoreEmployeeAccountQuery::create()->setModelAlias('b', true)->filterByCreated(12);
  401. $q1 = BookstoreEmployeeAccountQuery::create()->setModelAlias('b', true)->add('b.CREATED', 12, Criteria::EQUAL);
  402. $this->assertEquals($q1, $q, 'filterByDateColumn() uses true table alias if set');
  403. $q = BookstoreEmployeeAccountQuery::create()->filterByCreated(array('min' => 10));
  404. $q1 = BookstoreEmployeeAccountQuery::create()->add(BookstoreEmployeeAccountPeer::CREATED, 10, Criteria::GREATER_EQUAL);
  405. $this->assertEquals($q1, $q, 'filterByDateColumn() translates to a Criteria::GREATER_EQUAL when passed a \'min\' key');
  406. $q = BookstoreEmployeeAccountQuery::create()->filterByCreated(array('max' => 12));
  407. $q1 = BookstoreEmployeeAccountQuery::create()->add(BookstoreEmployeeAccountPeer::CREATED, 12, Criteria::LESS_EQUAL);
  408. $this->assertEquals($q1, $q, 'filterByDateColumn() translates to a Criteria::LESS_EQUAL when passed a \'max\' key');
  409. $q = BookstoreEmployeeAccountQuery::create()->filterByCreated(array('min' => 10, 'max' => 12));
  410. $q1 = BookstoreEmployeeAccountQuery::create()
  411. ->add(BookstoreEmployeeAccountPeer::CREATED, 10, Criteria::GREATER_EQUAL)
  412. ->addAnd(BookstoreEmployeeAccountPeer::CREATED, 12, Criteria::LESS_EQUAL);
  413. $this->assertEquals($q1, $q, 'filterByDateColumn() translates to a between when passed both a \'min\' and a \'max\' key');
  414. }
  415. public function testFilterByString()
  416. {
  417. $q = BookQuery::create()->filterByTitle('foo');
  418. $q1 = BookQuery::create()->add(BookPeer::TITLE, 'foo', Criteria::EQUAL);
  419. $this->assertEquals($q1, $q, 'filterByStringColumn() translates to a Criteria::EQUAL by default');
  420. $q = BookQuery::create()->filterByTitle('foo', Criteria::NOT_EQUAL);
  421. $q1 = BookQuery::create()->add(BookPeer::TITLE, 'foo', Criteria::NOT_EQUAL);
  422. $this->assertEquals($q1, $q, 'filterByStringColumn() accepts an optional comparison operator');
  423. $q = BookQuery::create()->setModelAlias('b', true)->filterByTitle('foo');
  424. $q1 = BookQuery::create()->setModelAlias('b', true)->add('b.TITLE', 'foo', Criteria::EQUAL);
  425. $this->assertEquals($q1, $q, 'filterByStringColumn() uses true table alias if set');
  426. $q = BookQuery::create()->filterByTitle(array('foo', 'bar'));
  427. $q1 = BookQuery::create()->add(BookPeer::TITLE, array('foo', 'bar'), Criteria::IN);
  428. $this->assertEquals($q1, $q, 'filterByStringColumn() translates to a Criteria::IN when passed an array');
  429. $q = BookQuery::create()->filterByTitle(array('foo', 'bar'), Criteria::NOT_IN);
  430. $q1 = BookQuery::create()->add(BookPeer::TITLE, array('foo', 'bar'), Criteria::NOT_IN);
  431. $this->assertEquals($q1, $q, 'filterByStringColumn() accepts a comparison when passed an array');
  432. $q = BookQuery::create()->filterByTitle('foo%');
  433. $q1 = BookQuery::create()->add(BookPeer::TITLE, 'foo%', Criteria::LIKE);
  434. $this->assertEquals($q1, $q, 'filterByStringColumn() translates to a Criteria::LIKE when passed a string with a % wildcard');
  435. $q = BookQuery::create()->filterByTitle('foo%', Criteria::NOT_LIKE);
  436. $q1 = BookQuery::create()->add(BookPeer::TITLE, 'foo%', Criteria::NOT_LIKE);
  437. $this->assertEquals($q1, $q, 'filterByStringColumn() accepts a comparison when passed a string with a % wildcard');
  438. $q = BookQuery::create()->filterByTitle('foo%', Criteria::EQUAL);
  439. $q1 = BookQuery::create()->add(BookPeer::TITLE, 'foo%', Criteria::EQUAL);
  440. $this->assertEquals($q1, $q, 'filterByStringColumn() accepts a comparison when passed a string with a % wildcard');
  441. $q = BookQuery::create()->filterByTitle('*foo');
  442. $q1 = BookQuery::create()->add(BookPeer::TITLE, '%foo', Criteria::LIKE);
  443. $this->assertEquals($q1, $q, 'filterByStringColumn() translates to a Criteria::LIKE when passed a string with a * wildcard, and turns * into %');
  444. $q = BookQuery::create()->filterByTitle('*f%o*o%');
  445. $q1 = BookQuery::create()->add(BookPeer::TITLE, '%f%o%o%', Criteria::LIKE);
  446. $this->assertEquals($q1, $q, 'filterByStringColumn() translates to a Criteria::LIKE when passed a string with mixed wildcards, and turns *s into %s');
  447. }
  448. public function testFilterByBoolean()
  449. {
  450. $q = ReviewQuery::create()->filterByRecommended(true);
  451. $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, true, Criteria::EQUAL);
  452. $this->assertEquals($q1, $q, 'filterByBooleanColumn() translates to a Criteria::EQUAL by default');
  453. $q = ReviewQuery::create()->filterByRecommended(true, Criteria::NOT_EQUAL);
  454. $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, true, Criteria::NOT_EQUAL);
  455. $this->assertEquals($q1, $q, 'filterByBooleanColumn() accepts an optional comparison operator');
  456. $q = ReviewQuery::create()->filterByRecommended(false);
  457. $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, false, Criteria::EQUAL);
  458. $this->assertEquals($q1, $q, 'filterByBooleanColumn() translates to a Criteria::EQUAL by default');
  459. $q = ReviewQuery::create()->setModelAlias('b', true)->filterByRecommended(true);
  460. $q1 = ReviewQuery::create()->setModelAlias('b', true)->add('b.RECOMMENDED', true, Criteria::EQUAL);
  461. $this->assertEquals($q1, $q, 'filterByBooleanColumn() uses true table alias if set');
  462. $q = ReviewQuery::create()->filterByRecommended('true');
  463. $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, true, Criteria::EQUAL);
  464. $this->assertEquals($q1, $q, 'filterByBooleanColumn() translates to a = true when passed a true string');
  465. $q = ReviewQuery::create()->filterByRecommended('yes');
  466. $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, true, Criteria::EQUAL);
  467. $this->assertEquals($q1, $q, 'filterByBooleanColumn() translates to a = true when passed a true string');
  468. $q = ReviewQuery::create()->filterByRecommended('1');
  469. $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, true, Criteria::EQUAL);
  470. $this->assertEquals($q1, $q, 'filterByBooleanColumn() translates to a = true when passed a true string');
  471. $q = ReviewQuery::create()->filterByRecommended('false');
  472. $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, false, Criteria::EQUAL);
  473. $this->assertEquals($q1, $q, 'filterByBooleanColumn() translates to a = false when passed a false string');
  474. $q = ReviewQuery::create()->filterByRecommended('no');
  475. $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, false, Criteria::EQUAL);
  476. $this->assertEquals($q1, $q, 'filterByBooleanColumn() translates to a = false when passed a false string');
  477. $q = ReviewQuery::create()->filterByRecommended('0');
  478. $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, false, Criteria::EQUAL);
  479. $this->assertEquals($q1, $q, 'filterByBooleanColumn() translates to a = false when passed a false string');
  480. $q = ReviewQuery::create()->filterByRecommended('');
  481. $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, false, Criteria::EQUAL);
  482. $this->assertEquals($q1, $q, 'filterByBooleanColumn() translates to a = false when passed an empty string');
  483. }
  484. public function testFilterByFk()
  485. {
  486. $this->assertTrue(method_exists('BookQuery', 'filterByAuthor'), 'QueryBuilder adds filterByFk() methods');
  487. $this->assertTrue(method_exists('BookQuery', 'filterByPublisher'), 'QueryBuilder adds filterByFk() methods for all fkeys');
  488. $this->assertTrue(method_exists('EssayQuery', 'filterByAuthorRelatedByFirstAuthor'), 'QueryBuilder adds filterByFk() methods for several fkeys on the same table');
  489. $this->assertTrue(method_exists('EssayQuery', 'filterByAuthorRelatedBySecondAuthor'), 'QueryBuilder adds filterByFk() methods for several fkeys on the same table');
  490. }
  491. public function testFilterByFkSimpleKey()
  492. {
  493. BookstoreDataPopulator::depopulate();
  494. BookstoreDataPopulator::populate();
  495. // prepare the test data
  496. $testBook = BookQuery::create()
  497. ->innerJoin('Book.Author') // just in case there are books with no author
  498. ->findOne();
  499. $testAuthor = $testBook->getAuthor();
  500. $book = BookQuery::create()
  501. ->filterByAuthor($testAuthor)
  502. ->findOne();
  503. $this->assertEquals($testBook, $book, 'Generated query handles filterByFk() methods correctly for simple fkeys');
  504. $q = BookQuery::create()->filterByAuthor($testAuthor);
  505. $q1 = BookQuery::create()->add(BookPeer::AUTHOR_ID, $testAuthor->getId(), Criteria::EQUAL);
  506. $this->assertEquals($q1, $q, 'filterByFk() translates to a Criteria::EQUAL by default');
  507. $q = BookQuery::create()->filterByAuthor($testAuthor, Criteria::NOT_EQUAL);
  508. $q1 = BookQuery::create()->add(BookPeer::AUTHOR_ID, $testAuthor->getId(), Criteria::NOT_EQUAL);
  509. $this->assertEquals($q1, $q, 'filterByFk() accepts an optional comparison operator');
  510. }
  511. public function testFilterByFkCompositeKey()
  512. {
  513. BookstoreDataPopulator::depopulate();
  514. BookstoreDataPopulator::populate();
  515. BookstoreDataPopulator::populateOpinionFavorite();
  516. // prepare the test data
  517. $testOpinion = BookOpinionQuery::create()
  518. ->innerJoin('BookOpinion.ReaderFavorite') // just in case there are books with no author
  519. ->findOne();
  520. $testFavorite = $testOpinion->getReaderFavorite();
  521. $favorite = ReaderFavoriteQuery::create()
  522. ->filterByBookOpinion($testOpinion)
  523. ->findOne();
  524. $this->assertEquals($testFavorite, $favorite, 'Generated query handles filterByFk() methods correctly for composite fkeys');
  525. }
  526. public function testFilterByFkObjectCollection()
  527. {
  528. BookstoreDataPopulator::depopulate($this->con);
  529. BookstoreDataPopulator::populate($this->con);
  530. $authors = AuthorQuery::create()
  531. ->orderByFirstName()
  532. ->limit(2)
  533. ->find($this->con);
  534. $books = BookQuery::create()
  535. ->filterByAuthor($authors)
  536. ->find($this->con);
  537. $q1 = $this->con->getLastExecutedQuery();
  538. $books = BookQuery::create()
  539. ->add(BookPeer::AUTHOR_ID, $authors->getPrimaryKeys(), Criteria::IN)
  540. ->find($this->con);
  541. $q2 = $this->con->getLastExecutedQuery();
  542. $this->assertEquals($q2, $q1, 'filterByFk() accepts a collection and results to an IN query');
  543. }
  544. public function testFilterByRefFk()
  545. {
  546. $this->assertTrue(method_exists('BookQuery', 'filterByReview'), 'QueryBuilder adds filterByRefFk() methods');
  547. $this->assertTrue(method_exists('BookQuery', 'filterByMedia'), 'QueryBuilder adds filterByRefFk() methods for all fkeys');
  548. $this->assertTrue(method_exists('AuthorQuery', 'filterByEssayRelatedByFirstAuthor'), 'QueryBuilder adds filterByRefFk() methods for several fkeys on the same table');
  549. $this->assertTrue(method_exists('AuthorQuery', 'filterByEssayRelatedBySecondAuthor'), 'QueryBuilder adds filterByRefFk() methods for several fkeys on the same table');
  550. }
  551. public function testFilterByRefFkSimpleKey()
  552. {
  553. BookstoreDataPopulator::depopulate();
  554. BookstoreDataPopulator::populate();
  555. // prepare the test data
  556. $testBook = BookQuery::create()
  557. ->innerJoin('Book.Author') // just in case there are books with no author
  558. ->findOne();
  559. $testAuthor = $testBook->getAuthor();
  560. $author = AuthorQuery::create()
  561. ->filterByBook($testBook)
  562. ->findOne();
  563. $this->assertEquals($testAuthor, $author, 'Generated query handles filterByRefFk() methods correctly for simple fkeys');
  564. $q = AuthorQuery::create()->filterByBook($testBook);
  565. $q1 = AuthorQuery::create()->add(AuthorPeer::ID, $testBook->getAuthorId(), Criteria::EQUAL);
  566. $this->assertEquals($q1, $q, 'filterByRefFk() translates to a Criteria::EQUAL by default');
  567. $q = AuthorQuery::create()->filterByBook($testBook, Criteria::NOT_EQUAL);
  568. $q1 = AuthorQuery::create()->add(AuthorPeer::ID, $testBook->getAuthorId(), Criteria::NOT_EQUAL);
  569. $this->assertEquals($q1, $q, 'filterByRefFk() accepts an optional comparison operator');
  570. }
  571. public function testFilterByRelationNameCompositePk()
  572. {
  573. BookstoreDataPopulator::depopulate();
  574. BookstoreDataPopulator::populate();
  575. $testLabel = RecordLabelQuery::create()
  576. ->limit(2)
  577. ->find($this->con);
  578. $testRelease = ReleasePoolQuery::create()
  579. ->addJoin(ReleasePoolPeer::RECORD_LABEL_ID, RecordLabelPeer::ID)
  580. ->filterByRecordLabel($testLabel)
  581. ->find($this->con);
  582. $q1 = $this->con->getLastExecutedQuery();
  583. $releasePool = ReleasePoolQuery::create()
  584. ->addJoin(ReleasePoolPeer::RECORD_LABEL_ID, RecordLabelPeer::ID)
  585. ->add(ReleasePoolPeer::RECORD_LABEL_ID, $testLabel->toKeyValue('Id', 'Id'), Criteria::IN)
  586. ->find($this->con);
  587. $q2 = $this->con->getLastExecutedQuery();
  588. $this->assertEquals($q2, $q1, 'filterBy{RelationName}() only accepts arguments of type {RelationName} or PropelCollection');
  589. $this->assertEquals($releasePool, $testRelease);
  590. }
  591. public function testFilterByRefFkCompositeKey()
  592. {
  593. BookstoreDataPopulator::depopulate();
  594. BookstoreDataPopulator::populate();
  595. BookstoreDataPopulator::populateOpinionFavorite();
  596. // prepare the test data
  597. $testOpinion = BookOpinionQuery::create()
  598. ->innerJoin('BookOpinion.ReaderFavorite') // just in case there are books with no author
  599. ->findOne();
  600. $testFavorite = $testOpinion->getReaderFavorite();
  601. $opinion = BookOpinionQuery::create()
  602. ->filterByReaderFavorite($testFavorite)
  603. ->findOne();
  604. $this->assertEquals($testOpinion, $opinion, 'Generated query handles filterByRefFk() methods correctly for composite fkeys');
  605. }
  606. public function testFilterByRefFkObjectCollection()
  607. {
  608. BookstoreDataPopulator::depopulate($this->con);
  609. BookstoreDataPopulator::populate($this->con);
  610. $books = BookQuery::create()
  611. ->orderByTitle()
  612. ->limit(2)
  613. ->find($this->con);
  614. $authors = AuthorQuery::create()
  615. ->filterByBook($books)
  616. ->find($this->con);
  617. $q1 = $this->con->getLastExecutedQuery();
  618. $authors = AuthorQuery::create()
  619. ->addJoin(AuthorPeer::ID, BookPeer::AUTHOR_ID, Criteria::LEFT_JOIN)
  620. ->add(BookPeer::ID, $books->getPrimaryKeys(), Criteria::IN)
  621. ->find($this->con);
  622. $q2 = $this->con->getLastExecutedQuery();
  623. $this->assertEquals($q2, $q1, 'filterByRefFk() accepts a collection and results to an IN query in the joined table');
  624. }
  625. public function testFilterByCrossFK()
  626. {
  627. $this->assertTrue(method_exists('BookQuery', 'filterByBookClubList'), 'Generated query handles filterByCrossRefFK() for many-to-many relationships');
  628. $this->assertFalse(method_exists('BookQuery', 'filterByBook'), 'Generated query handles filterByCrossRefFK() for many-to-many relationships');
  629. BookstoreDataPopulator::depopulate();
  630. BookstoreDataPopulator::populate();
  631. $blc1 = BookClubListQuery::create()->findOneByGroupLeader('Crazyleggs');
  632. $nbBooks = BookQuery::create()
  633. ->filterByBookClubList($blc1)
  634. ->count();
  635. $this->assertEquals(2, $nbBooks, 'Generated query handles filterByCrossRefFK() methods correctly');
  636. }
  637. public function testJoinFk()
  638. {
  639. $q = BookQuery::create()
  640. ->joinAuthor();
  641. $q1 = BookQuery::create()
  642. ->join('Book.Author', Criteria::LEFT_JOIN);
  643. $this->assertTrue($q->equals($q1), 'joinFk() translates to a left join on non-required columns');
  644. $q = BookSummaryQuery::create()
  645. ->joinSummarizedBook();
  646. $q1 = BookSummaryQuery::create()
  647. ->join('BookSummary.SummarizedBook', Criteria::INNER_JOIN);
  648. $this->assertTrue($q->equals($q1), 'joinFk() translates to an inner join on required columns');
  649. $q = BookQuery::create()
  650. ->joinAuthor('a');
  651. $q1 = BookQuery::create()
  652. ->join('Book.Author a', Criteria::LEFT_JOIN);
  653. $this->assertTrue($q->equals($q1), 'joinFk() accepts a relation alias as first parameter');
  654. $q = BookQuery::create()
  655. ->joinAuthor('', Criteria::INNER_JOIN);
  656. $q1 = BookQuery::create()
  657. ->join('Book.Author', Criteria::INNER_JOIN);
  658. $this->assertTrue($q->equals($q1), 'joinFk() accepts a join type as second parameter');
  659. $q = EssayQuery::create()
  660. ->joinAuthorRelatedBySecondAuthor();
  661. $q1 = EssayQuery::create()
  662. ->join('Essay.AuthorRelatedBySecondAuthor', "INNER JOIN");
  663. $this->assertTrue($q->equals($q1), 'joinFk() translates to a "INNER JOIN" when this is defined as defaultJoin in the schema');
  664. }
  665. public function testJoinFkAlias()
  666. {
  667. $q = BookQuery::create('b')
  668. ->joinAuthor('a');
  669. $q1 = BookQuery::create('b')
  670. ->join('b.Author a', Criteria::LEFT_JOIN);
  671. $this->assertTrue($q->equals($q1), 'joinFk() works fine with table aliases');
  672. $q = BookQuery::create()
  673. ->setModelAlias('b', true)
  674. ->joinAuthor('a');
  675. $q1 = BookQuery::create()
  676. ->setModelAlias('b', true)
  677. ->join('b.Author a', Criteria::LEFT_JOIN);
  678. $this->assertTrue($q->equals($q1), 'joinFk() works fine with true table aliases');
  679. }
  680. public function testJoinRefFk()
  681. {
  682. $q = AuthorQuery::create()
  683. ->joinBook();
  684. $q1 = AuthorQuery::create()
  685. ->join('Author.Book', Criteria::LEFT_JOIN);
  686. $this->assertTrue($q->equals($q1), 'joinRefFk() translates to a left join on non-required columns');
  687. $q = BookQuery::create()
  688. ->joinBookSummary();
  689. $q1 = BookQuery::create()
  690. ->join('Book.BookSummary', Criteria::INNER_JOIN);
  691. $this->assertTrue($q->equals($q1), 'joinRefFk() translates to an inner join on required columns');
  692. $q = AuthorQuery::create()
  693. ->joinBook('b');
  694. $q1 = AuthorQuery::create()
  695. ->join('Author.Book b', Criteria::LEFT_JOIN);
  696. $this->assertTrue($q->equals($q1), 'joinRefFk() accepts a relation alias as first parameter');
  697. $q = AuthorQuery::create()
  698. ->joinBook('', Criteria::INNER_JOIN);
  699. $q1 = AuthorQuery::create()
  700. ->join('Author.Book', Criteria::INNER_JOIN);
  701. $this->assertTrue($q->equals($q1), 'joinRefFk() accepts a join type as second parameter');
  702. $q = AuthorQuery::create()
  703. ->joinEssayRelatedBySecondAuthor();
  704. $q1 = AuthorQuery::create()
  705. ->join('Author.EssayRelatedBySecondAuthor', Criteria::INNER_JOIN);
  706. $this->assertTrue($q->equals($q1), 'joinRefFk() translates to a "INNER JOIN" when this is defined as defaultJoin in the schema');
  707. }
  708. public function testUseFkQuerySimple()
  709. {
  710. $q = BookQuery::create()
  711. ->useAuthorQuery()
  712. ->filterByFirstName('Leo')
  713. ->endUse();
  714. $q1 = BookQuery::create()
  715. ->join('Book.Author', Criteria::LEFT_JOIN)
  716. ->add(AuthorPeer::FIRST_NAME, 'Leo', Criteria::EQUAL);
  717. $this->assertTrue($q->equals($q1), 'useFkQuery() translates to a condition on a left join on non-required columns');
  718. $q = BookSummaryQuery::create()
  719. ->useSummarizedBookQuery()
  720. ->filterByTitle('War And Peace')
  721. ->endUse();
  722. $q1 = BookSummaryQuery::create()
  723. ->join('BookSummary.SummarizedBook', Criteria::INNER_JOIN)
  724. ->add(BookPeer::TITLE, 'War And Peace', Criteria::EQUAL);
  725. $this->assertTrue($q->equals($q1), 'useFkQuery() translates to a condition on an inner join on required columns');
  726. }
  727. public function testUseFkQueryJoinType()
  728. {
  729. $q = BookQuery::create()
  730. ->useAuthorQuery(null, Criteria::LEFT_JOIN)
  731. ->filterByFirstName('Leo')
  732. ->endUse();
  733. $q1 = BookQuery::create()
  734. ->join('Book.Author', Criteria::LEFT_JOIN)
  735. ->add(AuthorPeer::FIRST_NAME, 'Leo', Criteria::EQUAL);
  736. $this->assertTrue($q->equals($q1), 'useFkQuery() accepts a join type as second parameter');
  737. }
  738. public function testUseFkQueryAlias()
  739. {
  740. $q = BookQuery::create()
  741. ->useAuthorQuery('a')
  742. ->filterByFirstName('Leo')
  743. ->endUse();
  744. $join = new ModelJoin();
  745. $join->setJoinType(Criteria::LEFT_JOIN);
  746. $join->setTableMap(AuthorPeer::getTableMap());
  747. $join->setRelationMap(BookPeer::getTableMap()->getRelation('Author'), null, 'a');
  748. $join->setRelationAlias('a');
  749. $q1 = BookQuery::create()
  750. ->addAlias('a', AuthorPeer::TABLE_NAME)
  751. ->addJoinObject($join, 'a')
  752. ->add('a.FIRST_NAME', 'Leo', Criteria::EQUAL);
  753. $this->assertTrue($q->equals($q1), 'useFkQuery() uses the first argument as a table alias');
  754. }
  755. public function testUseFkQueryMixed()
  756. {
  757. $q = BookQuery::create()
  758. ->useAuthorQuery()
  759. ->filterByFirstName('Leo')
  760. ->endUse()
  761. ->filterByTitle('War And Peace');
  762. $q1 = BookQuery::create()
  763. ->join('Book.Author', Criteria::LEFT_JOIN)
  764. ->add(AuthorPeer::FIRST_NAME, 'Leo', Criteria::EQUAL)
  765. ->add(BookPeer::TITLE, 'War And Peace', Criteria::EQUAL);
  766. $this->assertTrue($q->equals($q1), 'useFkQuery() allows combining conditions on main and related query');
  767. }
  768. public function testUseFkQueryTwice()
  769. {
  770. $q = BookQuery::create()
  771. ->useAuthorQuery()
  772. ->filterByFirstName('Leo')
  773. ->endUse()
  774. ->useAuthorQuery()
  775. ->filterByLastName('Tolstoi')
  776. ->endUse();
  777. $q1 = BookQuery::create()
  778. ->join('Book.Author', Criteria::LEFT_JOIN)
  779. ->add(AuthorPeer::FIRST_NAME, 'Leo', Criteria::EQUAL)
  780. ->add(AuthorPeer::LAST_NAME, 'Tolstoi', Criteria::EQUAL);
  781. $this->assertTrue($q->equals($q1), 'useFkQuery() called twice on the same relation does not create two joins');
  782. }
  783. public function testUseFkQueryTwiceTwoAliases()
  784. {
  785. $q = BookQuery::create()
  786. ->useAuthorQuery('a')
  787. ->filterByFirstName('Leo')
  788. ->endUse()
  789. ->useAuthorQuery('b')
  790. ->filterByLastName('Tolstoi')
  791. ->endUse();
  792. $join1 = new ModelJoin();
  793. $join1->setJoinType(Criteria::LEFT_JOIN);
  794. $join1->setTableMap(AuthorPeer::getTableMap());
  795. $join1->setRelationMap(BookPeer::getTableMap()->getRelation('Author'), null, 'a');
  796. $join1->setRelationAlias('a');
  797. $join2 = new ModelJoin();
  798. $join2->setJoinType(Criteria::LEFT_JOIN);
  799. $join2->setTableMap(AuthorPeer::getTableMap());
  800. $join2->setRelationMap(BookPeer::getTableMap()->getRelation('Author'), null, 'b');
  801. $join2->setRelationAlias('b');
  802. $q1 = BookQuery::create()
  803. ->addAlias('a', AuthorPeer::TABLE_NAME)
  804. ->addJoinObject($join1, 'a')
  805. ->add('a.FIRST_NAME', 'Leo', Criteria::EQUAL)
  806. ->addAlias('b', AuthorPeer::TABLE_NAME)
  807. ->addJoinObject($join2, 'b')
  808. ->add('b.LAST_NAME', 'Tolstoi', Criteria::EQUAL);
  809. $this->assertTrue($q->equals($q1), 'useFkQuery() called twice on the same relation with two aliases creates two joins');
  810. }
  811. public function testUseFkQueryNested()
  812. {
  813. $q = ReviewQuery::create()
  814. ->useBookQuery()
  815. ->useAuthorQuery()
  816. ->filterByFirstName('Leo')
  817. ->endUse()
  818. ->endUse();
  819. $q1 = ReviewQuery::create()
  820. ->join('Review.Book', Criteria::LEFT_JOIN)
  821. ->join('Book.Author', Criteria::LEFT_JOIN)
  822. ->add(AuthorPeer::FIRST_NAME, 'Leo', Criteria::EQUAL);
  823. // embedded queries create joins that keep a relation to the parent
  824. // as this is not testable, we need to use another testing technique
  825. $params = array();
  826. $result = BasePeer::createSelectSql($q, $params);
  827. $expectedParams = array();
  828. $expectedResult = BasePeer::createSelectSql($q1, $expectedParams);
  829. $this->assertEquals($expectedParams, $params, 'useFkQuery() called nested creates two joins');
  830. $this->assertEquals($expectedResult, $result, 'useFkQuery() called nested creates two joins');
  831. }
  832. public function testUseFkQueryTwoRelations()
  833. {
  834. $q = BookQuery::create()
  835. ->useAuthorQuery()
  836. ->filterByFirstName('Leo')
  837. ->endUse()
  838. ->usePublisherQuery()
  839. ->filterByName('Penguin')
  840. ->endUse();
  841. $q1 = BookQuery::create()
  842. ->join('Book.Author', Criteria::LEFT_JOIN)
  843. ->add(AuthorPeer::FIRST_NAME, 'Leo', Criteria::EQUAL)
  844. ->join('Book.Publisher', Criteria::LEFT_JOIN)
  845. ->add(PublisherPeer::NAME, 'Penguin', Criteria::EQUAL);
  846. $this->assertTrue($q->equals($q1), 'useFkQuery() called twice on two relations creates two joins');
  847. }
  848. public function testUseFkQueryNoAliasThenWith()
  849. {
  850. $con = Propel::getConnection();
  851. $books = BookQuery::create()
  852. ->useAuthorQuery()
  853. ->filterByFirstName('Leo')
  854. ->endUse()
  855. ->with('Author')
  856. ->find($con);
  857. $q1 = $con->getLastExecutedQuery();
  858. $books = BookQuery::create()
  859. ->leftJoinWithAuthor()
  860. ->add(AuthorPeer::FIRST_NAME, 'Leo', Criteria::EQUAL)
  861. ->find($con);
  862. $q2 = $con->getLastExecutedQuery();
  863. $this->assertEquals($q1, $q2, 'with() can be used after a call to useFkQuery() with no alias');
  864. }
  865. public function testPrune()
  866. {
  867. $q = BookQuery::create()->prune();
  868. $this->assertTrue($q instanceof BookQuery, 'prune() returns the current Query object');
  869. }
  870. public function testPruneSimpleKey()
  871. {
  872. BookstoreDataPopulator::depopulate();
  873. BookstoreDataPopulator::populate();
  874. $nbBooks = BookQuery::create()->prune()->count();
  875. $this->assertEquals(4, $nbBooks, 'prune() does nothing when passed a null object');
  876. $testBook = BookQuery::create()->findOne();
  877. $nbBooks = BookQuery::create()->prune($testBook)->count();
  878. $this->assertEquals(3, $nbBooks, 'prune() removes an object from the result');
  879. }
  880. public function testPruneCompositeKey()
  881. {
  882. BookstoreDataPopulator::depopulate();
  883. BookstoreDataPopulator::populate();
  884. // save all books to make sure related objects are also saved - BookstoreDataPopulator keeps some unsaved
  885. $c = new ModelCriteria('bookstore', 'Book');
  886. $books = $c->find();
  887. foreach ($books as $book) {
  888. $book->save();
  889. }
  890. BookPeer::clearInstancePool();
  891. $nbBookListRel = BookListRelQuery::create()->prune()->count();
  892. $this->assertEquals(2, $nbBookListRel, 'prune() does nothing when passed a null object');
  893. $testBookListRel = BookListRelQuery::create()->findOne();
  894. $nbBookListRel = BookListRelQuery::create()->prune($testBookListRel)->count();
  895. $this->assertEquals(1, $nbBookListRel, 'prune() removes an object from the result');
  896. }
  897. }
  898. class myCustomBookQuery extends BookQuery
  899. {
  900. public static function create($modelAlias = null, $criteria = null)
  901. {
  902. if ($criteria instanceof myCustomBookQuery) {
  903. return $criteria;
  904. }
  905. $query = new myCustomBookQuery();
  906. if (null !== $modelAlias) {
  907. $query->setModelAlias($modelAlias);
  908. }
  909. if ($criteria instanceof Criteria) {
  910. $query->mergeWith($criteria);
  911. }
  912. return $query;
  913. }
  914. }
  915. class mySecondBookQuery extends BookQuery
  916. {
  917. public static $preSelectWasCalled = false;
  918. public function __construct($dbName = 'bookstore', $modelName = 'Book', $modelAlias = null)

Large files files are truncated, but you can click here to view the full file