[BUGFIX] Fix QueryBuilding in IndexSearchRepository 70/42670/2
authorMarc Neuhaus <mneuhaus@famelo.com>
Mon, 3 Aug 2015 11:45:57 +0000 (13:45 +0200)
committerWouter Wolters <typo3@wouterwolters.nl>
Thu, 20 Aug 2015 12:28:24 +0000 (14:28 +0200)
This changeset fixes an issue in the indexSearchRepository that creates
invalid sql queries. Main issue is the missing of several wSelClauses,
that need to be collected, because they are imploded into the query.

Resolves: #67843
Releases: master, 6.2
Change-Id: Ib53b28660acfd92233de748431131f70e69f5125
Reviewed-on: http://review.typo3.org/42219
Reviewed-on: http://review.typo3.org/42670
Reviewed-by: Daniel Goerz <ervaude@gmail.com>
Reviewed-by: Marc Neuhaus <apocalip@gmail.com>
Tested-by: Marc Neuhaus <apocalip@gmail.com>
Reviewed-by: Wouter Wolters <typo3@wouterwolters.nl>
Tested-by: Wouter Wolters <typo3@wouterwolters.nl>
typo3/sysext/indexed_search/Classes/Domain/Repository/IndexSearchRepository.php

index fc763de..5b01021 100644 (file)
@@ -13,6 +13,8 @@ namespace TYPO3\CMS\IndexedSearch\Domain\Repository;
  *
  * The TYPO3 project - inspiring people to share!
  */
+use TYPO3\CMS\Core\Utility\MathUtility;
+
 /**
  * Index search abstraction to search through the index
  *
@@ -148,7 +150,7 @@ class IndexSearchRepository {
                        // Total search-result count
                        $count = $GLOBALS['TYPO3_DB']->sql_num_rows($res);
                        // The pointer is set to the result page that is currently being viewed
-                       $pointer = \TYPO3\CMS\Core\Utility\MathUtility::forceIntegerInRange($this->resultpagePointer, 0, floor($count / $this->numberOfResults));
+                       $pointer = MathUtility::forceIntegerInRange($this->resultpagePointer, 0, floor($count / $this->numberOfResults));
                        // Initialize result accumulation variables:
                        $c = 0;
                        // Result pointer: Counts up the position in the current search-result
@@ -257,6 +259,7 @@ class IndexSearchRepository {
                $c = 0;
                // This array accumulates the phash-values
                $totalHashList = array();
+               $this->wSelClauses = array();
                // Traverse searchwords; for each, select all phash integers and merge/diff/intersect them with previous word (based on operator)
                foreach ($searchWords as $k => $v) {
                        // Making the query for a single search word based on the search-type
@@ -268,7 +271,6 @@ class IndexSearchRepository {
                        }
                        $GLOBALS['TT']->push('SearchWord "' . $sWord . '" - $theType=' . $theType);
                        $res = '';
-                       $wSel = '';
                        // Perform search for word:
                        switch ($theType) {
                                case '1':
@@ -310,8 +312,6 @@ class IndexSearchRepository {
                                        // Distinct word
                                        $res = $this->searchDistinct($sWord);
                        }
-                       // Accumulate the word-select clauses
-                       $this->wSelClauses[] = $wSel;
                        // If there was a query to do, then select all phash-integers which resulted from this.
                        if ($res) {
                                // Get phash list by searching for it:
@@ -372,6 +372,7 @@ class IndexSearchRepository {
                $wildcard_left = $mode & self::WILDCARD_LEFT ? '%' : '';
                $wildcard_right = $mode & self::WILDCARD_RIGHT ? '%' : '';
                $wSel = 'IW.baseword LIKE \'' . $wildcard_left . $GLOBALS['TYPO3_DB']->quoteStr($sWord, 'index_words') . $wildcard_right . '\'';
+               $this->wSelClauses[] = $wSel;
                $res = $this->execPHashListQuery($wSel, ' AND is_stopword=0');
                return $res;
        }
@@ -384,6 +385,7 @@ class IndexSearchRepository {
         */
        protected function searchDistinct($sWord) {
                $wSel = 'IW.wid=' . $this->md5inthash($sWord);
+               $this->wSelClauses[] = $wSel;
                $res = $this->execPHashListQuery($wSel, ' AND is_stopword=0');
                return $res;
        }
@@ -395,6 +397,7 @@ class IndexSearchRepository {
         * @return      pointer         SQL result pointer
         */
        protected function searchSentence($sWord) {
+               $this->wSelClauses[] = '1=1';
                $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('ISEC.phash', 'index_section ISEC, index_fulltext IFT', 'IFT.fulltextdata LIKE \'%' . $GLOBALS['TYPO3_DB']->quoteStr($sWord, 'index_fulltext') . '%\' AND
                                                ISEC.phash = IFT.phash
                                                ' . $this->sectionTableWhere(), 'ISEC.phash');
@@ -409,7 +412,9 @@ class IndexSearchRepository {
         */
        protected function searchMetaphone($sWord) {
                $wSel = 'IW.metaphone=' . $sWord;
+               $this->wSelClauses[] = $wSel;
                $res = $this->execPHashListQuery($wSel, ' AND is_stopword=0');
+               return $res;
        }
 
        /**
@@ -610,8 +615,11 @@ class IndexSearchRepository {
                                        $grsel = 'SUM(IR.freq) AS order_val';
                                        $orderBy = 'order_val' . $this->getDescendingSortOrderFlag();
                        }
-                       // So, words are imploded into an OR statement (no "sentence search" should be done here - may deselect results)
-                       $wordSel = '(' . implode(' OR ', $this->wSelClauses) . ') AND ';
+                       $wordSel = '';
+                       if (!empty($this->wSelClauses)) {
+                               // So, words are imploded into an OR statement (no "sentence search" should be done here - may deselect results)
+                               $wordSel = '(' . implode(' OR ', $this->wSelClauses) . ') AND ';
+                       }
                        $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
                                'ISEC.*, IP.*, ' . $grsel,
                                'index_words IW,
@@ -816,4 +824,4 @@ class IndexSearchRepository {
        public function getJoinPagesForQuery() {
                return $this->joinPagesForQuery;
        }
-}
\ No newline at end of file
+}