PageRenderTime 25ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 0ms

/bluebox/libraries/doctrine/tests/Search/QueryTestCase.php

https://github.com/robertleeplummerjr/bluebox
PHP | 328 lines | 224 code | 74 blank | 30 comment | 0 complexity | 80e0945f47bae9375e0e2d1749be51cd MD5 | raw file
  1. <?php
  2. /*
  3. * $Id$
  4. *
  5. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  6. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  7. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  8. * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  9. * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  10. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  11. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  12. * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  13. * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  14. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  15. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  16. *
  17. * This software consists of voluntary contributions made by many individuals
  18. * and is licensed under the LGPL. For more information, see
  19. * <http://www.phpdoctrine.org>.
  20. */
  21. /**
  22. * Doctrine_Search_Query_TestCase
  23. *
  24. * @package Doctrine
  25. * @author Konsta Vesterinen <kvesteri@cc.hut.fi>
  26. * @license http://www.opensource.org/licenses/lgpl-license.php LGPL
  27. * @category Object Relational Mapping
  28. * @link www.phpdoctrine.org
  29. * @since 1.0
  30. * @version $Revision$
  31. */
  32. class Doctrine_Search_Query_TestCase extends Doctrine_UnitTestCase
  33. {
  34. public function prepareTables()
  35. {
  36. $this->tables = array('SearchTest', 'SearchTestIndex');
  37. parent::prepareTables();
  38. }
  39. public function prepareData()
  40. { }
  41. public function testInitData()
  42. {
  43. $e = new SearchTest();
  44. $e->title = 'Once there was an ORM framework';
  45. $e->content = 'There are many ORM frameworks, but nevertheless we decided to create one.';
  46. $e->save();
  47. $e = new SearchTest();
  48. $e->title = 'Doctrine development continues';
  49. $e->content = 'The development has been going well so far.';
  50. $e->save();
  51. }
  52. public function testParseClauseSupportsAndOperator()
  53. {
  54. $q = new Doctrine_Search_Query('SearchTestIndex');
  55. $ret = $q->parseClause('doctrine AND orm');
  56. $sql = 'id IN (SELECT id FROM search_test_index WHERE keyword = ?) '
  57. . 'AND id IN (SELECT id FROM search_test_index WHERE keyword = ?)';
  58. $this->assertEqual($ret, $sql);
  59. }
  60. public function testParseClauseSupportsMixingOfOperatorsAndParenthesis()
  61. {
  62. $q = new Doctrine_Search_Query('SearchTestIndex');
  63. $ret = $q->parseClause('((doctrine OR orm) AND dbal) OR database');
  64. $sql = '(id IN (SELECT id FROM search_test_index WHERE keyword = ? OR keyword = ?) AND id IN (SELECT id FROM search_test_index WHERE keyword = ?)) OR keyword = ?';
  65. $this->assertEqual($ret, $sql);
  66. }
  67. public function testParseClauseSupportsMixingOfOperators3()
  68. {
  69. $q = new Doctrine_Search_Query('SearchTestIndex');
  70. $ret = $q->parseClause('doctrine OR orm AND dbal');
  71. $sql = 'keyword = ? OR id IN (SELECT id FROM search_test_index WHERE keyword = ?) AND id IN (SELECT id FROM search_test_index WHERE keyword = ?)';
  72. $this->assertEqual($ret, $sql);
  73. }
  74. public function testParseClauseSupportsMixingOfOperators()
  75. {
  76. $q = new Doctrine_Search_Query('SearchTestIndex');
  77. $ret = $q->parseClause('(doctrine OR orm) AND dbal');
  78. $sql = 'id IN (SELECT id FROM search_test_index WHERE keyword = ? OR keyword = ?) AND id IN (SELECT id FROM search_test_index WHERE keyword = ?)';
  79. $this->assertEqual($ret, $sql);
  80. }
  81. public function testParseClauseSupportsMixingOfOperators2()
  82. {
  83. $q = new Doctrine_Search_Query('SearchTestIndex');
  84. $ret = $q->parseClause('(doctrine OR orm) dbal');
  85. $sql = 'id IN (SELECT id FROM search_test_index WHERE keyword = ? OR keyword = ?) AND id IN (SELECT id FROM search_test_index WHERE keyword = ?)';
  86. $this->assertEqual($ret, $sql);
  87. }
  88. public function testParseClauseSupportsMixingOfOperatorsAndDeeplyNestedParenthesis()
  89. {
  90. $q = new Doctrine_Search_Query('SearchTestIndex');
  91. $ret = $q->parseClause('(((doctrine OR orm) AND dbal) OR database) AND rdbms');
  92. $sql = '((id IN (SELECT id FROM search_test_index WHERE keyword = ? OR keyword = ?) AND id IN (SELECT id FROM search_test_index WHERE keyword = ?)) OR keyword = ?) AND id IN (SELECT id FROM search_test_index WHERE keyword = ?)';
  93. $this->assertEqual($ret, $sql);
  94. }
  95. public function testParseClauseSupportsMixingOfOperatorsAndParenthesis2()
  96. {
  97. $q = new Doctrine_Search_Query('SearchTestIndex');
  98. $ret = $q->parseClause('rdbms (dbal OR database)');
  99. $sql = 'id IN (SELECT id FROM search_test_index WHERE keyword = ?) AND id IN (SELECT id FROM search_test_index WHERE keyword = ? OR keyword = ?)';
  100. $this->assertEqual($ret, $sql);
  101. }
  102. public function testParseClauseSupportsMixingOfOperatorsAndDeeplyNestedParenthesis2()
  103. {
  104. $q = new Doctrine_Search_Query('SearchTestIndex');
  105. $ret = $q->parseClause('rdbms (((doctrine OR orm) AND dbal) OR database)');
  106. $sql = 'id IN (SELECT id FROM search_test_index WHERE keyword = ?) AND ((id IN (SELECT id FROM search_test_index WHERE keyword = ? OR keyword = ?) AND id IN (SELECT id FROM search_test_index WHERE keyword = ?)) OR keyword = ?)';
  107. $this->assertEqual($ret, $sql);
  108. }
  109. public function testParseClauseSupportsNegationOperator()
  110. {
  111. $q = new Doctrine_Search_Query('SearchTestIndex');
  112. $ret = $q->parseClause('rdbms -doctrine');
  113. $sql = 'id IN (SELECT id FROM search_test_index WHERE keyword = ?) AND '
  114. . 'id NOT IN (SELECT id FROM search_test_index WHERE keyword = ?)';
  115. $this->assertEqual($ret, $sql);
  116. }
  117. public function testParseClauseOrOperator2()
  118. {
  119. $q = new Doctrine_Search_Query('SearchTestIndex');
  120. $ret = $q->parseClause('rdbms doctrine OR database');
  121. $sql = 'id IN (SELECT id FROM search_test_index WHERE keyword = ?) AND '
  122. . 'id IN (SELECT id FROM search_test_index WHERE keyword = ?) '
  123. . 'OR keyword = ?';
  124. $this->assertEqual($ret, $sql);
  125. }
  126. public function testParseClauseSupportsNegationOperatorWithOrOperator()
  127. {
  128. $q = new Doctrine_Search_Query('SearchTestIndex');
  129. $ret = $q->parseClause('rdbms -doctrine OR database');
  130. $sql = 'id IN (SELECT id FROM search_test_index WHERE keyword = ?) AND '
  131. . 'id NOT IN (SELECT id FROM search_test_index WHERE keyword = ?) '
  132. . 'OR keyword = ?';
  133. $this->assertEqual($ret, $sql);
  134. }
  135. public function testSearchSupportsAndOperator()
  136. {
  137. $q = new Doctrine_Search_Query('SearchTestIndex');
  138. $q->query('doctrine AND orm');
  139. $sql = 'SELECT COUNT(keyword) AS relevance, id '
  140. . 'FROM search_test_index '
  141. . 'WHERE id IN (SELECT id FROM search_test_index WHERE keyword = ?) '
  142. . 'AND id IN (SELECT id FROM search_test_index WHERE keyword = ?) '
  143. . 'GROUP BY id ORDER BY relevance DESC';
  144. $this->assertEqual($q->getSqlQuery(), $sql);
  145. }
  146. public function testSearchSupportsOrOperator()
  147. {
  148. $q = new Doctrine_Search_Query('SearchTestIndex');
  149. $q->query('doctrine OR orm');
  150. $sql = 'SELECT COUNT(keyword) AS relevance, id '
  151. . 'FROM search_test_index '
  152. . 'WHERE keyword = ? OR keyword = ? '
  153. . 'GROUP BY id ORDER BY relevance DESC';
  154. $this->assertEqual($q->getSqlQuery(), $sql);
  155. }
  156. public function testQuerySupportsSingleWordquery()
  157. {
  158. $q = new Doctrine_Search_Query('SearchTestIndex');
  159. $q->query('doctrine');
  160. $sql = 'SELECT COUNT(keyword) AS relevance, id '
  161. . 'FROM search_test_index WHERE keyword = ? GROUP BY id ORDER BY relevance DESC';
  162. $this->assertEqual($q->getParams(), array('doctrine'));
  163. $this->assertEqual($q->getSqlQuery(), $sql);
  164. }
  165. public function testSearchSupportsMixingOfOperators()
  166. {
  167. $q = new Doctrine_Search_Query('SearchTestIndex');
  168. $q->query('(doctrine OR orm) AND dbal');
  169. $sql = 'SELECT COUNT(keyword) AS relevance, id '
  170. . 'FROM search_test_index '
  171. . 'WHERE id IN (SELECT id FROM search_test_index WHERE keyword = ? OR keyword = ?) '
  172. . 'AND id IN (SELECT id FROM search_test_index WHERE keyword = ?) '
  173. . 'GROUP BY id ORDER BY relevance DESC';
  174. $this->assertEqual($q->getParams(), array('doctrine', 'orm', 'dbal'));
  175. $this->assertEqual($q->getSqlQuery(), $sql);
  176. }
  177. public function testSearchSupportsSingleTermWithQuotes()
  178. {
  179. $q = new Doctrine_Search_Query('SearchTestIndex');
  180. $q->query("'doctrine orm'");
  181. $sql = 'SELECT COUNT(keyword) AS relevance, id '
  182. . 'FROM search_test_index WHERE keyword = ? '
  183. . 'AND (position + 1) = (SELECT position FROM search_test_index WHERE keyword = ?) '
  184. . 'GROUP BY id ORDER BY relevance DESC';
  185. $this->assertEqual($q->getParams(), array('doctrine', 'orm'));
  186. $this->assertEqual($q->getSqlQuery(), $sql);
  187. }
  188. public function testSearchSupportsSingleLongTermWithQuotes()
  189. {
  190. $q = new Doctrine_Search_Query('SearchTestIndex');
  191. $q->query("'doctrine orm dbal'");
  192. $sql = 'SELECT COUNT(keyword) AS relevance, id '
  193. . 'FROM search_test_index WHERE keyword = ? '
  194. . 'AND (position + 1) = (SELECT position FROM search_test_index WHERE keyword = ?) '
  195. . 'AND (position + 2) = (SELECT position FROM search_test_index WHERE keyword = ?) '
  196. . 'GROUP BY id ORDER BY relevance DESC';
  197. $this->assertEqual($q->getParams(), array('doctrine', 'orm', 'dbal'));
  198. $this->assertEqual($q->getSqlQuery(), $sql);
  199. }
  200. public function testQuerySupportsMultiWordquery()
  201. {
  202. $q = new Doctrine_Search_Query('SearchTestIndex');
  203. $q->query('doctrine orm');
  204. $sql = 'SELECT COUNT(keyword) AS relevance, id '
  205. . 'FROM search_test_index '
  206. . 'WHERE id IN (SELECT id FROM search_test_index WHERE keyword = ?) '
  207. . 'AND id IN (SELECT id FROM search_test_index WHERE keyword = ?) '
  208. . 'GROUP BY id ORDER BY relevance DESC';
  209. $this->assertEqual($q->getSqlQuery(), $sql);
  210. }
  211. public function testQuerySupportsMultiWordSearchAndSingleLetterWildcards()
  212. {
  213. $q = new Doctrine_Search_Query('SearchTestIndex');
  214. $q->query('doct?ine orm');
  215. $sql = 'SELECT COUNT(keyword) AS relevance, id '
  216. . 'FROM search_test_index '
  217. . 'WHERE id IN (SELECT id FROM search_test_index WHERE keyword LIKE ?) '
  218. . 'AND id IN (SELECT id FROM search_test_index WHERE keyword = ?) '
  219. . 'GROUP BY id ORDER BY relevance DESC';
  220. $this->assertEqual($q->getParams(), array('doct?ine', 'orm'));
  221. $this->assertEqual($q->getSqlQuery(), $sql);
  222. }
  223. public function testQuerySupportsMultiWordSearchAndMultiLetterWildcards()
  224. {
  225. $q = new Doctrine_Search_Query('SearchTestIndex');
  226. $q->query('doc* orm');
  227. $sql = 'SELECT COUNT(keyword) AS relevance, id '
  228. . 'FROM search_test_index '
  229. . 'WHERE id IN (SELECT id FROM search_test_index WHERE keyword LIKE ?) '
  230. . 'AND id IN (SELECT id FROM search_test_index WHERE keyword = ?) '
  231. . 'GROUP BY id ORDER BY relevance DESC';
  232. $this->assertEqual($q->getParams(), array('doc%', 'orm'));
  233. $this->assertEqual($q->getSqlQuery(), $sql);
  234. }
  235. public function testSearchSupportsMultipleTermsWithQuotes()
  236. {
  237. $q = new Doctrine_Search_Query('SearchTestIndex');
  238. $q->query("doctrine 'orm database'");
  239. $sql = 'SELECT COUNT(keyword) AS relevance, id '
  240. . 'FROM search_test_index '
  241. . 'WHERE id IN (SELECT id FROM search_test_index WHERE keyword = ?) '
  242. . 'AND id IN (SELECT id FROM search_test_index WHERE keyword = ? '
  243. . 'AND (position + 1) = (SELECT position FROM search_test_index WHERE keyword = ?)) '
  244. . 'GROUP BY id ORDER BY relevance DESC';
  245. $this->assertEqual($q->getParams(), array('doctrine', 'orm', 'database'));
  246. $this->assertEqual($q->getSqlQuery(), $sql);
  247. }
  248. public function testSearchReturnsFalseForEmptyStrings()
  249. {
  250. $q = new Doctrine_Search_Query('SearchTestIndex');
  251. $result = $q->query(' ');
  252. $this->assertFalse($result);
  253. }
  254. }