Fixed bug #17267: Live search is unusable with Oracle
authorXavier Perseguers <typo3@perseguers.ch>
Mon, 24 Jan 2011 18:30:07 +0000 (18:30 +0000)
committerXavier Perseguers <typo3@perseguers.ch>
Mon, 24 Jan 2011 18:30:07 +0000 (18:30 +0000)
git-svn-id: https://svn.typo3.org/TYPO3v4/Core/trunk@10280 709f56b5-9817-0410-a4d7-c38de5d9e867

ChangeLog
t3lib/search/class.t3lib_search_livesearch.php

index 09891d0..df90beb 100755 (executable)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2011-01-24  Xavier Perseguers  <typo3@perseguers.ch>
+
+       * Fixed bug #17267: Live search is unusable with Oracle
+
 2011-01-24  Oliver Hader  <oliver.hader@typo3.org>
 
        * Fixed bug #17274: SQL error in Update Wizard of workspaces
index ec2cc0c..91127b2 100644 (file)
@@ -333,10 +333,31 @@ class t3lib_search_livesearch {
         * @param array $fieldsToSearchWithin User right based visible fields where we can search within.
         * @return string
         */
-       protected function makeQuerySearchByTable($tableName, $fieldsToSearchWithin) {
+       protected function makeQuerySearchByTable($tableName, array $fieldsToSearchWithin) {
                        // free text search
                $queryLikeStatement = ' LIKE \'%' . $this->getQueryString($tableName) . '%\'';
-               $queryPart = ' AND (' . implode($queryLikeStatement . ' OR ', $fieldsToSearchWithin) . $queryLikeStatement . ')';
+               $integerFieldsToSearchWithin = array();
+               $queryEqualStatement = '';
+
+               if (is_numeric($this->getQueryString($tableName))) {
+                       $queryEqualStatement = ' = \'' . $this->getQueryString($tableName) . '\'';
+               }
+               $uidPos = array_search('uid', $fieldsToSearchWithin);
+               if ($uidPos) {
+                       $integerFieldsToSearchWithin[] = 'uid';
+                       unset($fieldsToSearchWithin[$uidPos]);
+               }
+               $pidPos = array_search('pid', $fieldsToSearchWithin);
+               if ($pidPos) {
+                       $integerFieldsToSearchWithin[] = 'pid';
+                       unset($fieldsToSearchWithin[$pidPos]);
+               }
+
+               $queryPart = ' AND (';
+               if (count($integerFieldsToSearchWithin) && $queryEqualStatement !== '') {
+                       $queryPart .= implode($queryEqualStatement . ' OR ', $integerFieldsToSearchWithin) . $queryEqualStatement . ' OR ';
+               }
+               $queryPart .= implode($queryLikeStatement . ' OR ', $fieldsToSearchWithin) . $queryLikeStatement . ')';
                $queryPart .= t3lib_BEfunc::deleteClause($tableName);
                $queryPart .= t3lib_BEfunc::versioningPlaceholderClause($tableName);