PageRenderTime 33ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 1ms

/forum/library/propel/tmp/test/testsuite/generator/builder/om/QueryBuilderTest.php

https://github.com/albrzykowski/zforum
PHP | 912 lines | 730 code | 150 blank | 32 comment | 3 complexity | 720c3af2d01e1a66493953b0b5a2c79b 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 'tools/helpers/bookstore/BookstoreTestBase.php';
  10. require_once '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. }
  270. public function testFilterByIntegerPk()
  271. {
  272. $q = BookQuery::create()->filterById(12);
  273. $q1 = BookQuery::create()->add(BookPeer::ID, 12, Criteria::EQUAL);
  274. $this->assertEquals($q1, $q, 'filterByPkColumn() translates to a Criteria::EQUAL by default');
  275. $q = BookQuery::create()->filterById(12, Criteria::NOT_EQUAL);
  276. $q1 = BookQuery::create()->add(BookPeer::ID, 12, Criteria::NOT_EQUAL);
  277. $this->assertEquals($q1, $q, 'filterByPkColumn() accepts an optional comparison operator');
  278. $q = BookQuery::create()->setModelAlias('b', true)->filterById(12);
  279. $q1 = BookQuery::create()->setModelAlias('b', true)->add('b.ID', 12, Criteria::EQUAL);
  280. $this->assertEquals($q1, $q, 'filterByPkColumn() uses true table alias if set');
  281. $q = BookQuery::create()->filterById(array(10, 11, 12));
  282. $q1 = BookQuery::create()->add(BookPeer::ID, array(10, 11, 12), Criteria::IN);
  283. $this->assertEquals($q1, $q, 'filterByPkColumn() translates to a Criteria::IN when passed a simple array key');
  284. $q = BookQuery::create()->filterById(array(10, 11, 12), Criteria::NOT_IN);
  285. $q1 = BookQuery::create()->add(BookPeer::ID, array(10, 11, 12), Criteria::NOT_IN);
  286. $this->assertEquals($q1, $q, 'filterByPkColumn() accepts a comparison when passed a simple array key');
  287. }
  288. public function testFilterByNumber()
  289. {
  290. $q = BookQuery::create()->filterByPrice(12);
  291. $q1 = BookQuery::create()->add(BookPeer::PRICE, 12, Criteria::EQUAL);
  292. $this->assertEquals($q1, $q, 'filterByNumColumn() translates to a Criteria::EQUAL by default');
  293. $q = BookQuery::create()->filterByPrice(12, Criteria::NOT_EQUAL);
  294. $q1 = BookQuery::create()->add(BookPeer::PRICE, 12, Criteria::NOT_EQUAL);
  295. $this->assertEquals($q1, $q, 'filterByNumColumn() accepts an optional comparison operator');
  296. $q = BookQuery::create()->setModelAlias('b', true)->filterByPrice(12);
  297. $q1 = BookQuery::create()->setModelAlias('b', true)->add('b.PRICE', 12, Criteria::EQUAL);
  298. $this->assertEquals($q1, $q, 'filterByNumColumn() uses true table alias if set');
  299. $q = BookQuery::create()->filterByPrice(array(10, 11, 12));
  300. $q1 = BookQuery::create()->add(BookPeer::PRICE, array(10, 11, 12), Criteria::IN);
  301. $this->assertEquals($q1, $q, 'filterByNumColumn() translates to a Criteria::IN when passed a simple array key');
  302. $q = BookQuery::create()->filterByPrice(array(10, 11, 12), Criteria::NOT_IN);
  303. $q1 = BookQuery::create()->add(BookPeer::PRICE, array(10, 11, 12), Criteria::NOT_IN);
  304. $this->assertEquals($q1, $q, 'filterByNumColumn() accepts a comparison when passed a simple array key');
  305. $q = BookQuery::create()->filterByPrice(array('min' => 10));
  306. $q1 = BookQuery::create()->add(BookPeer::PRICE, 10, Criteria::GREATER_EQUAL);
  307. $this->assertEquals($q1, $q, 'filterByNumColumn() translates to a Criteria::GREATER_EQUAL when passed a \'min\' key');
  308. $q = BookQuery::create()->filterByPrice(array('max' => 12));
  309. $q1 = BookQuery::create()->add(BookPeer::PRICE, 12, Criteria::LESS_EQUAL);
  310. $this->assertEquals($q1, $q, 'filterByNumColumn() translates to a Criteria::LESS_EQUAL when passed a \'max\' key');
  311. $q = BookQuery::create()->filterByPrice(array('min' => 10, 'max' => 12));
  312. $q1 = BookQuery::create()
  313. ->add(BookPeer::PRICE, 10, Criteria::GREATER_EQUAL)
  314. ->addAnd(BookPeer::PRICE, 12, Criteria::LESS_EQUAL);
  315. $this->assertEquals($q1, $q, 'filterByNumColumn() translates to a between when passed both a \'min\' and a \'max\' key');
  316. }
  317. public function testFilterByTimestamp()
  318. {
  319. $q = BookstoreEmployeeAccountQuery::create()->filterByCreated(12);
  320. $q1 = BookstoreEmployeeAccountQuery::create()->add(BookstoreEmployeeAccountPeer::CREATED, 12, Criteria::EQUAL);
  321. $this->assertEquals($q1, $q, 'filterByDateColumn() translates to a Criteria::EQUAL by default');
  322. $q = BookstoreEmployeeAccountQuery::create()->filterByCreated(12, Criteria::NOT_EQUAL);
  323. $q1 = BookstoreEmployeeAccountQuery::create()->add(BookstoreEmployeeAccountPeer::CREATED, 12, Criteria::NOT_EQUAL);
  324. $this->assertEquals($q1, $q, 'filterByDateColumn() accepts an optional comparison operator');
  325. $q = BookstoreEmployeeAccountQuery::create()->setModelAlias('b', true)->filterByCreated(12);
  326. $q1 = BookstoreEmployeeAccountQuery::create()->setModelAlias('b', true)->add('b.CREATED', 12, Criteria::EQUAL);
  327. $this->assertEquals($q1, $q, 'filterByDateColumn() uses true table alias if set');
  328. $q = BookstoreEmployeeAccountQuery::create()->filterByCreated(array('min' => 10));
  329. $q1 = BookstoreEmployeeAccountQuery::create()->add(BookstoreEmployeeAccountPeer::CREATED, 10, Criteria::GREATER_EQUAL);
  330. $this->assertEquals($q1, $q, 'filterByDateColumn() translates to a Criteria::GREATER_EQUAL when passed a \'min\' key');
  331. $q = BookstoreEmployeeAccountQuery::create()->filterByCreated(array('max' => 12));
  332. $q1 = BookstoreEmployeeAccountQuery::create()->add(BookstoreEmployeeAccountPeer::CREATED, 12, Criteria::LESS_EQUAL);
  333. $this->assertEquals($q1, $q, 'filterByDateColumn() translates to a Criteria::LESS_EQUAL when passed a \'max\' key');
  334. $q = BookstoreEmployeeAccountQuery::create()->filterByCreated(array('min' => 10, 'max' => 12));
  335. $q1 = BookstoreEmployeeAccountQuery::create()
  336. ->add(BookstoreEmployeeAccountPeer::CREATED, 10, Criteria::GREATER_EQUAL)
  337. ->addAnd(BookstoreEmployeeAccountPeer::CREATED, 12, Criteria::LESS_EQUAL);
  338. $this->assertEquals($q1, $q, 'filterByDateColumn() translates to a between when passed both a \'min\' and a \'max\' key');
  339. }
  340. public function testFilterByString()
  341. {
  342. $q = BookQuery::create()->filterByTitle('foo');
  343. $q1 = BookQuery::create()->add(BookPeer::TITLE, 'foo', Criteria::EQUAL);
  344. $this->assertEquals($q1, $q, 'filterByStringColumn() translates to a Criteria::EQUAL by default');
  345. $q = BookQuery::create()->filterByTitle('foo', Criteria::NOT_EQUAL);
  346. $q1 = BookQuery::create()->add(BookPeer::TITLE, 'foo', Criteria::NOT_EQUAL);
  347. $this->assertEquals($q1, $q, 'filterByStringColumn() accepts an optional comparison operator');
  348. $q = BookQuery::create()->setModelAlias('b', true)->filterByTitle('foo');
  349. $q1 = BookQuery::create()->setModelAlias('b', true)->add('b.TITLE', 'foo', Criteria::EQUAL);
  350. $this->assertEquals($q1, $q, 'filterByStringColumn() uses true table alias if set');
  351. $q = BookQuery::create()->filterByTitle(array('foo', 'bar'));
  352. $q1 = BookQuery::create()->add(BookPeer::TITLE, array('foo', 'bar'), Criteria::IN);
  353. $this->assertEquals($q1, $q, 'filterByStringColumn() translates to a Criteria::IN when passed an array');
  354. $q = BookQuery::create()->filterByTitle(array('foo', 'bar'), Criteria::NOT_IN);
  355. $q1 = BookQuery::create()->add(BookPeer::TITLE, array('foo', 'bar'), Criteria::NOT_IN);
  356. $this->assertEquals($q1, $q, 'filterByStringColumn() accepts a comparison when passed an array');
  357. $q = BookQuery::create()->filterByTitle('foo%');
  358. $q1 = BookQuery::create()->add(BookPeer::TITLE, 'foo%', Criteria::LIKE);
  359. $this->assertEquals($q1, $q, 'filterByStringColumn() translates to a Criteria::LIKE when passed a string with a % wildcard');
  360. $q = BookQuery::create()->filterByTitle('foo%', Criteria::NOT_LIKE);
  361. $q1 = BookQuery::create()->add(BookPeer::TITLE, 'foo%', Criteria::NOT_LIKE);
  362. $this->assertEquals($q1, $q, 'filterByStringColumn() accepts a comparison when passed a string with a % wildcard');
  363. $q = BookQuery::create()->filterByTitle('foo%', Criteria::EQUAL);
  364. $q1 = BookQuery::create()->add(BookPeer::TITLE, 'foo%', Criteria::EQUAL);
  365. $this->assertEquals($q1, $q, 'filterByStringColumn() accepts a comparison when passed a string with a % wildcard');
  366. $q = BookQuery::create()->filterByTitle('*foo');
  367. $q1 = BookQuery::create()->add(BookPeer::TITLE, '%foo', Criteria::LIKE);
  368. $this->assertEquals($q1, $q, 'filterByStringColumn() translates to a Criteria::LIKE when passed a string with a * wildcard, and turns * into %');
  369. $q = BookQuery::create()->filterByTitle('*f%o*o%');
  370. $q1 = BookQuery::create()->add(BookPeer::TITLE, '%f%o%o%', Criteria::LIKE);
  371. $this->assertEquals($q1, $q, 'filterByStringColumn() translates to a Criteria::LIKE when passed a string with mixed wildcards, and turns *s into %s');
  372. }
  373. public function testFilterByBoolean()
  374. {
  375. $q = ReviewQuery::create()->filterByRecommended(true);
  376. $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, true, Criteria::EQUAL);
  377. $this->assertEquals($q1, $q, 'filterByBooleanColumn() translates to a Criteria::EQUAL by default');
  378. $q = ReviewQuery::create()->filterByRecommended(true, Criteria::NOT_EQUAL);
  379. $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, true, Criteria::NOT_EQUAL);
  380. $this->assertEquals($q1, $q, 'filterByBooleanColumn() accepts an optional comparison operator');
  381. $q = ReviewQuery::create()->filterByRecommended(false);
  382. $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, false, Criteria::EQUAL);
  383. $this->assertEquals($q1, $q, 'filterByBooleanColumn() translates to a Criteria::EQUAL by default');
  384. $q = ReviewQuery::create()->setModelAlias('b', true)->filterByRecommended(true);
  385. $q1 = ReviewQuery::create()->setModelAlias('b', true)->add('b.RECOMMENDED', true, Criteria::EQUAL);
  386. $this->assertEquals($q1, $q, 'filterByBooleanColumn() uses true table alias if set');
  387. $q = ReviewQuery::create()->filterByRecommended('true');
  388. $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, true, Criteria::EQUAL);
  389. $this->assertEquals($q1, $q, 'filterByBooleanColumn() translates to a = true when passed a true string');
  390. $q = ReviewQuery::create()->filterByRecommended('yes');
  391. $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, true, Criteria::EQUAL);
  392. $this->assertEquals($q1, $q, 'filterByBooleanColumn() translates to a = true when passed a true string');
  393. $q = ReviewQuery::create()->filterByRecommended('1');
  394. $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, true, Criteria::EQUAL);
  395. $this->assertEquals($q1, $q, 'filterByBooleanColumn() translates to a = true when passed a true string');
  396. $q = ReviewQuery::create()->filterByRecommended('false');
  397. $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, false, Criteria::EQUAL);
  398. $this->assertEquals($q1, $q, 'filterByBooleanColumn() translates to a = false when passed a false string');
  399. $q = ReviewQuery::create()->filterByRecommended('no');
  400. $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, false, Criteria::EQUAL);
  401. $this->assertEquals($q1, $q, 'filterByBooleanColumn() translates to a = false when passed a false string');
  402. $q = ReviewQuery::create()->filterByRecommended('0');
  403. $q1 = ReviewQuery::create()->add(ReviewPeer::RECOMMENDED, false, Criteria::EQUAL);
  404. $this->assertEquals($q1, $q, 'filterByBooleanColumn() translates to a = false when passed a false string');
  405. }
  406. public function testFilterByFk()
  407. {
  408. $this->assertTrue(method_exists('BookQuery', 'filterByAuthor'), 'QueryBuilder adds filterByFk() methods');
  409. $this->assertTrue(method_exists('BookQuery', 'filterByPublisher'), 'QueryBuilder adds filterByFk() methods for all fkeys');
  410. $this->assertTrue(method_exists('EssayQuery', 'filterByAuthorRelatedByFirstAuthor'), 'QueryBuilder adds filterByFk() methods for several fkeys on the same table');
  411. $this->assertTrue(method_exists('EssayQuery', 'filterByAuthorRelatedBySecondAuthor'), 'QueryBuilder adds filterByFk() methods for several fkeys on the same table');
  412. }
  413. public function testFilterByFkSimpleKey()
  414. {
  415. BookstoreDataPopulator::depopulate();
  416. BookstoreDataPopulator::populate();
  417. // prepare the test data
  418. $testBook = BookQuery::create()
  419. ->innerJoin('Book.Author') // just in case there are books with no author
  420. ->findOne();
  421. $testAuthor = $testBook->getAuthor();
  422. $book = BookQuery::create()
  423. ->filterByAuthor($testAuthor)
  424. ->findOne();
  425. $this->assertEquals($testBook, $book, 'Generated query handles filterByFk() methods correctly for simple fkeys');
  426. $q = BookQuery::create()->filterByAuthor($testAuthor);
  427. $q1 = BookQuery::create()->add(BookPeer::AUTHOR_ID, $testAuthor->getId(), Criteria::EQUAL);
  428. $this->assertEquals($q1, $q, 'filterByFk() translates to a Criteria::EQUAL by default');
  429. $q = BookQuery::create()->filterByAuthor($testAuthor, Criteria::NOT_EQUAL);
  430. $q1 = BookQuery::create()->add(BookPeer::AUTHOR_ID, $testAuthor->getId(), Criteria::NOT_EQUAL);
  431. $this->assertEquals($q1, $q, 'filterByFk() accepts an optional comparison operator');
  432. }
  433. public function testFilterByFkCompositeKey()
  434. {
  435. BookstoreDataPopulator::depopulate();
  436. BookstoreDataPopulator::populate();
  437. BookstoreDataPopulator::populateOpinionFavorite();
  438. // prepare the test data
  439. $testOpinion = BookOpinionQuery::create()
  440. ->innerJoin('BookOpinion.ReaderFavorite') // just in case there are books with no author
  441. ->findOne();
  442. $testFavorite = $testOpinion->getReaderFavorite();
  443. $favorite = ReaderFavoriteQuery::create()
  444. ->filterByBookOpinion($testOpinion)
  445. ->findOne();
  446. $this->assertEquals($testFavorite, $favorite, 'Generated query handles filterByFk() methods correctly for composite fkeys');
  447. }
  448. public function testFilterByRefFk()
  449. {
  450. $this->assertTrue(method_exists('BookQuery', 'filterByReview'), 'QueryBuilder adds filterByRefFk() methods');
  451. $this->assertTrue(method_exists('BookQuery', 'filterByMedia'), 'QueryBuilder adds filterByRefFk() methods for all fkeys');
  452. $this->assertTrue(method_exists('AuthorQuery', 'filterByEssayRelatedByFirstAuthor'), 'QueryBuilder adds filterByRefFk() methods for several fkeys on the same table');
  453. $this->assertTrue(method_exists('AuthorQuery', 'filterByEssayRelatedBySecondAuthor'), 'QueryBuilder adds filterByRefFk() methods for several fkeys on the same table');
  454. }
  455. public function testFilterByRefFkSimpleKey()
  456. {
  457. BookstoreDataPopulator::depopulate();
  458. BookstoreDataPopulator::populate();
  459. // prepare the test data
  460. $testBook = BookQuery::create()
  461. ->innerJoin('Book.Author') // just in case there are books with no author
  462. ->findOne();
  463. $testAuthor = $testBook->getAuthor();
  464. $author = AuthorQuery::create()
  465. ->filterByBook($testBook)
  466. ->findOne();
  467. $this->assertEquals($testAuthor, $author, 'Generated query handles filterByRefFk() methods correctly for simple fkeys');
  468. $q = AuthorQuery::create()->filterByBook($testBook);
  469. $q1 = AuthorQuery::create()->add(AuthorPeer::ID, $testBook->getAuthorId(), Criteria::EQUAL);
  470. $this->assertEquals($q1, $q, 'filterByRefFk() translates to a Criteria::EQUAL by default');
  471. $q = AuthorQuery::create()->filterByBook($testBook, Criteria::NOT_EQUAL);
  472. $q1 = AuthorQuery::create()->add(AuthorPeer::ID, $testBook->getAuthorId(), Criteria::NOT_EQUAL);
  473. $this->assertEquals($q1, $q, 'filterByRefFk() accepts an optional comparison operator');
  474. }
  475. public function testFilterByRefFkCompositeKey()
  476. {
  477. BookstoreDataPopulator::depopulate();
  478. BookstoreDataPopulator::populate();
  479. BookstoreDataPopulator::populateOpinionFavorite();
  480. // prepare the test data
  481. $testOpinion = BookOpinionQuery::create()
  482. ->innerJoin('BookOpinion.ReaderFavorite') // just in case there are books with no author
  483. ->findOne();
  484. $testFavorite = $testOpinion->getReaderFavorite();
  485. $opinion = BookOpinionQuery::create()
  486. ->filterByReaderFavorite($testFavorite)
  487. ->findOne();
  488. $this->assertEquals($testOpinion, $opinion, 'Generated query handles filterByRefFk() methods correctly for composite fkeys');
  489. }
  490. public function testFilterByCrossFK()
  491. {
  492. $this->assertTrue(method_exists('BookQuery', 'filterByBookClubList'), 'Generated query handles filterByCrossRefFK() for many-to-many relationships');
  493. $this->assertFalse(method_exists('BookQuery', 'filterByBook'), 'Generated query handles filterByCrossRefFK() for many-to-many relationships');
  494. BookstoreDataPopulator::depopulate();
  495. BookstoreDataPopulator::populate();
  496. $blc1 = BookClubListQuery::create()->findOneByGroupLeader('Crazyleggs');
  497. $nbBooks = BookQuery::create()
  498. ->filterByBookClubList($blc1)
  499. ->count();
  500. $this->assertEquals(2, $nbBooks, 'Generated query handles filterByCrossRefFK() methods correctly');
  501. }
  502. public function testJoinFk()
  503. {
  504. $q = BookQuery::create()
  505. ->joinAuthor();
  506. $q1 = BookQuery::create()
  507. ->join('Book.Author', Criteria::LEFT_JOIN);
  508. $this->assertTrue($q->equals($q1), 'joinFk() translates to a left join on non-required columns');
  509. $q = ReviewQuery::create()
  510. ->joinBook();
  511. $q1 = ReviewQuery::create()
  512. ->join('Review.Book', Criteria::INNER_JOIN);
  513. $this->assertTrue($q->equals($q1), 'joinFk() translates to an inner join on required columns');
  514. $q = BookQuery::create()
  515. ->joinAuthor('a');
  516. $q1 = BookQuery::create()
  517. ->join('Book.Author a', Criteria::LEFT_JOIN);
  518. $this->assertTrue($q->equals($q1), 'joinFk() accepts a relation alias as first parameter');
  519. $q = BookQuery::create()
  520. ->joinAuthor('', Criteria::INNER_JOIN);
  521. $q1 = BookQuery::create()
  522. ->join('Book.Author', Criteria::INNER_JOIN);
  523. $this->assertTrue($q->equals($q1), 'joinFk() accepts a join type as second parameter');
  524. $q = EssayQuery::create()
  525. ->joinAuthorRelatedBySecondAuthor();
  526. $q1 = EssayQuery::create()
  527. ->join('Essay.AuthorRelatedBySecondAuthor', "INNER JOIN");
  528. $this->assertTrue($q->equals($q1), 'joinFk() translates to a "INNER JOIN" when this is defined as defaultJoin in the schema');
  529. }
  530. public function testJoinFkAlias()
  531. {
  532. $q = BookQuery::create('b')
  533. ->joinAuthor('a');
  534. $q1 = BookQuery::create('b')
  535. ->join('b.Author a', Criteria::LEFT_JOIN);
  536. $this->assertTrue($q->equals($q1), 'joinFk() works fine with table aliases');
  537. $q = BookQuery::create()
  538. ->setModelAlias('b', true)
  539. ->joinAuthor('a');
  540. $q1 = BookQuery::create()
  541. ->setModelAlias('b', true)
  542. ->join('b.Author a', Criteria::LEFT_JOIN);
  543. $this->assertTrue($q->equals($q1), 'joinFk() works fine with true table aliases');
  544. }
  545. public function testJoinRefFk()
  546. {
  547. $q = AuthorQuery::create()
  548. ->joinBook();
  549. $q1 = AuthorQuery::create()
  550. ->join('Author.Book', Criteria::LEFT_JOIN);
  551. $this->assertTrue($q->equals($q1), 'joinRefFk() translates to a left join on non-required columns');
  552. $q = BookQuery::create()
  553. ->joinreview();
  554. $q1 = BookQuery::create()
  555. ->join('Book.Review', Criteria::INNER_JOIN);
  556. $this->assertTrue($q->equals($q1), 'joinRefFk() translates to an inner join on required columns');
  557. $q = AuthorQuery::create()
  558. ->joinBook('b');
  559. $q1 = AuthorQuery::create()
  560. ->join('Author.Book b', Criteria::LEFT_JOIN);
  561. $this->assertTrue($q->equals($q1), 'joinRefFk() accepts a relation alias as first parameter');
  562. $q = AuthorQuery::create()
  563. ->joinBook('', Criteria::INNER_JOIN);
  564. $q1 = AuthorQuery::create()
  565. ->join('Author.Book', Criteria::INNER_JOIN);
  566. $this->assertTrue($q->equals($q1), 'joinRefFk() accepts a join type as second parameter');
  567. $q = AuthorQuery::create()
  568. ->joinEssayRelatedBySecondAuthor();
  569. $q1 = AuthorQuery::create()
  570. ->join('Author.EssayRelatedBySecondAuthor', Criteria::INNER_JOIN);
  571. $this->assertTrue($q->equals($q1), 'joinRefFk() translates to a "INNER JOIN" when this is defined as defaultJoin in the schema');
  572. }
  573. public function testUseFkQuerySimple()
  574. {
  575. $q = BookQuery::create()
  576. ->useAuthorQuery()
  577. ->filterByFirstName('Leo')
  578. ->endUse();
  579. $q1 = BookQuery::create()
  580. ->join('Book.Author', Criteria::LEFT_JOIN)
  581. ->add(AuthorPeer::FIRST_NAME, 'Leo', Criteria::EQUAL);
  582. $this->assertTrue($q->equals($q1), 'useFkQuery() translates to a condition on a left join on non-required columns');
  583. $q = ReviewQuery::create()
  584. ->useBookQuery()
  585. ->filterByTitle('War And Peace')
  586. ->endUse();
  587. $q1 = ReviewQuery::create()
  588. ->join('Review.Book', Criteria::INNER_JOIN)
  589. ->add(BookPeer::TITLE, 'War And Peace', Criteria::EQUAL);
  590. $this->assertTrue($q->equals($q1), 'useFkQuery() translates to a condition on aninner join on required columns');
  591. }
  592. public function testUseFkQueryJoinType()
  593. {
  594. $q = BookQuery::create()
  595. ->useAuthorQuery(null, Criteria::LEFT_JOIN)
  596. ->filterByFirstName('Leo')
  597. ->endUse();
  598. $q1 = BookQuery::create()
  599. ->join('Book.Author', Criteria::LEFT_JOIN)
  600. ->add(AuthorPeer::FIRST_NAME, 'Leo', Criteria::EQUAL);
  601. $this->assertTrue($q->equals($q1), 'useFkQuery() accepts a join type as second parameter');
  602. }
  603. public function testUseFkQueryAlias()
  604. {
  605. $q = BookQuery::create()
  606. ->useAuthorQuery('a')
  607. ->filterByFirstName('Leo')
  608. ->endUse();
  609. $join = new ModelJoin();
  610. $join->setJoinType(Criteria::LEFT_JOIN);
  611. $join->setTableMap(AuthorPeer::getTableMap());
  612. $join->setRelationMap(BookPeer::getTableMap()->getRelation('Author'), null, 'a');
  613. $join->setRelationAlias('a');
  614. $q1 = BookQuery::create()
  615. ->addAlias('a', AuthorPeer::TABLE_NAME)
  616. ->addJoinObject($join, 'a')
  617. ->add('a.FIRST_NAME', 'Leo', Criteria::EQUAL);
  618. $this->assertTrue($q->equals($q1), 'useFkQuery() uses the first argument as a table alias');
  619. }
  620. public function testUseFkQueryMixed()
  621. {
  622. $q = BookQuery::create()
  623. ->useAuthorQuery()
  624. ->filterByFirstName('Leo')
  625. ->endUse()
  626. ->filterByTitle('War And Peace');
  627. $q1 = BookQuery::create()
  628. ->join('Book.Author', Criteria::LEFT_JOIN)
  629. ->add(AuthorPeer::FIRST_NAME, 'Leo', Criteria::EQUAL)
  630. ->add(BookPeer::TITLE, 'War And Peace', Criteria::EQUAL);
  631. $this->assertTrue($q->equals($q1), 'useFkQuery() allows combining conditions on main and related query');
  632. }
  633. public function testUseFkQueryTwice()
  634. {
  635. $q = BookQuery::create()
  636. ->useAuthorQuery()
  637. ->filterByFirstName('Leo')
  638. ->endUse()
  639. ->useAuthorQuery()
  640. ->filterByLastName('Tolstoi')
  641. ->endUse();
  642. $q1 = BookQuery::create()
  643. ->join('Book.Author', Criteria::LEFT_JOIN)
  644. ->add(AuthorPeer::FIRST_NAME, 'Leo', Criteria::EQUAL)
  645. ->add(AuthorPeer::LAST_NAME, 'Tolstoi', Criteria::EQUAL);
  646. $this->assertTrue($q->equals($q1), 'useFkQuery() called twice on the same relation does not create two joins');
  647. }
  648. public function testUseFkQueryTwiceTwoAliases()
  649. {
  650. $q = BookQuery::create()
  651. ->useAuthorQuery('a')
  652. ->filterByFirstName('Leo')
  653. ->endUse()
  654. ->useAuthorQuery('b')
  655. ->filterByLastName('Tolstoi')
  656. ->endUse();
  657. $join1 = new ModelJoin();
  658. $join1->setJoinType(Criteria::LEFT_JOIN);
  659. $join1->setTableMap(AuthorPeer::getTableMap());
  660. $join1->setRelationMap(BookPeer::getTableMap()->getRelation('Author'), null, 'a');
  661. $join1->setRelationAlias('a');
  662. $join2 = new ModelJoin();
  663. $join2->setJoinType(Criteria::LEFT_JOIN);
  664. $join2->setTableMap(AuthorPeer::getTableMap());
  665. $join2->setRelationMap(BookPeer::getTableMap()->getRelation('Author'), null, 'b');
  666. $join2->setRelationAlias('b');
  667. $q1 = BookQuery::create()
  668. ->addAlias('a', AuthorPeer::TABLE_NAME)
  669. ->addJoinObject($join1, 'a')
  670. ->add('a.FIRST_NAME', 'Leo', Criteria::EQUAL)
  671. ->addAlias('b', AuthorPeer::TABLE_NAME)
  672. ->addJoinObject($join2, 'b')
  673. ->add('b.LAST_NAME', 'Tolstoi', Criteria::EQUAL);
  674. $this->assertTrue($q->equals($q1), 'useFkQuery() called twice on the same relation with two aliases creates two joins');
  675. }
  676. public function testUseFkQueryNested()
  677. {
  678. $q = ReviewQuery::create()
  679. ->useBookQuery()
  680. ->useAuthorQuery()
  681. ->filterByFirstName('Leo')
  682. ->endUse()
  683. ->endUse();
  684. $q1 = ReviewQuery::create()
  685. ->join('Review.Book', Criteria::INNER_JOIN)
  686. ->join('Book.Author', Criteria::LEFT_JOIN)
  687. ->add(AuthorPeer::FIRST_NAME, 'Leo', Criteria::EQUAL);
  688. // embedded queries create joins that keep a relation to the parent
  689. // as this is not testable, we need to use another testing technique
  690. $params = array();
  691. $result = BasePeer::createSelectSql($q, $params);
  692. $expectedParams = array();
  693. $expectedResult = BasePeer::createSelectSql($q1, $expectedParams);
  694. $this->assertEquals($expectedParams, $params, 'useFkQuery() called nested creates two joins');
  695. $this->assertEquals($expectedResult, $result, 'useFkQuery() called nested creates two joins');
  696. }
  697. public function testUseFkQueryTwoRelations()
  698. {
  699. $q = BookQuery::create()
  700. ->useAuthorQuery()
  701. ->filterByFirstName('Leo')
  702. ->endUse()
  703. ->usePublisherQuery()
  704. ->filterByName('Penguin')
  705. ->endUse();
  706. $q1 = BookQuery::create()
  707. ->join('Book.Author', Criteria::LEFT_JOIN)
  708. ->add(AuthorPeer::FIRST_NAME, 'Leo', Criteria::EQUAL)
  709. ->join('Book.Publisher', Criteria::LEFT_JOIN)
  710. ->add(PublisherPeer::NAME, 'Penguin', Criteria::EQUAL);
  711. $this->assertTrue($q->equals($q1), 'useFkQuery() called twice on two relations creates two joins');
  712. }
  713. public function testPrune()
  714. {
  715. $q = BookQuery::create()->prune();
  716. $this->assertTrue($q instanceof BookQuery, 'prune() returns the current Query object');
  717. }
  718. public function testPruneSimpleKey()
  719. {
  720. BookstoreDataPopulator::depopulate();
  721. BookstoreDataPopulator::populate();
  722. $nbBooks = BookQuery::create()->prune()->count();
  723. $this->assertEquals(4, $nbBooks, 'prune() does nothing when passed a null object');
  724. $testBook = BookQuery::create()->findOne();
  725. $nbBooks = BookQuery::create()->prune($testBook)->count();
  726. $this->assertEquals(3, $nbBooks, 'prune() removes an object from the result');
  727. }
  728. public function testPruneCompositeKey()
  729. {
  730. BookstoreDataPopulator::depopulate();
  731. BookstoreDataPopulator::populate();
  732. // save all books to make sure related objects are also saved - BookstoreDataPopulator keeps some unsaved
  733. $c = new ModelCriteria('bookstore', 'Book');
  734. $books = $c->find();
  735. foreach ($books as $book) {
  736. $book->save();
  737. }
  738. BookPeer::clearInstancePool();
  739. $nbBookListRel = BookListRelQuery::create()->prune()->count();
  740. $this->assertEquals(2, $nbBookListRel, 'prune() does nothing when passed a null object');
  741. $testBookListRel = BookListRelQuery::create()->findOne();
  742. $nbBookListRel = BookListRelQuery::create()->prune($testBookListRel)->count();
  743. $this->assertEquals(1, $nbBookListRel, 'prune() removes an object from the result');
  744. }
  745. }
  746. class myCustomBookQuery extends BookQuery
  747. {
  748. public static function create($modelAlias = null, $criteria = null)
  749. {
  750. if ($criteria instanceof myCustomBookQuery) {
  751. return $criteria;
  752. }
  753. $query = new myCustomBookQuery();
  754. if (null !== $modelAlias) {
  755. $query->setModelAlias($modelAlias);
  756. }
  757. if ($criteria instanceof Criteria) {
  758. $query->mergeWith($criteria);
  759. }
  760. return $query;
  761. }
  762. }