PageRenderTime 49ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/test/testsuite/runtime/query/CriteriaTest.php

https://github.com/1989gaurav/Propel
PHP | 1063 lines | 778 code | 180 blank | 105 comment | 0 complexity | c8a47afa074b4966e370edf9ae9bcfca 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. /**
  11. * Test class for Criteria.
  12. *
  13. * @author <a href="mailto:celkins@scardini.com">Christopher Elkins</a>
  14. * @author <a href="mailto:sam@neurogrid.com">Sam Joseph</a>
  15. * @version $Id$
  16. * @package runtime.query
  17. */
  18. class CriteriaTest extends BookstoreTestBase
  19. {
  20. /**
  21. * The criteria to use in the test.
  22. * @var Criteria
  23. */
  24. private $c;
  25. /**
  26. * DB adapter saved for later.
  27. *
  28. * @var DBAdapter
  29. */
  30. private $savedAdapter;
  31. protected function setUp()
  32. {
  33. parent::setUp();
  34. $this->c = new Criteria();
  35. $this->savedAdapter = Propel::getDB(null);
  36. Propel::setDB(null, new DBSQLite());
  37. }
  38. protected function tearDown()
  39. {
  40. Propel::setDB(null, $this->savedAdapter);
  41. parent::tearDown();
  42. }
  43. /**
  44. * Test basic adding of strings.
  45. */
  46. public function testAddString()
  47. {
  48. $table = "myTable";
  49. $column = "myColumn";
  50. $value = "myValue";
  51. // Add the string
  52. $this->c->add($table . '.' . $column, $value);
  53. // Verify that the key exists
  54. $this->assertTrue($this->c->containsKey($table . '.' . $column));
  55. // Verify that what we get out is what we put in
  56. $this->assertTrue($this->c->getValue($table . '.' . $column) === $value);
  57. }
  58. /**
  59. * Test basic adding of strings for table with explicit schema.
  60. */
  61. public function testAddStringWithSchemas()
  62. {
  63. $table = "mySchema.myTable";
  64. $column = "myColumn";
  65. $value = "myValue";
  66. // Add the string
  67. $this->c->add($table . '.' . $column, $value);
  68. // Verify that the key exists
  69. $this->assertTrue($this->c->containsKey($table . '.' . $column));
  70. // Verify that what we get out is what we put in
  71. $this->assertTrue($this->c->getValue($table . '.' . $column) === $value);
  72. }
  73. public function testAddAndSameColumns()
  74. {
  75. $table1 = "myTable1";
  76. $column1 = "myColumn1";
  77. $value1 = "myValue1";
  78. $key1 = "$table1.$column1";
  79. $table2 = "myTable1";
  80. $column2 = "myColumn1";
  81. $value2 = "myValue2";
  82. $key2 = "$table2.$column2";
  83. $this->c->add($key1, $value1, Criteria::EQUAL);
  84. $this->c->addAnd($key2, $value2, Criteria::EQUAL);
  85. $expect = "SELECT FROM myTable1 WHERE (myTable1.myColumn1=:p1 AND myTable1.myColumn1=:p2)";
  86. $params = array();
  87. $result = BasePeer::createSelectSql($this->c, $params);
  88. $expect_params = array(
  89. array('table' => 'myTable1', 'column' => 'myColumn1', 'value' => 'myValue1'),
  90. array('table' => 'myTable1', 'column' => 'myColumn1', 'value' => 'myValue2'),
  91. );
  92. $this->assertEquals($expect, $result, 'addAnd() called on an existing column creates a combined criterion');
  93. $this->assertEquals($expect_params, $params, 'addAnd() called on an existing column creates a combined criterion');
  94. }
  95. public function testAddAndSameColumnsPropel14Compatibility()
  96. {
  97. $table1 = "myTable1";
  98. $column1 = "myColumn1";
  99. $value1 = "myValue1";
  100. $key1 = "$table1.$column1";
  101. $table2 = "myTable1";
  102. $column2 = "myColumn1";
  103. $value2 = "myValue2";
  104. $key2 = "$table2.$column2";
  105. $table3 = "myTable3";
  106. $column3 = "myColumn3";
  107. $value3 = "myValue3";
  108. $key3 = "$table3.$column3";
  109. $this->c->add($key1, $value1, Criteria::EQUAL);
  110. $this->c->add($key3, $value3, Criteria::EQUAL);
  111. $this->c->addAnd($key2, $value2, Criteria::EQUAL);
  112. $expect = "SELECT FROM myTable1, myTable3 WHERE (myTable1.myColumn1=:p1 AND myTable1.myColumn1=:p2) AND myTable3.myColumn3=:p3";
  113. $params = array();
  114. $result = BasePeer::createSelectSql($this->c, $params);
  115. $expect_params = array(
  116. array('table' => 'myTable1', 'column' => 'myColumn1', 'value' => 'myValue1'),
  117. array('table' => 'myTable1', 'column' => 'myColumn1', 'value' => 'myValue2'),
  118. array('table' => 'myTable3', 'column' => 'myColumn3', 'value' => 'myValue3'),
  119. );
  120. $this->assertEquals($expect, $result, 'addAnd() called on an existing column creates a combined criterion');
  121. $this->assertEquals($expect_params, $params, 'addAnd() called on an existing column creates a combined criterion');
  122. }
  123. public function testAddAndDistinctColumns()
  124. {
  125. $table1 = "myTable1";
  126. $column1 = "myColumn1";
  127. $value1 = "myValue1";
  128. $key1 = "$table1.$column1";
  129. $table2 = "myTable2";
  130. $column2 = "myColumn2";
  131. $value2 = "myValue2";
  132. $key2 = "$table2.$column2";
  133. $this->c->add($key1, $value1, Criteria::EQUAL);
  134. $this->c->addAnd($key2, $value2, Criteria::EQUAL);
  135. $expect = "SELECT FROM myTable1, myTable2 WHERE myTable1.myColumn1=:p1 AND myTable2.myColumn2=:p2";
  136. $params = array();
  137. $result = BasePeer::createSelectSql($this->c, $params);
  138. $expect_params = array(
  139. array('table' => 'myTable1', 'column' => 'myColumn1', 'value' => 'myValue1'),
  140. array('table' => 'myTable2', 'column' => 'myColumn2', 'value' => 'myValue2'),
  141. );
  142. $this->assertEquals($expect, $result, 'addAnd() called on a distinct column adds a criterion to the criteria');
  143. $this->assertEquals($expect_params, $params, 'addAnd() called on a distinct column adds a criterion to the criteria');
  144. }
  145. public function testAddOrSameColumns()
  146. {
  147. $table1 = "myTable1";
  148. $column1 = "myColumn1";
  149. $value1 = "myValue1";
  150. $key1 = "$table1.$column1";
  151. $table2 = "myTable1";
  152. $column2 = "myColumn1";
  153. $value2 = "myValue2";
  154. $key2 = "$table2.$column2";
  155. $this->c->add($key1, $value1, Criteria::EQUAL);
  156. $this->c->addOr($key2, $value2, Criteria::EQUAL);
  157. $expect = "SELECT FROM myTable1 WHERE (myTable1.myColumn1=:p1 OR myTable1.myColumn1=:p2)";
  158. $params = array();
  159. $result = BasePeer::createSelectSql($this->c, $params);
  160. $expect_params = array(
  161. array('table' => 'myTable1', 'column' => 'myColumn1', 'value' => 'myValue1'),
  162. array('table' => 'myTable1', 'column' => 'myColumn1', 'value' => 'myValue2'),
  163. );
  164. $this->assertEquals($expect, $result, 'addOr() called on an existing column creates a combined criterion');
  165. $this->assertEquals($expect_params, $params, 'addOr() called on an existing column creates a combined criterion');
  166. }
  167. public function testAddAndOrColumnsPropel14Compatibility()
  168. {
  169. $table1 = "myTable1";
  170. $column1 = "myColumn1";
  171. $value1 = "myValue1";
  172. $key1 = "$table1.$column1";
  173. $table2 = "myTable1";
  174. $column2 = "myColumn1";
  175. $value2 = "myValue2";
  176. $key2 = "$table2.$column2";
  177. $table3 = "myTable3";
  178. $column3 = "myColumn3";
  179. $value3 = "myValue3";
  180. $key3 = "$table3.$column3";
  181. $this->c->add($key1, $value1, Criteria::EQUAL);
  182. $this->c->add($key3, $value3, Criteria::EQUAL);
  183. $this->c->addOr($key2, $value2, Criteria::EQUAL);
  184. $expect = "SELECT FROM myTable1, myTable3 WHERE (myTable1.myColumn1=:p1 OR myTable1.myColumn1=:p2) AND myTable3.myColumn3=:p3";
  185. $params = array();
  186. $result = BasePeer::createSelectSql($this->c, $params);
  187. $expect_params = array(
  188. array('table' => 'myTable1', 'column' => 'myColumn1', 'value' => 'myValue1'),
  189. array('table' => 'myTable1', 'column' => 'myColumn1', 'value' => 'myValue2'),
  190. array('table' => 'myTable3', 'column' => 'myColumn3', 'value' => 'myValue3'),
  191. );
  192. $this->assertEquals($expect, $result, 'addOr() called on an existing column creates a combined criterion');
  193. $this->assertEquals($expect_params, $params, 'addOr() called on an existing column creates a combined criterion');
  194. }
  195. public function testAddOrDistinctColumns()
  196. {
  197. $table1 = "myTable1";
  198. $column1 = "myColumn1";
  199. $value1 = "myValue1";
  200. $key1 = "$table1.$column1";
  201. $table2 = "myTable2";
  202. $column2 = "myColumn2";
  203. $value2 = "myValue2";
  204. $key2 = "$table2.$column2";
  205. $this->c->add($key1, $value1, Criteria::EQUAL);
  206. $this->c->addOr($key2, $value2, Criteria::EQUAL);
  207. $expect = "SELECT FROM myTable1, myTable2 WHERE (myTable1.myColumn1=:p1 OR myTable2.myColumn2=:p2)";
  208. $params = array();
  209. $result = BasePeer::createSelectSql($this->c, $params);
  210. $expect_params = array(
  211. array('table' => 'myTable1', 'column' => 'myColumn1', 'value' => 'myValue1'),
  212. array('table' => 'myTable2', 'column' => 'myColumn2', 'value' => 'myValue2'),
  213. );
  214. $this->assertEquals($expect, $result, 'addOr() called on a distinct column adds a criterion to the latest criterion');
  215. $this->assertEquals($expect_params, $params, 'addOr() called on a distinct column adds a criterion to the latest criterion');
  216. }
  217. public function testAddOrEmptyCriteria()
  218. {
  219. $table1 = "myTable1";
  220. $column1 = "myColumn1";
  221. $value1 = "myValue1";
  222. $key1 = "$table1.$column1";
  223. $this->c->addOr($key1, $value1, Criteria::EQUAL);
  224. $expect = "SELECT FROM myTable1 WHERE myTable1.myColumn1=:p1";
  225. $params = array();
  226. $result = BasePeer::createSelectSql($this->c, $params);
  227. $expect_params = array(
  228. array('table' => 'myTable1', 'column' => 'myColumn1', 'value' => 'myValue1'),
  229. );
  230. $this->assertEquals($expect, $result, 'addOr() called on an empty Criteria adds a criterion to the criteria');
  231. $this->assertEquals($expect_params, $params, 'addOr() called on an empty Criteria adds a criterion to the criteria');
  232. }
  233. /**
  234. * Test Criterion.setIgnoreCase().
  235. * As the output is db specific the test just prints the result to
  236. * System.out
  237. */
  238. public function testCriterionIgnoreCase()
  239. {
  240. $originalDB = Propel::getDB();
  241. $adapters = array(new DBMySQL(), new DBPostgres());
  242. $expectedIgnore = array("UPPER(TABLE.COLUMN) LIKE UPPER(:p1)", "TABLE.COLUMN ILIKE :p1");
  243. $i =0;
  244. foreach ($adapters as $adapter) {
  245. Propel::setDB(null, $adapter);
  246. $myCriteria = new Criteria();
  247. $myCriterion = $myCriteria->getNewCriterion(
  248. "TABLE.COLUMN", "FoObAr", Criteria::LIKE);
  249. $sb = "";
  250. $params=array();
  251. $myCriterion->appendPsTo($sb, $params);
  252. $expected = "TABLE.COLUMN LIKE :p1";
  253. $this->assertEquals($expected, $sb);
  254. $ignoreCriterion = $myCriterion->setIgnoreCase(true);
  255. $sb = "";
  256. $params=array();
  257. $ignoreCriterion->appendPsTo($sb, $params);
  258. // $expected = "UPPER(TABLE.COLUMN) LIKE UPPER(?)";
  259. $this->assertEquals($expectedIgnore[$i], $sb);
  260. $i++;
  261. }
  262. Propel::setDB(null, $originalDB);
  263. }
  264. public function testOrderByIgnoreCase()
  265. {
  266. $originalDB = Propel::getDB();
  267. Propel::setDB(null, new DBMySQL());
  268. $criteria = new Criteria();
  269. $criteria->setIgnoreCase(true);
  270. $criteria->addAscendingOrderByColumn(BookPeer::TITLE);
  271. BookPeer::addSelectColumns($criteria);
  272. $params=array();
  273. $sql = BasePeer::createSelectSql($criteria, $params);
  274. $expectedSQL = 'SELECT book.ID, book.TITLE, book.ISBN, book.PRICE, book.PUBLISHER_ID, book.AUTHOR_ID, UPPER(book.TITLE) FROM `book` ORDER BY UPPER(book.TITLE) ASC';
  275. $this->assertEquals($expectedSQL, $sql);
  276. Propel::setDB(null, $originalDB);
  277. }
  278. /**
  279. * Test that true is evaluated correctly.
  280. */
  281. public function testBoolean()
  282. {
  283. $this->c = new Criteria();
  284. $this->c->add("TABLE.COLUMN", true);
  285. $expect = "SELECT FROM TABLE WHERE TABLE.COLUMN=:p1";
  286. $expect_params = array( array('table' => 'TABLE', 'column' => 'COLUMN', 'value' => true),
  287. );
  288. try {
  289. $params = array();
  290. $result = BasePeer::createSelectSql($this->c, $params);
  291. } catch (PropelException $e) {
  292. $this->fail("PropelException thrown in BasePeer.createSelectSql(): ". $e->getMessage());
  293. }
  294. $this->assertEquals($expect, $result, "Boolean test failed.");
  295. $this->assertEquals($expect_params, $params);
  296. }
  297. public function testCurrentDate()
  298. {
  299. $this->c = new Criteria();
  300. $this->c->add("TABLE.TIME_COLUMN", Criteria::CURRENT_TIME);
  301. $this->c->add("TABLE.DATE_COLUMN", Criteria::CURRENT_DATE);
  302. $expect = "SELECT FROM TABLE WHERE TABLE.TIME_COLUMN=CURRENT_TIME AND TABLE.DATE_COLUMN=CURRENT_DATE";
  303. $result = null;
  304. try {
  305. $params = array();
  306. $result = BasePeer::createSelectSql($this->c, $params);
  307. } catch (PropelException $e) {
  308. print $e->getTraceAsString();
  309. $this->fail("PropelException thrown in BasePeer.createSelectSql(): ". $e->getMessage());
  310. }
  311. $this->assertEquals($expect, $result, "Current date test failed!");
  312. }
  313. public function testCountAster()
  314. {
  315. $this->c = new Criteria();
  316. $this->c->addSelectColumn("COUNT(*)");
  317. $this->c->add("TABLE.TIME_COLUMN", Criteria::CURRENT_TIME);
  318. $this->c->add("TABLE.DATE_COLUMN", Criteria::CURRENT_DATE);
  319. $expect = "SELECT COUNT(*) FROM TABLE WHERE TABLE.TIME_COLUMN=CURRENT_TIME AND TABLE.DATE_COLUMN=CURRENT_DATE";
  320. $result = null;
  321. try {
  322. $params = array();
  323. $result = BasePeer::createSelectSql($this->c, $params);
  324. } catch (PropelException $e) {
  325. print $e->getTraceAsString();
  326. $this->fail("PropelException thrown in BasePeer.createSelectSql(): ". $e->getMessage());
  327. }
  328. $this->assertEquals($expect, $result);
  329. }
  330. public function testIn()
  331. {
  332. $c = new Criteria();
  333. $c->addSelectColumn("*");
  334. $c->add("TABLE.SOME_COLUMN", array(), Criteria::IN);
  335. $c->add("TABLE.OTHER_COLUMN", array(1, 2, 3), Criteria::IN);
  336. $expect = "SELECT * FROM TABLE WHERE 1<>1 AND TABLE.OTHER_COLUMN IN (:p1,:p2,:p3)";
  337. try {
  338. $params = array();
  339. $result = BasePeer::createSelectSql($c, $params);
  340. } catch (PropelException $e) {
  341. print $e->getTraceAsString();
  342. $this->fail("PropelException thrown in BasePeer.createSelectSql(): ". $e->getMessage());
  343. }
  344. $this->assertEquals($expect, $result);
  345. }
  346. public function testInEmptyAfterFull()
  347. {
  348. $c = new Criteria();
  349. $c->addSelectColumn("*");
  350. $c->add("TABLE.OTHER_COLUMN", array(1, 2, 3), Criteria::IN);
  351. $c->add("TABLE.SOME_COLUMN", array(), Criteria::IN);
  352. $expect = "SELECT * FROM TABLE WHERE TABLE.OTHER_COLUMN IN (:p1,:p2,:p3) AND 1<>1";
  353. try {
  354. $params = array();
  355. $result = BasePeer::createSelectSql($c, $params);
  356. } catch (PropelException $e) {
  357. print $e->getTraceAsString();
  358. $this->fail("PropelException thrown in BasePeer.createSelectSql(): ". $e->getMessage());
  359. }
  360. $this->assertEquals($expect, $result);
  361. }
  362. public function testInNested()
  363. {
  364. // now do a nested logic test, just for sanity (not that this should be any surprise)
  365. $c = new Criteria();
  366. $c->addSelectColumn("*");
  367. $myCriterion = $c->getNewCriterion("TABLE.COLUMN", array(), Criteria::IN);
  368. $myCriterion->addOr($c->getNewCriterion("TABLE.COLUMN2", array(1,2), Criteria::IN));
  369. $c->add($myCriterion);
  370. $expect = "SELECT * FROM TABLE WHERE (1<>1 OR TABLE.COLUMN2 IN (:p1,:p2))";
  371. try {
  372. $params = array();
  373. $result = BasePeer::createSelectSql($c, $params);
  374. } catch (PropelException $e) {
  375. print $e->getTraceAsString();
  376. $this->fail("PropelException thrown in BasePeer.createSelectSql(): ". $e->getMessage());
  377. }
  378. $this->assertEquals($expect, $result);
  379. }
  380. public function testJoinObject ()
  381. {
  382. $j = new Join('TABLE_A.COL_1', 'TABLE_B.COL_2');
  383. $this->assertEquals('INNER JOIN', $j->getJoinType());
  384. $this->assertEquals('TABLE_A.COL_1', $j->getLeftColumn());
  385. $this->assertEquals('TABLE_A', $j->getLeftTableName());
  386. $this->assertEquals('COL_1', $j->getLeftColumnName());
  387. $this->assertEquals('TABLE_B.COL_2', $j->getRightColumn());
  388. $this->assertEquals('TABLE_B', $j->getRightTableName());
  389. $this->assertEquals('COL_2', $j->getRightColumnName());
  390. $j = new Join('TABLE_A.COL_1', 'TABLE_B.COL_1', Criteria::LEFT_JOIN);
  391. $this->assertEquals('LEFT JOIN', $j->getJoinType());
  392. $this->assertEquals('TABLE_A.COL_1', $j->getLeftColumn());
  393. $this->assertEquals('TABLE_B.COL_1', $j->getRightColumn());
  394. $j = new Join('TABLE_A.COL_1', 'TABLE_B.COL_1', Criteria::RIGHT_JOIN);
  395. $this->assertEquals('RIGHT JOIN', $j->getJoinType());
  396. $this->assertEquals('TABLE_A.COL_1', $j->getLeftColumn());
  397. $this->assertEquals('TABLE_B.COL_1', $j->getRightColumn());
  398. $j = new Join('TABLE_A.COL_1', 'TABLE_B.COL_1', Criteria::INNER_JOIN);
  399. $this->assertEquals('INNER JOIN', $j->getJoinType());
  400. $this->assertEquals('TABLE_A.COL_1', $j->getLeftColumn());
  401. $this->assertEquals('TABLE_B.COL_1', $j->getRightColumn());
  402. $j = new Join(array('TABLE_A.COL_1', 'TABLE_A.COL_2'), array('TABLE_B.COL_1', 'TABLE_B.COL_2'), Criteria::INNER_JOIN);
  403. $this->assertEquals('TABLE_A.COL_1', $j->getLeftColumn(0));
  404. $this->assertEquals('TABLE_A.COL_2', $j->getLeftColumn(1));
  405. $this->assertEquals('TABLE_B.COL_1', $j->getRightColumn(0));
  406. $this->assertEquals('TABLE_B.COL_2', $j->getRightColumn(1));
  407. }
  408. public function testAddStraightJoin ()
  409. {
  410. $c = new Criteria();
  411. $c->addSelectColumn("*");
  412. $c->addJoin('TABLE_A.COL_1', 'TABLE_B.COL_1'); // straight join
  413. $expect = "SELECT * FROM TABLE_A INNER JOIN TABLE_B ON (TABLE_A.COL_1=TABLE_B.COL_1)";
  414. try {
  415. $params = array();
  416. $result = BasePeer::createSelectSql($c, $params);
  417. } catch (PropelException $e) {
  418. print $e->getTraceAsString();
  419. $this->fail("PropelException thrown in BasePeer.createSelectSql(): ". $e->getMessage());
  420. }
  421. $this->assertEquals($expect, $result);
  422. }
  423. public function testAddSeveralJoins ()
  424. {
  425. $c = new Criteria();
  426. $c->addSelectColumn("*");
  427. $c->addJoin('TABLE_A.COL_1', 'TABLE_B.COL_1');
  428. $c->addJoin('TABLE_B.COL_X', 'TABLE_D.COL_X');
  429. $expect = 'SELECT * FROM TABLE_A INNER JOIN TABLE_B ON (TABLE_A.COL_1=TABLE_B.COL_1)'
  430. . ' INNER JOIN TABLE_D ON (TABLE_B.COL_X=TABLE_D.COL_X)';
  431. try {
  432. $params = array();
  433. $result = BasePeer::createSelectSql($c, $params);
  434. } catch (PropelException $e) {
  435. print $e->getTraceAsString();
  436. $this->fail("PropelException thrown in BasePeer.createSelectSql(): ". $e->getMessage());
  437. }
  438. $this->assertEquals($expect, $result);
  439. }
  440. public function testAddLeftJoin ()
  441. {
  442. $c = new Criteria();
  443. $c->addSelectColumn("TABLE_A.*");
  444. $c->addSelectColumn("TABLE_B.*");
  445. $c->addJoin('TABLE_A.COL_1', 'TABLE_B.COL_2', Criteria::LEFT_JOIN);
  446. $expect = "SELECT TABLE_A.*, TABLE_B.* FROM TABLE_A LEFT JOIN TABLE_B ON (TABLE_A.COL_1=TABLE_B.COL_2)";
  447. try {
  448. $params = array();
  449. $result = BasePeer::createSelectSql($c, $params);
  450. } catch (PropelException $e) {
  451. print $e->getTraceAsString();
  452. $this->fail("PropelException thrown in BasePeer.createSelectSql(): ". $e->getMessage());
  453. }
  454. $this->assertEquals($expect, $result);
  455. }
  456. public function testAddSeveralLeftJoins ()
  457. {
  458. // Fails.. Suspect answer in the chunk starting at BasePeer:605
  459. $c = new Criteria();
  460. $c->addSelectColumn('*');
  461. $c->addJoin('TABLE_A.COL_1', 'TABLE_B.COL_1', Criteria::LEFT_JOIN);
  462. $c->addJoin('TABLE_A.COL_2', 'TABLE_C.COL_2', Criteria::LEFT_JOIN);
  463. $expect = 'SELECT * FROM TABLE_A '
  464. .'LEFT JOIN TABLE_B ON (TABLE_A.COL_1=TABLE_B.COL_1) '
  465. .'LEFT JOIN TABLE_C ON (TABLE_A.COL_2=TABLE_C.COL_2)';
  466. try {
  467. $params = array();
  468. $result = BasePeer::createSelectSql($c, $params);
  469. } catch (PropelException $e) {
  470. print $e->getTraceAsString();
  471. $this->fail("PropelException thrown in BasePeer.createSelectSql(): ". $e->getMessage());
  472. }
  473. $this->assertEquals($expect, $result);
  474. }
  475. public function testAddRightJoin ()
  476. {
  477. $c = new Criteria();
  478. $c->addSelectColumn("*");
  479. $c->addJoin('TABLE_A.COL_1', 'TABLE_B.COL_2', Criteria::RIGHT_JOIN);
  480. $expect = "SELECT * FROM TABLE_A RIGHT JOIN TABLE_B ON (TABLE_A.COL_1=TABLE_B.COL_2)";
  481. try {
  482. $params = array();
  483. $result = BasePeer::createSelectSql($c, $params);
  484. } catch (PropelException $e) {
  485. print $e->getTraceAsString();
  486. $this->fail("PropelException thrown in BasePeer.createSelectSql(): ". $e->getMessage());
  487. }
  488. $this->assertEquals($expect, $result);
  489. }
  490. public function testAddSeveralRightJoins ()
  491. {
  492. // Fails.. Suspect answer in the chunk starting at BasePeer:605
  493. $c = new Criteria();
  494. $c->addSelectColumn('*');
  495. $c->addJoin('TABLE_A.COL_1', 'TABLE_B.COL_1', Criteria::RIGHT_JOIN);
  496. $c->addJoin('TABLE_A.COL_2', 'TABLE_C.COL_2', Criteria::RIGHT_JOIN);
  497. $expect = 'SELECT * FROM TABLE_A '
  498. .'RIGHT JOIN TABLE_B ON (TABLE_A.COL_1=TABLE_B.COL_1) '
  499. .'RIGHT JOIN TABLE_C ON (TABLE_A.COL_2=TABLE_C.COL_2)';
  500. try {
  501. $params = array();
  502. $result = BasePeer::createSelectSql($c, $params);
  503. } catch (PropelException $e) {
  504. print $e->getTraceAsString();
  505. $this->fail("PropelException thrown in BasePeer.createSelectSql(): ". $e->getMessage());
  506. }
  507. $this->assertEquals($expect, $result);
  508. }
  509. public function testAddInnerJoin ()
  510. {
  511. $c = new Criteria();
  512. $c->addSelectColumn("*");
  513. $c->addJoin('TABLE_A.COL_1', 'TABLE_B.COL_1', Criteria::INNER_JOIN);
  514. $expect = "SELECT * FROM TABLE_A INNER JOIN TABLE_B ON (TABLE_A.COL_1=TABLE_B.COL_1)";
  515. try {
  516. $params = array();
  517. $result = BasePeer::createSelectSql($c, $params);
  518. } catch (PropelException $e) {
  519. print $e->getTraceAsString();
  520. $this->fail("PropelException thrown in BasePeer.createSelectSql(): ". $e->getMessage());
  521. }
  522. $this->assertEquals($expect, $result);
  523. }
  524. public function testAddSeveralInnerJoin ()
  525. {
  526. $c = new Criteria();
  527. $c->addSelectColumn("*");
  528. $c->addJoin('TABLE_A.COL_1', 'TABLE_B.COL_1', Criteria::INNER_JOIN);
  529. $c->addJoin('TABLE_B.COL_1', 'TABLE_C.COL_1', Criteria::INNER_JOIN);
  530. $expect = 'SELECT * FROM TABLE_A '
  531. .'INNER JOIN TABLE_B ON (TABLE_A.COL_1=TABLE_B.COL_1) '
  532. .'INNER JOIN TABLE_C ON (TABLE_B.COL_1=TABLE_C.COL_1)';
  533. try {
  534. $params = array();
  535. $result = BasePeer::createSelectSql($c, $params);
  536. } catch (PropelException $e) {
  537. print $e->getTraceAsString();
  538. $this->fail("PropelException thrown in BasePeer.createSelectSql(): ". $e->getMessage());
  539. }
  540. $this->assertEquals($expect, $result);
  541. }
  542. /**
  543. * @link http://www.propelorm.org/ticket/451
  544. * @link http://www.propelorm.org/ticket/283#comment:8
  545. */
  546. public function testSeveralMixedJoinOrders()
  547. {
  548. $c = new Criteria();
  549. $c->clearSelectColumns()->
  550. addJoin("TABLE_A.FOO_ID", "TABLE_B.ID", Criteria::LEFT_JOIN)->
  551. addJoin("TABLE_A.BAR_ID", "TABLE_C.ID")->
  552. addSelectColumn("TABLE_A.ID");
  553. $expect = 'SELECT TABLE_A.ID FROM TABLE_A LEFT JOIN TABLE_B ON (TABLE_A.FOO_ID=TABLE_B.ID) INNER JOIN TABLE_C ON (TABLE_A.BAR_ID=TABLE_C.ID)';
  554. $params = array();
  555. $result = BasePeer::createSelectSql($c, $params);
  556. $this->assertEquals($expect, $result);
  557. }
  558. /**
  559. * @link http://propel.phpdb.org/trac/ticket/606
  560. */
  561. public function testAddJoinArray()
  562. {
  563. $c = new Criteria();
  564. $c->clearSelectColumns()->
  565. addJoin(array('TABLE_A.FOO_ID'), array('TABLE_B.ID'), Criteria::LEFT_JOIN)->
  566. addSelectColumn("TABLE_A.ID");
  567. $expect = 'SELECT TABLE_A.ID FROM TABLE_A LEFT JOIN TABLE_B ON TABLE_A.FOO_ID=TABLE_B.ID';
  568. $params = array();
  569. $result = BasePeer::createSelectSql($c, $params);
  570. $this->assertEquals($expect, $result);
  571. }
  572. /**
  573. * @link http://propel.phpdb.org/trac/ticket/606
  574. */
  575. public function testAddJoinArrayMultiple()
  576. {
  577. $c = new Criteria();
  578. $c->clearSelectColumns()->
  579. addJoin(
  580. array('TABLE_A.FOO_ID', 'TABLE_A.BAR'),
  581. array('TABLE_B.ID', 'TABLE_B.BAZ'),
  582. Criteria::LEFT_JOIN)->
  583. addSelectColumn("TABLE_A.ID");
  584. $expect = 'SELECT TABLE_A.ID FROM TABLE_A LEFT JOIN TABLE_B ON (TABLE_A.FOO_ID=TABLE_B.ID AND TABLE_A.BAR=TABLE_B.BAZ)';
  585. $params = array();
  586. $result = BasePeer::createSelectSql($c, $params);
  587. $this->assertEquals($expect, $result);
  588. }
  589. /**
  590. * Test the Criteria::addJoinMultiple() method with an implicit join
  591. *
  592. * @link http://propel.phpdb.org/trac/ticket/606
  593. */
  594. public function testAddJoinMultiple()
  595. {
  596. $c = new Criteria();
  597. $c->
  598. clearSelectColumns()->
  599. addMultipleJoin(array(
  600. array('TABLE_A.FOO_ID', 'TABLE_B.ID'),
  601. array('TABLE_A.BAR', 'TABLE_B.BAZ')))->
  602. addSelectColumn("TABLE_A.ID");
  603. $expect = 'SELECT TABLE_A.ID FROM TABLE_A INNER JOIN TABLE_B '
  604. . 'ON (TABLE_A.FOO_ID=TABLE_B.ID AND TABLE_A.BAR=TABLE_B.BAZ)';
  605. $params = array();
  606. $result = BasePeer::createSelectSql($c, $params);
  607. $this->assertEquals($expect, $result);
  608. }
  609. /**
  610. * Test the Criteria::addJoinMultiple() method with a value as second argument
  611. *
  612. * @link http://propel.phpdb.org/trac/ticket/606
  613. */
  614. public function testAddJoinMultipleValue()
  615. {
  616. $c = new Criteria();
  617. $c->
  618. clearSelectColumns()->
  619. addMultipleJoin(array(
  620. array('TABLE_A.FOO_ID', 'TABLE_B.ID'),
  621. array('TABLE_A.BAR', 3)))->
  622. addSelectColumn("TABLE_A.ID");
  623. $expect = 'SELECT TABLE_A.ID FROM TABLE_A INNER JOIN TABLE_B '
  624. . 'ON (TABLE_A.FOO_ID=TABLE_B.ID AND TABLE_A.BAR=3)';
  625. $params = array();
  626. $result = BasePeer::createSelectSql($c, $params);
  627. $this->assertEquals($expect, $result);
  628. }
  629. /**
  630. * Test the Criteria::addJoinMultiple() method with a joinType
  631. *
  632. * @link http://propel.phpdb.org/trac/ticket/606
  633. */
  634. public function testAddJoinMultipleWithJoinType()
  635. {
  636. $c = new Criteria();
  637. $c->
  638. clearSelectColumns()->
  639. addMultipleJoin(array(
  640. array('TABLE_A.FOO_ID', 'TABLE_B.ID'),
  641. array('TABLE_A.BAR', 'TABLE_B.BAZ')),
  642. Criteria::LEFT_JOIN)->
  643. addSelectColumn("TABLE_A.ID");
  644. $expect = 'SELECT TABLE_A.ID FROM TABLE_A '
  645. . 'LEFT JOIN TABLE_B ON (TABLE_A.FOO_ID=TABLE_B.ID AND TABLE_A.BAR=TABLE_B.BAZ)';
  646. $params = array();
  647. $result = BasePeer::createSelectSql($c, $params);
  648. $this->assertEquals($expect, $result);
  649. }
  650. /**
  651. * Test the Criteria::addJoinMultiple() method with operator
  652. *
  653. * @link http://propel.phpdb.org/trac/ticket/606
  654. */
  655. public function testAddJoinMultipleWithOperator()
  656. {
  657. $c = new Criteria();
  658. $c->
  659. clearSelectColumns()->
  660. addMultipleJoin(array(
  661. array('TABLE_A.FOO_ID', 'TABLE_B.ID', Criteria::GREATER_EQUAL),
  662. array('TABLE_A.BAR', 'TABLE_B.BAZ', Criteria::LESS_THAN)))->
  663. addSelectColumn("TABLE_A.ID");
  664. $expect = 'SELECT TABLE_A.ID FROM TABLE_A INNER JOIN TABLE_B '
  665. . 'ON (TABLE_A.FOO_ID>=TABLE_B.ID AND TABLE_A.BAR<TABLE_B.BAZ)';
  666. $params = array();
  667. $result = BasePeer::createSelectSql($c, $params);
  668. $this->assertEquals($expect, $result);
  669. }
  670. /**
  671. * Test the Criteria::addJoinMultiple() method with join type and operator
  672. *
  673. * @link http://propel.phpdb.org/trac/ticket/606
  674. */
  675. public function testAddJoinMultipleWithJoinTypeAndOperator()
  676. {
  677. $c = new Criteria();
  678. $c->
  679. clearSelectColumns()->
  680. addMultipleJoin(array(
  681. array('TABLE_A.FOO_ID', 'TABLE_B.ID', Criteria::GREATER_EQUAL),
  682. array('TABLE_A.BAR', 'TABLE_B.BAZ', Criteria::LESS_THAN)),
  683. Criteria::LEFT_JOIN)->
  684. addSelectColumn("TABLE_A.ID");
  685. $expect = 'SELECT TABLE_A.ID FROM TABLE_A '
  686. . 'LEFT JOIN TABLE_B ON (TABLE_A.FOO_ID>=TABLE_B.ID AND TABLE_A.BAR<TABLE_B.BAZ)';
  687. $params = array();
  688. $result = BasePeer::createSelectSql($c, $params);
  689. $this->assertEquals($expect, $result);
  690. }
  691. /**
  692. * Test the Criteria::CUSTOM behavior.
  693. */
  694. public function testCustomOperator()
  695. {
  696. $c = new Criteria();
  697. $c->addSelectColumn('A.COL');
  698. $c->add('A.COL', 'date_part(\'YYYY\', A.COL) = \'2007\'', Criteria::CUSTOM);
  699. $expected = "SELECT A.COL FROM A WHERE date_part('YYYY', A.COL) = '2007'";
  700. $params = array();
  701. $result = BasePeer::createSelectSql($c, $params);
  702. $this->assertEquals($expected, $result);
  703. }
  704. /**
  705. * Tests adding duplicate joins.
  706. * @link http://propel.phpdb.org/trac/ticket/613
  707. */
  708. public function testAddJoin_Duplicate()
  709. {
  710. $c = new Criteria();
  711. $c->addJoin("tbl.COL1", "tbl.COL2", Criteria::LEFT_JOIN);
  712. $c->addJoin("tbl.COL1", "tbl.COL2", Criteria::LEFT_JOIN);
  713. $this->assertEquals(1, count($c->getJoins()), "Expected not to have duplciate LJOIN added.");
  714. $c->addJoin("tbl.COL1", "tbl.COL2", Criteria::RIGHT_JOIN);
  715. $c->addJoin("tbl.COL1", "tbl.COL2", Criteria::RIGHT_JOIN);
  716. $this->assertEquals(2, count($c->getJoins()), "Expected 1 new right join to be added.");
  717. $c->addJoin("tbl.COL1", "tbl.COL2");
  718. $c->addJoin("tbl.COL1", "tbl.COL2");
  719. $this->assertEquals(3, count($c->getJoins()), "Expected 1 new implicit join to be added.");
  720. $c->addJoin("tbl.COL3", "tbl.COL4");
  721. $this->assertEquals(4, count($c->getJoins()), "Expected new col join to be added.");
  722. }
  723. /**
  724. * @link http://propel.phpdb.org/trac/ticket/634
  725. */
  726. public function testHasSelectClause()
  727. {
  728. $c = new Criteria();
  729. $c->addSelectColumn("foo");
  730. $this->assertTrue($c->hasSelectClause());
  731. $c = new Criteria();
  732. $c->addAsColumn("foo", "bar");
  733. $this->assertTrue($c->hasSelectClause());
  734. }
  735. /**
  736. * Tests including aliases in criterion objects.
  737. * @link http://propel.phpdb.org/trac/ticket/636
  738. */
  739. public function testAliasInCriterion()
  740. {
  741. $c = new Criteria();
  742. $c->addAsColumn("column_alias", "tbl.COL1");
  743. $crit = $c->getNewCriterion("column_alias", "FOO");
  744. $this->assertNull($crit->getTable());
  745. $this->assertEquals("column_alias", $crit->getColumn());
  746. $c->addHaving($crit); // produces invalid SQL referring to '.olumn_alias'
  747. }
  748. /**
  749. * Test whether GROUP BY is being respected in equals() check.
  750. * @link http://propel.phpdb.org/trac/ticket/674
  751. */
  752. public function testEqualsGroupBy()
  753. {
  754. $c1 = new Criteria();
  755. $c1->addGroupByColumn('GBY1');
  756. $c2 = new Criteria();
  757. $c2->addGroupByColumn('GBY2');
  758. $this->assertFalse($c2->equals($c1), "Expected Criteria NOT to be the same with different GROUP BY columns");
  759. $c3 = new Criteria();
  760. $c3->addGroupByColumn('GBY1');
  761. $c4 = new Criteria();
  762. $c4->addGroupByColumn('GBY1');
  763. $this->assertTrue($c4->equals($c3), "Expected Criteria objects to match.");
  764. }
  765. /**
  766. * Test whether calling setDistinct twice puts in two distinct keywords or not.
  767. * @link http://propel.phpdb.org/trac/ticket/716
  768. */
  769. public function testDoubleSelectModifiers()
  770. {
  771. $c = new Criteria();
  772. $c->setDistinct();
  773. $this->assertEquals(array(Criteria::DISTINCT), $c->getSelectModifiers(), 'Initial setDistinct works');
  774. $c->setDistinct();
  775. $this->assertEquals(array(Criteria::DISTINCT), $c->getSelectModifiers(), 'Calling setDistinct again leaves a single distinct');
  776. $c->setAll();
  777. $this->assertEquals(array(Criteria::ALL), $c->getSelectModifiers(), 'All keyword is swaps distinct out');
  778. $c->setAll();
  779. $this->assertEquals(array(Criteria::ALL), $c->getSelectModifiers(), 'Calling setAll leaves a single all');
  780. $c->setDistinct();
  781. $this->assertEquals(array(Criteria::DISTINCT), $c->getSelectModifiers(), 'All back to distinct works');
  782. $c2 = new Criteria();
  783. $c2->setAll();
  784. $this->assertEquals(array(Criteria::ALL), $c2->getSelectModifiers(), 'Initial setAll works');
  785. }
  786. public function testAddSelectModifier()
  787. {
  788. $c = new Criteria();
  789. $c->setDistinct();
  790. $c->addSelectModifier('SQL_CALC_FOUND_ROWS');
  791. $this->assertEquals(array(Criteria::DISTINCT, 'SQL_CALC_FOUND_ROWS'), $c->getSelectModifiers(), 'addSelectModifier() adds a select modifier to the Criteria');
  792. $c->addSelectModifier('SQL_CALC_FOUND_ROWS');
  793. $this->assertEquals(array(Criteria::DISTINCT, 'SQL_CALC_FOUND_ROWS'), $c->getSelectModifiers(), 'addSelectModifier() adds a select modifier only once');
  794. $params = array();
  795. $result = BasePeer::createSelectSql($c, $params);
  796. $this->assertEquals('SELECT DISTINCT SQL_CALC_FOUND_ROWS FROM ', $result, 'addSelectModifier() adds a modifier to the final query');
  797. }
  798. public function testClone()
  799. {
  800. $c1 = new Criteria();
  801. $c1->add('tbl.COL1', 'foo', Criteria::EQUAL);
  802. $c2 = clone $c1;
  803. $c2->addAnd('tbl.COL1', 'bar', Criteria::EQUAL);
  804. $nbCrit = 0;
  805. foreach ($c1->keys() as $key) {
  806. foreach ($c1->getCriterion($key)->getAttachedCriterion() as $criterion) {
  807. $nbCrit++;
  808. }
  809. }
  810. $this->assertEquals(1, $nbCrit, 'cloning a Criteria clones its Criterions');
  811. }
  812. public function testComment()
  813. {
  814. $c = new Criteria();
  815. $this->assertNull($c->getComment(), 'Comment is null by default');
  816. $c2 = $c->setComment('foo');
  817. $this->assertEquals('foo', $c->getComment(), 'Comment is set by setComment()');
  818. $this->assertEquals($c, $c2, 'setComment() returns the current Criteria');
  819. $c->setComment();
  820. $this->assertNull($c->getComment(), 'Comment is reset by setComment(null)');
  821. }
  822. public function testClear()
  823. {
  824. $c = new CriteriaForClearTest();
  825. $c->clear();
  826. $this->assertTrue(is_array($c->getNamedCriterions()), 'namedCriterions is an array');
  827. $this->assertEquals(0, count($c->getNamedCriterions()), 'namedCriterions is empty by default');
  828. $this->assertFalse($c->getIgnoreCase(), 'ignoreCase is false by default');
  829. $this->assertFalse($c->getSingleRecord(), 'singleRecord is false by default');
  830. $this->assertTrue(is_array($c->getSelectModifiers()), 'selectModifiers is an array');
  831. $this->assertEquals(0, count($c->getSelectModifiers()), 'selectModifiers is empty by default');
  832. $this->assertTrue(is_array($c->getSelectColumns()), 'selectColumns is an array');
  833. $this->assertEquals(0, count($c->getSelectColumns()), 'selectColumns is empty by default');
  834. $this->assertTrue(is_array($c->getOrderByColumns()), 'orderByColumns is an array');
  835. $this->assertEquals(0, count($c->getOrderByColumns()), 'orderByColumns is empty by default');
  836. $this->assertTrue(is_array($c->getGroupByColumns()), 'groupByColumns is an array');
  837. $this->assertEquals(0, count($c->getGroupByColumns()), 'groupByColumns is empty by default');
  838. $this->assertNull($c->getHaving(), 'having is null by default');
  839. $this->assertTrue(is_array($c->getAsColumns()), 'asColumns is an array');
  840. $this->assertEquals(0, count($c->getAsColumns()), 'asColumns is empty by default');
  841. $this->assertTrue(is_array($c->getJoins()), 'joins is an array');
  842. $this->assertEquals(0, count($c->getJoins()), 'joins is empty by default');
  843. $this->assertTrue(is_array($c->getSelectQueries()), 'selectQueries is an array');
  844. $this->assertEquals(0, count($c->getSelectQueries()), 'selectQueries is empty by default');
  845. $this->assertEquals(0, $c->getOffset(), 'offset is 0 by default');
  846. $this->assertEquals(0, $c->getLimit(), 'limit is 0 by default');
  847. $this->assertNull($c->getBlobFlag(), 'blobFlag is null by default');
  848. $this->assertTrue(is_array($c->getAliases()), 'aliases is an array');
  849. $this->assertEquals(0, count($c->getAliases()), 'aliases is empty by default');
  850. $this->assertFalse($c->getUseTransaction(), 'useTransaction is false by default');
  851. }
  852. public function testLimit()
  853. {
  854. $c = new Criteria();
  855. $this->assertEquals(0, $c->getLimit(), 'Limit is 0 by default');
  856. $c2 = $c->setLimit(1);
  857. $this->assertEquals(1, $c->getLimit(), 'Limit is set by setLimit');
  858. $this->assertSame($c, $c2, 'setLimit() returns the current Criteria');
  859. }
  860. }
  861. class CriteriaForClearTest extends Criteria
  862. {
  863. public function getNamedCriterions()
  864. {
  865. return $this->namedCriterions;
  866. }
  867. public function getIgnoreCase()
  868. {
  869. return $this->ignoreCase;
  870. }
  871. public function getSingleRecord()
  872. {
  873. return $this->singleRecord;
  874. }
  875. public function getUseTransaction()
  876. {
  877. return $this->useTransaction;
  878. }
  879. public function getBlobFlag()
  880. {
  881. return $this->blobFlag;
  882. }
  883. }