PageRenderTime 50ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

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

https://github.com/mattleff/propel
PHP | 985 lines | 789 code | 164 blank | 32 comment | 3 complexity | 67c3b0a3ce4896e09576a09ef44128bd MD5 | raw 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 testFindPkSimpleKey()
  111. {
  112. BookstoreDataPopulator::depopulate();
  113. BookstoreDataPopulator::populate();
  114. BookPeer::clearInstancePool();
  115. $con = Propel::getConnection('bookstore');
  116. // prepare the test data
  117. $c = new ModelCriteria('bookstore', 'Book');
  118. $c->orderBy('Book.Id', 'desc');
  119. $testBook = $c->findOne();
  120. $count = $con->getQueryCount();
  121. BookPeer::clearInstancePool();
  122. $q = new BookQuery();
  123. $book = $q->findPk($testBook->getId());
  124. $this->assertEquals($testBook, $book, 'BaseQuery overrides findPk() to make it faster');
  125. $this->assertEquals($count+1, $con->getQueryCount(), 'findPk() issues a database query when instance pool is empty');
  126. $q = new BookQuery();
  127. $book = $q->findPk($testBook->getId());
  128. $this->assertEquals($testBook, $book, 'BaseQuery overrides findPk() to make it faster');
  129. $this->assertEquals($count+1, $con->getQueryCount(), 'findPk() does not issue a database query when instance is in pool');
  130. }
  131. public function testFindPkCompositeKey()
  132. {
  133. BookstoreDataPopulator::depopulate();
  134. BookstoreDataPopulator::populate();
  135. // save all books to make sure related objects are also saved - BookstoreDataPopulator keeps some unsaved
  136. $c = new ModelCriteria('bookstore', 'Book');
  137. $books = $c->find();
  138. foreach ($books as $book) {
  139. $book->save();
  140. }
  141. BookPeer::clearInstancePool();
  142. // retrieve the test data
  143. $c = new ModelCriteria('bookstore', 'BookListRel');
  144. $bookListRelTest = $c->findOne();
  145. $pk = $bookListRelTest->getPrimaryKey();
  146. $q = new BookListRelQuery();
  147. $bookListRel = $q->findPk($pk);
  148. $this->assertEquals($bookListRelTest, $bookListRel, 'BaseQuery overrides findPk() for composite primary keysto make it faster');
  149. }
  150. public function testFindPks()
  151. {
  152. $method = new ReflectionMethod('Table4Query', 'findPks');
  153. $this->assertEquals('BaseTable4Query', $method->getDeclaringClass()->getName(), 'BaseQuery overrides findPks()');
  154. }
  155. public function testFindPksSimpleKey()
  156. {
  157. BookstoreDataPopulator::depopulate();
  158. BookstoreDataPopulator::populate();
  159. BookPeer::clearInstancePool();
  160. // prepare the test data
  161. $c = new ModelCriteria('bookstore', 'Book');
  162. $c->orderBy('Book.Id', 'desc');
  163. $testBooks = $c->find();
  164. $testBook1 = $testBooks->pop();
  165. $testBook2 = $testBooks->pop();
  166. $q = new BookQuery();
  167. $books = $q->findPks(array($testBook1->getId(), $testBook2->getId()));
  168. $this->assertEquals(array($testBook1, $testBook2), $books->getData(), 'BaseQuery overrides findPks() to make it faster');
  169. }
  170. public function testFindPksCompositeKey()
  171. {
  172. BookstoreDataPopulator::depopulate();
  173. BookstoreDataPopulator::populate();
  174. // save all books to make sure related objects are also saved - BookstoreDataPopulator keeps some unsaved
  175. $c = new ModelCriteria('bookstore', 'Book');
  176. $books = $c->find();
  177. foreach ($books as $book) {
  178. $book->save();
  179. }
  180. BookPeer::clearInstancePool();
  181. // retrieve the test data
  182. $c = new ModelCriteria('bookstore', 'BookListRel');
  183. $bookListRelTest = $c->find();
  184. $search = array();
  185. foreach ($bookListRelTest as $obj) {
  186. $search[]= $obj->getPrimaryKey();
  187. }
  188. $q = new BookListRelQuery();
  189. $objs = $q->findPks($search);
  190. $this->assertEquals($bookListRelTest, $objs, 'BaseQuery overrides findPks() for composite primary keys to make it work');
  191. }
  192. public function testFilterBy()
  193. {
  194. foreach (BookPeer::getFieldNames(BasePeer::TYPE_PHPNAME) as $colName) {
  195. $filterMethod = 'filterBy' . $colName;
  196. $this->assertTrue(method_exists('BookQuery', $filterMethod), 'QueryBuilder adds filterByColumn() methods for every column');
  197. $q = BookQuery::create()->$filterMethod(1);
  198. $this->assertTrue($q instanceof BookQuery, 'filterByColumn() returns the current query instance');
  199. }
  200. }
  201. public function testFilterByPrimaryKeySimpleKey()
  202. {
  203. $q = BookQuery::create()->filterByPrimaryKey(12);
  204. $q1 = BookQuery::create()->add(BookPeer::ID, 12, Criteria::EQUAL);
  205. $this->assertEquals($q1, $q, 'filterByPrimaryKey() translates to a Criteria::EQUAL in the PK column');
  206. $q = BookQuery::create()->setModelAlias('b', true)->filterByPrimaryKey(12);
  207. $q1 = BookQuery::create()->setModelAlias('b', true)->add('b.ID', 12, Criteria::EQUAL);
  208. $this->assertEquals($q1, $q, 'filterByPrimaryKey() uses true table alias if set');
  209. }
  210. public function testFilterByPrimaryKeyCompositeKey()
  211. {
  212. BookstoreDataPopulator::depopulate();
  213. BookstoreDataPopulator::populate();
  214. // save all books to make sure related objects are also saved - BookstoreDataPopulator keeps some unsaved
  215. $c = new ModelCriteria('bookstore', 'Book');
  216. $books = $c->find();
  217. foreach ($books as $book) {
  218. $book->save();
  219. }
  220. BookPeer::clearInstancePool();
  221. // retrieve the test data
  222. $c = new ModelCriteria('bookstore', 'BookListRel');
  223. $bookListRelTest = $c->findOne();
  224. $pk = $bookListRelTest->getPrimaryKey();
  225. $q = new BookListRelQuery();
  226. $q->filterByPrimaryKey($pk);
  227. $q1 = BookListRelQuery::create()
  228. ->add(BookListRelPeer::BOOK_ID, $pk[0], Criteria::EQUAL)
  229. ->add(BookListRelPeer::BOOK_CLUB_LIST_ID, $pk[1], Criteria::EQUAL);
  230. $this->assertEquals($q1, $q, 'filterByPrimaryKey() translates to a Criteria::EQUAL in the PK columns');
  231. }
  232. public function testFilterByPrimaryKeysSimpleKey()
  233. {
  234. $q = BookQuery::create()->filterByPrimaryKeys(array(10, 11, 12));
  235. $q1 = BookQuery::create()->add(BookPeer::ID, array(10, 11, 12), Criteria::IN);
  236. $this->assertEquals($q1, $q, 'filterByPrimaryKeys() translates to a Criteria::IN on the PK column');
  237. $q = BookQuery::create()->setModelAlias('b', true)->filterByPrimaryKeys(array(10, 11, 12));
  238. $q1 = BookQuery::create()->setModelAlias('b', true)->add('b.ID', array(10, 11, 12), Criteria::IN);
  239. $this->assertEquals($q1, $q, 'filterByPrimaryKeys() uses true table alias if set');
  240. }
  241. public function testFilterByPrimaryKeysCompositeKey()
  242. {
  243. BookstoreDataPopulator::depopulate();
  244. BookstoreDataPopulator::populate();
  245. // save all books to make sure related objects are also saved - BookstoreDataPopulator keeps some unsaved
  246. $c = new ModelCriteria('bookstore', 'Book');
  247. $books = $c->find();
  248. foreach ($books as $book) {
  249. $book->save();
  250. }
  251. BookPeer::clearInstancePool();
  252. // retrieve the test data
  253. $c = new ModelCriteria('bookstore', 'BookListRel');
  254. $bookListRelTest = $c->find();
  255. $search = array();
  256. foreach ($bookListRelTest as $obj) {
  257. $search[]= $obj->getPrimaryKey();
  258. }
  259. $q = new BookListRelQuery();
  260. $q->filterByPrimaryKeys($search);
  261. $q1 = BookListRelQuery::create();
  262. foreach ($search as $key) {
  263. $cton0 = $q1->getNewCriterion(BookListRelPeer::BOOK_ID, $key[0], Criteria::EQUAL);
  264. $cton1 = $q1->getNewCriterion(BookListRelPeer::BOOK_CLUB_LIST_ID, $key[1], Criteria::EQUAL);
  265. $cton0->addAnd($cton1);
  266. $q1->addOr($cton0);
  267. }
  268. $this->assertEquals($q1, $q, 'filterByPrimaryKeys() translates to a series of Criteria::EQUAL in the PK columns');
  269. $q = new BookListRelQuery();
  270. $q->filterByPrimaryKeys(array());
  271. $q1 = BookListRelQuery::create();
  272. $q1->add(null, '1<>1', Criteria::CUSTOM);
  273. $this->assertEquals($q1, $q, 'filterByPrimaryKeys() translates to an always failing test on empty arrays');
  274. }
  275. public function testFilterByIntegerPk()
  276. {
  277. $q = BookQuery::create()->filterById(12);
  278. $q1 = BookQuery::create()->add(BookPeer::ID, 12, Criteria::EQUAL);
  279. $this->assertEquals($q1, $q, 'filterByPkColumn() translates to a Criteria::EQUAL by default');
  280. $q = BookQuery::create()->filterById(12, Criteria::NOT_EQUAL);
  281. $q1 = BookQuery::create()->add(BookPeer::ID, 12, Criteria::NOT_EQUAL);
  282. $this->assertEquals($q1, $q, 'filterByPkColumn() accepts an optional comparison operator');
  283. $q = BookQuery::create()->setModelAlias('b', true)->filterById(12);
  284. $q1 = BookQuery::create()->setModelAlias('b', true)->add('b.ID', 12, Criteria::EQUAL);
  285. $this->assertEquals($q1, $q, 'filterByPkColumn() uses true table alias if set');
  286. $q = BookQuery::create()->filterById(array(10, 11, 12));
  287. $q1 = BookQuery::create()->add(BookPeer::ID, array(10, 11, 12), Criteria::IN);
  288. $this->assertEquals($q1, $q, 'filterByPkColumn() translates to a Criteria::IN when passed a simple array key');
  289. $q = BookQuery::create()->filterById(array(10, 11, 12), Criteria::NOT_IN);
  290. $q1 = BookQuery::create()->add(BookPeer::ID, array(10, 11, 12), Criteria::NOT_IN);
  291. $this->assertEquals($q1, $q, 'filterByPkColumn() accepts a comparison when passed a simple array key');
  292. }
  293. public function testFilterByNumber()
  294. {
  295. $q = BookQuery::create()->filterByPrice(12);
  296. $q1 = BookQuery::create()->add(BookPeer::PRICE, 12, Criteria::EQUAL);
  297. $this->assertEquals($q1, $q, 'filterByNumColumn() translates to a Criteria::EQUAL by default');
  298. $q = BookQuery::create()->filterByPrice(12, Criteria::NOT_EQUAL);
  299. $q1 = BookQuery::create()->add(BookPeer::PRICE, 12, Criteria::NOT_EQUAL);
  300. $this->assertEquals($q1, $q, 'filterByNumColumn() accepts an optional comparison operator');
  301. $q = BookQuery::create()->setModelAlias('b', true)->filterByPrice(12);
  302. $q1 = BookQuery::create()->setModelAlias('b', true)->add('b.PRICE', 12, Criteria::EQUAL);
  303. $this->assertEquals($q1, $q, 'filterByNumColumn() uses true table alias if set');
  304. $q = BookQuery::create()->filterByPrice(array(10, 11, 12));
  305. $q1 = BookQuery::create()->add(BookPeer::PRICE, array(10, 11, 12), Criteria::IN);
  306. $this->assertEquals($q1, $q, 'filterByNumColumn() translates to a Criteria::IN when passed a simple array key');
  307. $q = BookQuery::create()->filterByPrice(array(10, 11, 12), Criteria::NOT_IN);
  308. $q1 = BookQuery::create()->add(BookPeer::PRICE, array(10, 11, 12), Criteria::NOT_IN);
  309. $this->assertEquals($q1, $q, 'filterByNumColumn() accepts a comparison when passed a simple array key');
  310. $q = BookQuery::create()->filterByPrice(array('min' => 10));
  311. $q1 = BookQuery::create()->add(BookPeer::PRICE, 10, Criteria::GREATER_EQUAL);
  312. $this->assertEquals($q1, $q, 'filterByNumColumn() translates to a Criteria::GREATER_EQUAL when passed a \'min\' key');
  313. $q = BookQuery::create()->filterByPrice(array('max' => 12));
  314. $q1 = BookQuery::create()->add(BookPeer::PRICE, 12, Criteria::LESS_EQUAL);
  315. $this->assertEquals($q1, $q, 'filterByNumColumn() translates to a Criteria::LESS_EQUAL when passed a \'max\' key');
  316. $q = BookQuery::create()->filterByPrice(array('min' => 10, 'max' => 12));
  317. $q1 = BookQuery::create()
  318. ->add(BookPeer::PRICE, 10, Criteria::GREATER_EQUAL)
  319. ->addAnd(BookPeer::PRICE, 12, Criteria::LESS_EQUAL);
  320. $this->assertEquals($q1, $q, 'filterByNumColumn() translates to a between when passed both a \'min\' and a \'max\' key');
  321. }
  322. public function testFilterByTimestamp()
  323. {
  324. $q = BookstoreEmployeeAccountQuery::create()->filterByCreated(12);
  325. $q1 = BookstoreEmployeeAccountQuery::create()->add(BookstoreEmployeeAccountPeer::CREATED, 12, Criteria::EQUAL);
  326. $this->assertEquals($q1, $q, 'filterByDateColumn() translates to a Criteria::EQUAL by default');
  327. $q = BookstoreEmployeeAccountQuery::create()->filterByCreated(12, Criteria::NOT_EQUAL);
  328. $q1 = BookstoreEmployeeAccountQuery::create()->add(BookstoreEmployeeAccountPeer::CREATED, 12, Criteria::NOT_EQUAL);
  329. $this->assertEquals($q1, $q, 'filterByDateColumn() accepts an optional comparison operator');
  330. $q = BookstoreEmployeeAccountQuery::create()->setModelAlias('b', true)->filterByCreated(12);
  331. $q1 = BookstoreEmployeeAccountQuery::create()->setModelAlias('b', true)->add('b.CREATED', 12, Criteria::EQUAL);
  332. $this->assertEquals($q1, $q, 'filterByDateColumn() uses true table alias if set');
  333. $q = BookstoreEmployeeAccountQuery::create()->filterByCreated(array('min' => 10));
  334. $q1 = BookstoreEmployeeAccountQuery::create()->add(BookstoreEmployeeAccountPeer::CREATED, 10, Criteria::GREATER_EQUAL);
  335. $this->assertEquals($q1, $q, 'filterByDateColumn() translates to a Criteria::GREATER_EQUAL when passed a \'min\' key');
  336. $q = BookstoreEmployeeAccountQuery::create()->filterByCreated(array('max' => 12));
  337. $q1 = BookstoreEmployeeAccountQuery::create()->add(BookstoreEmployeeAccountPeer::CREATED, 12, Criteria::LESS_EQUAL);
  338. $this->assertEquals($q1, $q, 'filterByDateColumn() translates to a Criteria::LESS_EQUAL when passed a \'max\' key');
  339. $q = BookstoreEmployeeAccountQuery::create()->filterByCreated(array('min' => 10, 'max' => 12));
  340. $q1 = BookstoreEmployeeAccountQuery::create()
  341. ->add(BookstoreEmployeeAccountPeer::CREATED, 10, Criteria::GREATER_EQUAL)
  342. ->addAnd(BookstoreEmployeeAccountPeer::CREATED, 12, Criteria::LESS_EQUAL);
  343. $this->assertEquals($q1, $q, 'filterByDateColumn() translates to a between when passed both a \'min\' and a \'max\' key');
  344. }
  345. public function testFilterByString()
  346. {
  347. $q = BookQuery::create()->filterByTitle('foo');
  348. $q1 = BookQuery::create()->add(BookPeer::TITLE, 'foo', Criteria::EQUAL);
  349. $this->assertEquals($q1, $q, 'filterByStringColumn() translates to a Criteria::EQUAL by default');
  350. $q = BookQuery::create()->filterByTitle('foo', Criteria::NOT_EQUAL);
  351. $q1 = BookQuery::create()->add(BookPeer::TITLE, 'foo', Criteria::NOT_EQUAL);
  352. $this->assertEquals($q1, $q, 'filterByStringColumn() accepts an optional comparison operator');
  353. $q = BookQuery::create()->setModelAlias('b', true)->filterByTitle('foo');
  354. $q1 = BookQuery::create()->setModelAlias('b', true)->add('b.TITLE', 'foo', Criteria::EQUAL);
  355. $this->assertEquals($q1, $q, 'filterByStringColumn() uses true table alias if set');
  356. $q = BookQuery::create()->filterByTitle(array('foo', 'bar'));
  357. $q1 = BookQuery::create()->add(BookPeer::TITLE, array('foo', 'bar'), Criteria::IN);
  358. $this->assertEquals($q1, $q, 'filterByStringColumn() translates to a Criteria::IN when passed an array');
  359. $q = BookQuery::create()->filterByTitle(array('foo', 'bar'), Criteria::NOT_IN);
  360. $q1 = BookQuery::create()->add(BookPeer::TITLE, array('foo', 'bar'), Criteria::NOT_IN);
  361. $this->assertEquals($q1, $q, 'filterByStringColumn() accepts a comparison when passed an array');
  362. $q = BookQuery::create()->filterByTitle('foo%');
  363. $q1 = BookQuery::create()->add(BookPeer::TITLE, 'foo%', Criteria::LIKE);
  364. $this->assertEquals($q1, $q, 'filterByStringColumn() translates to a Criteria::LIKE when passed a string with a % wildcard');
  365. $q = BookQuery::create()->filterByTitle('foo%', Criteria::NOT_LIKE);
  366. $q1 = BookQuery::create()->add(BookPeer::TITLE, 'foo%', Criteria::NOT_LIKE);
  367. $this->assertEquals($q1, $q, 'filterByStringColumn() accepts a comparison when passed a string with a % wildcard');
  368. $q = BookQuery::create()->filterByTitle('foo%', Criteria::EQUAL);
  369. $q1 = BookQuery::create()->add(BookPeer::TITLE, 'foo%', Criteria::EQUAL);
  370. $this->assertEquals($q1, $q, 'filterByStringColumn() accepts a comparison when passed a string with a % wildcard');
  371. $q = BookQuery::create()->filterByTitle('*foo');
  372. $q1 = BookQuery::create()->add(BookPeer::TITLE, '%foo', Criteria::LIKE);
  373. $this->assertEquals($q1, $q, 'filterByStringColumn() translates to a Criteria::LIKE when passed a string with a * wildcard, and turns * into %');
  374. $q = BookQuery::create()->filterByTitle('*f%o*o%');
  375. $q1 = BookQuery::create()->add(BookPeer::TITLE, '%f%o%o%', Criteria::LIKE);
  376. $this->assertEquals($q1, $q, 'filterByStringColumn() translates to a Criteria::LIKE when passed a string with mixed wildcards, and turns *s into %s');
  377. }
  378. public function testFilterByBoolean()
  379. {
  380. $q = ReviewQuery::create()->filterByRecommended(true);
  381. $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, true, Criteria::EQUAL);
  382. $this->assertEquals($q1, $q, 'filterByBooleanColumn() translates to a Criteria::EQUAL by default');
  383. $q = ReviewQuery::create()->filterByRecommended(true, Criteria::NOT_EQUAL);
  384. $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, true, Criteria::NOT_EQUAL);
  385. $this->assertEquals($q1, $q, 'filterByBooleanColumn() accepts an optional comparison operator');
  386. $q = ReviewQuery::create()->filterByRecommended(false);
  387. $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, false, Criteria::EQUAL);
  388. $this->assertEquals($q1, $q, 'filterByBooleanColumn() translates to a Criteria::EQUAL by default');
  389. $q = ReviewQuery::create()->setModelAlias('b', true)->filterByRecommended(true);
  390. $q1 = ReviewQuery::create()->setModelAlias('b', true)->add('b.RECOMMENDED', true, Criteria::EQUAL);
  391. $this->assertEquals($q1, $q, 'filterByBooleanColumn() uses true table alias if set');
  392. $q = ReviewQuery::create()->filterByRecommended('true');
  393. $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, true, Criteria::EQUAL);
  394. $this->assertEquals($q1, $q, 'filterByBooleanColumn() translates to a = true when passed a true string');
  395. $q = ReviewQuery::create()->filterByRecommended('yes');
  396. $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, true, Criteria::EQUAL);
  397. $this->assertEquals($q1, $q, 'filterByBooleanColumn() translates to a = true when passed a true string');
  398. $q = ReviewQuery::create()->filterByRecommended('1');
  399. $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, true, Criteria::EQUAL);
  400. $this->assertEquals($q1, $q, 'filterByBooleanColumn() translates to a = true when passed a true string');
  401. $q = ReviewQuery::create()->filterByRecommended('false');
  402. $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, false, Criteria::EQUAL);
  403. $this->assertEquals($q1, $q, 'filterByBooleanColumn() translates to a = false when passed a false string');
  404. $q = ReviewQuery::create()->filterByRecommended('no');
  405. $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, false, Criteria::EQUAL);
  406. $this->assertEquals($q1, $q, 'filterByBooleanColumn() translates to a = false when passed a false string');
  407. $q = ReviewQuery::create()->filterByRecommended('0');
  408. $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, false, Criteria::EQUAL);
  409. $this->assertEquals($q1, $q, 'filterByBooleanColumn() translates to a = false when passed a false string');
  410. }
  411. public function testFilterByFk()
  412. {
  413. $this->assertTrue(method_exists('BookQuery', 'filterByAuthor'), 'QueryBuilder adds filterByFk() methods');
  414. $this->assertTrue(method_exists('BookQuery', 'filterByPublisher'), 'QueryBuilder adds filterByFk() methods for all fkeys');
  415. $this->assertTrue(method_exists('EssayQuery', 'filterByAuthorRelatedByFirstAuthor'), 'QueryBuilder adds filterByFk() methods for several fkeys on the same table');
  416. $this->assertTrue(method_exists('EssayQuery', 'filterByAuthorRelatedBySecondAuthor'), 'QueryBuilder adds filterByFk() methods for several fkeys on the same table');
  417. }
  418. public function testFilterByFkSimpleKey()
  419. {
  420. BookstoreDataPopulator::depopulate();
  421. BookstoreDataPopulator::populate();
  422. // prepare the test data
  423. $testBook = BookQuery::create()
  424. ->innerJoin('Book.Author') // just in case there are books with no author
  425. ->findOne();
  426. $testAuthor = $testBook->getAuthor();
  427. $book = BookQuery::create()
  428. ->filterByAuthor($testAuthor)
  429. ->findOne();
  430. $this->assertEquals($testBook, $book, 'Generated query handles filterByFk() methods correctly for simple fkeys');
  431. $q = BookQuery::create()->filterByAuthor($testAuthor);
  432. $q1 = BookQuery::create()->add(BookPeer::AUTHOR_ID, $testAuthor->getId(), Criteria::EQUAL);
  433. $this->assertEquals($q1, $q, 'filterByFk() translates to a Criteria::EQUAL by default');
  434. $q = BookQuery::create()->filterByAuthor($testAuthor, Criteria::NOT_EQUAL);
  435. $q1 = BookQuery::create()->add(BookPeer::AUTHOR_ID, $testAuthor->getId(), Criteria::NOT_EQUAL);
  436. $this->assertEquals($q1, $q, 'filterByFk() accepts an optional comparison operator');
  437. }
  438. public function testFilterByFkCompositeKey()
  439. {
  440. BookstoreDataPopulator::depopulate();
  441. BookstoreDataPopulator::populate();
  442. BookstoreDataPopulator::populateOpinionFavorite();
  443. // prepare the test data
  444. $testOpinion = BookOpinionQuery::create()
  445. ->innerJoin('BookOpinion.ReaderFavorite') // just in case there are books with no author
  446. ->findOne();
  447. $testFavorite = $testOpinion->getReaderFavorite();
  448. $favorite = ReaderFavoriteQuery::create()
  449. ->filterByBookOpinion($testOpinion)
  450. ->findOne();
  451. $this->assertEquals($testFavorite, $favorite, 'Generated query handles filterByFk() methods correctly for composite fkeys');
  452. }
  453. public function testFilterByFkObjectCollection()
  454. {
  455. BookstoreDataPopulator::depopulate($this->con);
  456. BookstoreDataPopulator::populate($this->con);
  457. $authors = AuthorQuery::create()
  458. ->orderByFirstName()
  459. ->limit(2)
  460. ->find($this->con);
  461. $books = BookQuery::create()
  462. ->filterByAuthor($authors)
  463. ->find($this->con);
  464. $q1 = $this->con->getLastExecutedQuery();
  465. $books = BookQuery::create()
  466. ->add(BookPeer::AUTHOR_ID, $authors->getPrimaryKeys(), Criteria::IN)
  467. ->find($this->con);
  468. $q2 = $this->con->getLastExecutedQuery();
  469. $this->assertEquals($q2, $q1, 'filterByFk() accepts a collection and results to an IN query');
  470. }
  471. public function testFilterByRefFk()
  472. {
  473. $this->assertTrue(method_exists('BookQuery', 'filterByReview'), 'QueryBuilder adds filterByRefFk() methods');
  474. $this->assertTrue(method_exists('BookQuery', 'filterByMedia'), 'QueryBuilder adds filterByRefFk() methods for all fkeys');
  475. $this->assertTrue(method_exists('AuthorQuery', 'filterByEssayRelatedByFirstAuthor'), 'QueryBuilder adds filterByRefFk() methods for several fkeys on the same table');
  476. $this->assertTrue(method_exists('AuthorQuery', 'filterByEssayRelatedBySecondAuthor'), 'QueryBuilder adds filterByRefFk() methods for several fkeys on the same table');
  477. }
  478. public function testFilterByRefFkSimpleKey()
  479. {
  480. BookstoreDataPopulator::depopulate();
  481. BookstoreDataPopulator::populate();
  482. // prepare the test data
  483. $testBook = BookQuery::create()
  484. ->innerJoin('Book.Author') // just in case there are books with no author
  485. ->findOne();
  486. $testAuthor = $testBook->getAuthor();
  487. $author = AuthorQuery::create()
  488. ->filterByBook($testBook)
  489. ->findOne();
  490. $this->assertEquals($testAuthor, $author, 'Generated query handles filterByRefFk() methods correctly for simple fkeys');
  491. $q = AuthorQuery::create()->filterByBook($testBook);
  492. $q1 = AuthorQuery::create()->add(AuthorPeer::ID, $testBook->getAuthorId(), Criteria::EQUAL);
  493. $this->assertEquals($q1, $q, 'filterByRefFk() translates to a Criteria::EQUAL by default');
  494. $q = AuthorQuery::create()->filterByBook($testBook, Criteria::NOT_EQUAL);
  495. $q1 = AuthorQuery::create()->add(AuthorPeer::ID, $testBook->getAuthorId(), Criteria::NOT_EQUAL);
  496. $this->assertEquals($q1, $q, 'filterByRefFk() accepts an optional comparison operator');
  497. }
  498. public function testFilterByRefFkCompositeKey()
  499. {
  500. BookstoreDataPopulator::depopulate();
  501. BookstoreDataPopulator::populate();
  502. BookstoreDataPopulator::populateOpinionFavorite();
  503. // prepare the test data
  504. $testOpinion = BookOpinionQuery::create()
  505. ->innerJoin('BookOpinion.ReaderFavorite') // just in case there are books with no author
  506. ->findOne();
  507. $testFavorite = $testOpinion->getReaderFavorite();
  508. $opinion = BookOpinionQuery::create()
  509. ->filterByReaderFavorite($testFavorite)
  510. ->findOne();
  511. $this->assertEquals($testOpinion, $opinion, 'Generated query handles filterByRefFk() methods correctly for composite fkeys');
  512. }
  513. public function testFilterByRefFkObjectCollection()
  514. {
  515. BookstoreDataPopulator::depopulate($this->con);
  516. BookstoreDataPopulator::populate($this->con);
  517. $books = BookQuery::create()
  518. ->orderByTitle()
  519. ->limit(2)
  520. ->find($this->con);
  521. $authors = AuthorQuery::create()
  522. ->filterByBook($books)
  523. ->find($this->con);
  524. $q1 = $this->con->getLastExecutedQuery();
  525. $authors = AuthorQuery::create()
  526. ->addJoin(AuthorPeer::ID, BookPeer::AUTHOR_ID, Criteria::LEFT_JOIN)
  527. ->add(BookPeer::ID, $books->getPrimaryKeys(), Criteria::IN)
  528. ->find($this->con);
  529. $q2 = $this->con->getLastExecutedQuery();
  530. $this->assertEquals($q2, $q1, 'filterByRefFk() accepts a collection and results to an IN query in the joined table');
  531. }
  532. public function testFilterByCrossFK()
  533. {
  534. $this->assertTrue(method_exists('BookQuery', 'filterByBookClubList'), 'Generated query handles filterByCrossRefFK() for many-to-many relationships');
  535. $this->assertFalse(method_exists('BookQuery', 'filterByBook'), 'Generated query handles filterByCrossRefFK() for many-to-many relationships');
  536. BookstoreDataPopulator::depopulate();
  537. BookstoreDataPopulator::populate();
  538. $blc1 = BookClubListQuery::create()->findOneByGroupLeader('Crazyleggs');
  539. $nbBooks = BookQuery::create()
  540. ->filterByBookClubList($blc1)
  541. ->count();
  542. $this->assertEquals(2, $nbBooks, 'Generated query handles filterByCrossRefFK() methods correctly');
  543. }
  544. public function testJoinFk()
  545. {
  546. $q = BookQuery::create()
  547. ->joinAuthor();
  548. $q1 = BookQuery::create()
  549. ->join('Book.Author', Criteria::LEFT_JOIN);
  550. $this->assertTrue($q->equals($q1), 'joinFk() translates to a left join on non-required columns');
  551. $q = ReviewQuery::create()
  552. ->joinBook();
  553. $q1 = ReviewQuery::create()
  554. ->join('Review.Book', Criteria::INNER_JOIN);
  555. $this->assertTrue($q->equals($q1), 'joinFk() translates to an inner join on required columns');
  556. $q = BookQuery::create()
  557. ->joinAuthor('a');
  558. $q1 = BookQuery::create()
  559. ->join('Book.Author a', Criteria::LEFT_JOIN);
  560. $this->assertTrue($q->equals($q1), 'joinFk() accepts a relation alias as first parameter');
  561. $q = BookQuery::create()
  562. ->joinAuthor('', Criteria::INNER_JOIN);
  563. $q1 = BookQuery::create()
  564. ->join('Book.Author', Criteria::INNER_JOIN);
  565. $this->assertTrue($q->equals($q1), 'joinFk() accepts a join type as second parameter');
  566. $q = EssayQuery::create()
  567. ->joinAuthorRelatedBySecondAuthor();
  568. $q1 = EssayQuery::create()
  569. ->join('Essay.AuthorRelatedBySecondAuthor', "INNER JOIN");
  570. $this->assertTrue($q->equals($q1), 'joinFk() translates to a "INNER JOIN" when this is defined as defaultJoin in the schema');
  571. }
  572. public function testJoinFkAlias()
  573. {
  574. $q = BookQuery::create('b')
  575. ->joinAuthor('a');
  576. $q1 = BookQuery::create('b')
  577. ->join('b.Author a', Criteria::LEFT_JOIN);
  578. $this->assertTrue($q->equals($q1), 'joinFk() works fine with table aliases');
  579. $q = BookQuery::create()
  580. ->setModelAlias('b', true)
  581. ->joinAuthor('a');
  582. $q1 = BookQuery::create()
  583. ->setModelAlias('b', true)
  584. ->join('b.Author a', Criteria::LEFT_JOIN);
  585. $this->assertTrue($q->equals($q1), 'joinFk() works fine with true table aliases');
  586. }
  587. public function testJoinRefFk()
  588. {
  589. $q = AuthorQuery::create()
  590. ->joinBook();
  591. $q1 = AuthorQuery::create()
  592. ->join('Author.Book', Criteria::LEFT_JOIN);
  593. $this->assertTrue($q->equals($q1), 'joinRefFk() translates to a left join on non-required columns');
  594. $q = BookQuery::create()
  595. ->joinreview();
  596. $q1 = BookQuery::create()
  597. ->join('Book.Review', Criteria::INNER_JOIN);
  598. $this->assertTrue($q->equals($q1), 'joinRefFk() translates to an inner join on required columns');
  599. $q = AuthorQuery::create()
  600. ->joinBook('b');
  601. $q1 = AuthorQuery::create()
  602. ->join('Author.Book b', Criteria::LEFT_JOIN);
  603. $this->assertTrue($q->equals($q1), 'joinRefFk() accepts a relation alias as first parameter');
  604. $q = AuthorQuery::create()
  605. ->joinBook('', Criteria::INNER_JOIN);
  606. $q1 = AuthorQuery::create()
  607. ->join('Author.Book', Criteria::INNER_JOIN);
  608. $this->assertTrue($q->equals($q1), 'joinRefFk() accepts a join type as second parameter');
  609. $q = AuthorQuery::create()
  610. ->joinEssayRelatedBySecondAuthor();
  611. $q1 = AuthorQuery::create()
  612. ->join('Author.EssayRelatedBySecondAuthor', Criteria::INNER_JOIN);
  613. $this->assertTrue($q->equals($q1), 'joinRefFk() translates to a "INNER JOIN" when this is defined as defaultJoin in the schema');
  614. }
  615. public function testUseFkQuerySimple()
  616. {
  617. $q = BookQuery::create()
  618. ->useAuthorQuery()
  619. ->filterByFirstName('Leo')
  620. ->endUse();
  621. $q1 = BookQuery::create()
  622. ->join('Book.Author', Criteria::LEFT_JOIN)
  623. ->add(AuthorPeer::FIRST_NAME, 'Leo', Criteria::EQUAL);
  624. $this->assertTrue($q->equals($q1), 'useFkQuery() translates to a condition on a left join on non-required columns');
  625. $q = ReviewQuery::create()
  626. ->useBookQuery()
  627. ->filterByTitle('War And Peace')
  628. ->endUse();
  629. $q1 = ReviewQuery::create()
  630. ->join('Review.Book', Criteria::INNER_JOIN)
  631. ->add(BookPeer::TITLE, 'War And Peace', Criteria::EQUAL);
  632. $this->assertTrue($q->equals($q1), 'useFkQuery() translates to a condition on aninner join on required columns');
  633. }
  634. public function testUseFkQueryJoinType()
  635. {
  636. $q = BookQuery::create()
  637. ->useAuthorQuery(null, Criteria::LEFT_JOIN)
  638. ->filterByFirstName('Leo')
  639. ->endUse();
  640. $q1 = BookQuery::create()
  641. ->join('Book.Author', Criteria::LEFT_JOIN)
  642. ->add(AuthorPeer::FIRST_NAME, 'Leo', Criteria::EQUAL);
  643. $this->assertTrue($q->equals($q1), 'useFkQuery() accepts a join type as second parameter');
  644. }
  645. public function testUseFkQueryAlias()
  646. {
  647. $q = BookQuery::create()
  648. ->useAuthorQuery('a')
  649. ->filterByFirstName('Leo')
  650. ->endUse();
  651. $join = new ModelJoin();
  652. $join->setJoinType(Criteria::LEFT_JOIN);
  653. $join->setTableMap(AuthorPeer::getTableMap());
  654. $join->setRelationMap(BookPeer::getTableMap()->getRelation('Author'), null, 'a');
  655. $join->setRelationAlias('a');
  656. $q1 = BookQuery::create()
  657. ->addAlias('a', AuthorPeer::TABLE_NAME)
  658. ->addJoinObject($join, 'a')
  659. ->add('a.FIRST_NAME', 'Leo', Criteria::EQUAL);
  660. $this->assertTrue($q->equals($q1), 'useFkQuery() uses the first argument as a table alias');
  661. }
  662. public function testUseFkQueryMixed()
  663. {
  664. $q = BookQuery::create()
  665. ->useAuthorQuery()
  666. ->filterByFirstName('Leo')
  667. ->endUse()
  668. ->filterByTitle('War And Peace');
  669. $q1 = BookQuery::create()
  670. ->join('Book.Author', Criteria::LEFT_JOIN)
  671. ->add(AuthorPeer::FIRST_NAME, 'Leo', Criteria::EQUAL)
  672. ->add(BookPeer::TITLE, 'War And Peace', Criteria::EQUAL);
  673. $this->assertTrue($q->equals($q1), 'useFkQuery() allows combining conditions on main and related query');
  674. }
  675. public function testUseFkQueryTwice()
  676. {
  677. $q = BookQuery::create()
  678. ->useAuthorQuery()
  679. ->filterByFirstName('Leo')
  680. ->endUse()
  681. ->useAuthorQuery()
  682. ->filterByLastName('Tolstoi')
  683. ->endUse();
  684. $q1 = BookQuery::create()
  685. ->join('Book.Author', Criteria::LEFT_JOIN)
  686. ->add(AuthorPeer::FIRST_NAME, 'Leo', Criteria::EQUAL)
  687. ->add(AuthorPeer::LAST_NAME, 'Tolstoi', Criteria::EQUAL);
  688. $this->assertTrue($q->equals($q1), 'useFkQuery() called twice on the same relation does not create two joins');
  689. }
  690. public function testUseFkQueryTwiceTwoAliases()
  691. {
  692. $q = BookQuery::create()
  693. ->useAuthorQuery('a')
  694. ->filterByFirstName('Leo')
  695. ->endUse()
  696. ->useAuthorQuery('b')
  697. ->filterByLastName('Tolstoi')
  698. ->endUse();
  699. $join1 = new ModelJoin();
  700. $join1->setJoinType(Criteria::LEFT_JOIN);
  701. $join1->setTableMap(AuthorPeer::getTableMap());
  702. $join1->setRelationMap(BookPeer::getTableMap()->getRelation('Author'), null, 'a');
  703. $join1->setRelationAlias('a');
  704. $join2 = new ModelJoin();
  705. $join2->setJoinType(Criteria::LEFT_JOIN);
  706. $join2->setTableMap(AuthorPeer::getTableMap());
  707. $join2->setRelationMap(BookPeer::getTableMap()->getRelation('Author'), null, 'b');
  708. $join2->setRelationAlias('b');
  709. $q1 = BookQuery::create()
  710. ->addAlias('a', AuthorPeer::TABLE_NAME)
  711. ->addJoinObject($join1, 'a')
  712. ->add('a.FIRST_NAME', 'Leo', Criteria::EQUAL)
  713. ->addAlias('b', AuthorPeer::TABLE_NAME)
  714. ->addJoinObject($join2, 'b')
  715. ->add('b.LAST_NAME', 'Tolstoi', Criteria::EQUAL);
  716. $this->assertTrue($q->equals($q1), 'useFkQuery() called twice on the same relation with two aliases creates two joins');
  717. }
  718. public function testUseFkQueryNested()
  719. {
  720. $q = ReviewQuery::create()
  721. ->useBookQuery()
  722. ->useAuthorQuery()
  723. ->filterByFirstName('Leo')
  724. ->endUse()
  725. ->endUse();
  726. $q1 = ReviewQuery::create()
  727. ->join('Review.Book', Criteria::INNER_JOIN)
  728. ->join('Book.Author', Criteria::LEFT_JOIN)
  729. ->add(AuthorPeer::FIRST_NAME, 'Leo', Criteria::EQUAL);
  730. // embedded queries create joins that keep a relation to the parent
  731. // as this is not testable, we need to use another testing technique
  732. $params = array();
  733. $result = BasePeer::createSelectSql($q, $params);
  734. $expectedParams = array();
  735. $expectedResult = BasePeer::createSelectSql($q1, $expectedParams);
  736. $this->assertEquals($expectedParams, $params, 'useFkQuery() called nested creates two joins');
  737. $this->assertEquals($expectedResult, $result, 'useFkQuery() called nested creates two joins');
  738. }
  739. public function testUseFkQueryTwoRelations()
  740. {
  741. $q = BookQuery::create()
  742. ->useAuthorQuery()
  743. ->filterByFirstName('Leo')
  744. ->endUse()
  745. ->usePublisherQuery()
  746. ->filterByName('Penguin')
  747. ->endUse();
  748. $q1 = BookQuery::create()
  749. ->join('Book.Author', Criteria::LEFT_JOIN)
  750. ->add(AuthorPeer::FIRST_NAME, 'Leo', Criteria::EQUAL)
  751. ->join('Book.Publisher', Criteria::LEFT_JOIN)
  752. ->add(PublisherPeer::NAME, 'Penguin', Criteria::EQUAL);
  753. $this->assertTrue($q->equals($q1), 'useFkQuery() called twice on two relations creates two joins');
  754. }
  755. public function testUseFkQueryNoAliasThenWith()
  756. {
  757. $con = Propel::getConnection();
  758. $books = BookQuery::create()
  759. ->useAuthorQuery()
  760. ->filterByFirstName('Leo')
  761. ->endUse()
  762. ->with('Author')
  763. ->find($con);
  764. $q1 = $con->getLastExecutedQuery();
  765. $books = BookQuery::create()
  766. ->leftJoinWithAuthor()
  767. ->add(AuthorPeer::FIRST_NAME, 'Leo', Criteria::EQUAL)
  768. ->find($con);
  769. $q2 = $con->getLastExecutedQuery();
  770. $this->assertEquals($q1, $q2, 'with() can be used after a call to useFkQuery() with no alias');
  771. }
  772. public function testPrune()
  773. {
  774. $q = BookQuery::create()->prune();
  775. $this->assertTrue($q instanceof BookQuery, 'prune() returns the current Query object');
  776. }
  777. public function testPruneSimpleKey()
  778. {
  779. BookstoreDataPopulator::depopulate();
  780. BookstoreDataPopulator::populate();
  781. $nbBooks = BookQuery::create()->prune()->count();
  782. $this->assertEquals(4, $nbBooks, 'prune() does nothing when passed a null object');
  783. $testBook = BookQuery::create()->findOne();
  784. $nbBooks = BookQuery::create()->prune($testBook)->count();
  785. $this->assertEquals(3, $nbBooks, 'prune() removes an object from the result');
  786. }
  787. public function testPruneCompositeKey()
  788. {
  789. BookstoreDataPopulator::depopulate();
  790. BookstoreDataPopulator::populate();
  791. // save all books to make sure related objects are also saved - BookstoreDataPopulator keeps some unsaved
  792. $c = new ModelCriteria('bookstore', 'Book');
  793. $books = $c->find();
  794. foreach ($books as $book) {
  795. $book->save();
  796. }
  797. BookPeer::clearInstancePool();
  798. $nbBookListRel = BookListRelQuery::create()->prune()->count();
  799. $this->assertEquals(2, $nbBookListRel, 'prune() does nothing when passed a null object');
  800. $testBookListRel = BookListRelQuery::create()->findOne();
  801. $nbBookListRel = BookListRelQuery::create()->prune($testBookListRel)->count();
  802. $this->assertEquals(1, $nbBookListRel, 'prune() removes an object from the result');
  803. }
  804. }
  805. class myCustomBookQuery extends BookQuery
  806. {
  807. public static function create($modelAlias = null, $criteria = null)
  808. {
  809. if ($criteria instanceof myCustomBookQuery) {
  810. return $criteria;
  811. }
  812. $query = new myCustomBookQuery();
  813. if (null !== $modelAlias) {
  814. $query->setModelAlias($modelAlias);
  815. }
  816. if ($criteria instanceof Criteria) {
  817. $query->mergeWith($criteria);
  818. }
  819. return $query;
  820. }
  821. }