[TASK] Change relevance sorting in EM 96/32796/2
authorAndreas Fernandez <andreas.fernandez@aspedia.de>
Tue, 26 Aug 2014 13:51:03 +0000 (15:51 +0200)
committerMarkus Klein <klein.t3@reelworx.at>
Tue, 16 Sep 2014 09:21:28 +0000 (11:21 +0200)
The Extension Manager creates a virtual "position" field containing
the relevance of a search hit. The relevance is calculated in a hacky
way working in MySQL only. This is replaced by a more understandable
query that is parsable by the SqlParser.

Resolves: #61204
Releases: 6.3, 6.2
Change-Id: I541cbeef745e8dc25131af2a937ec2d028a2fc2c
Reviewed-on: http://review.typo3.org/32796
Reviewed-by: Markus Klein <klein.t3@reelworx.at>
Tested-by: Markus Klein <klein.t3@reelworx.at>
typo3/sysext/core/Classes/Database/SqlParser.php
typo3/sysext/extensionmanager/Classes/Domain/Repository/ExtensionRepository.php

index 1c9d192..5715ad4 100644 (file)
@@ -1447,7 +1447,7 @@ class SqlParser {
 
        /**
         * Trimming SQL as preparation for parsing.
-        * ";" in the end is stripped of.
+        * ";" in the end is stripped off.
         * White space is trimmed away around the value
         * A single space-char is added in the end
         *
index d8575fa..64aa659 100644 (file)
@@ -148,29 +148,25 @@ class ExtensionRepository extends \TYPO3\CMS\Extbase\Persistence\Repository {
                $quotedSearchString = $this->databaseConnection->escapeStrForLike($this->databaseConnection->quoteStr($searchString, 'tx_extensionmanager_domain_model_extension'), 'tx_extensionmanager_domain_model_extension');
                $quotedSearchStringForLike = '\'%' . $quotedSearchString . '%\'';
                $quotedSearchString = '\'' . $quotedSearchString . '\'';
-               $select = 'tx_extensionmanager_domain_model_extension.*,
-                       (
-                               (extension_key like ' . $quotedSearchString . ') * 8 +
-                               (extension_key like ' . $quotedSearchStringForLike . ') * 4 +
-                               (title like ' . $quotedSearchStringForLike . ') * 2 +
-                               (author_name like ' . $quotedSearchStringForLike . ')
-                       ) as position';
-               $from = 'tx_extensionmanager_domain_model_extension';
+               $select =
+                       self::TABLE_NAME . '.*, ' .
+                       'CASE ' .
+                               'WHEN extension_key = ' . $quotedSearchString . ' THEN 16 ' .
+                               'WHEN extension_key LIKE ' . $quotedSearchStringForLike . ' THEN 8 ' .
+                               'WHEN title LIKE ' . $quotedSearchStringForLike . ' THEN 4 ' .
+                               'WHEN description LIKE ' . $quotedSearchStringForLike . ' THEN 2 ' .
+                               'WHEN author_name LIKE ' . $quotedSearchStringForLike . ' THEN 1 ' .
+                       'END AS position';
                $where = '(
-                                       extension_key = ' . $quotedSearchString . '
-                                       OR
-                                       extension_key LIKE ' . $quotedSearchStringForLike . '
-                                       OR
-                                       title LIKE ' . $quotedSearchStringForLike . '
-                                       OR
-                                       description LIKE ' . $quotedSearchStringForLike . '
-                                       OR
+                                       extension_key = ' . $quotedSearchString . ' OR
+                                       extension_key LIKE ' . $quotedSearchStringForLike . ' OR
+                                       title LIKE ' . $quotedSearchStringForLike . ' OR
+                                       description LIKE ' . $quotedSearchStringForLike . ' OR
                                        author_name LIKE ' . $quotedSearchStringForLike . '
                                )
-                               AND current_version=1 AND review_state >= 0
-                               HAVING position > 0';
-               $order = 'position desc';
-               $result = $this->databaseConnection->exec_SELECTgetRows($select, $from, $where, '', $order);
+                               AND current_version = 1 AND review_state >= 0';
+               $order = 'position DESC';
+               $result = $this->databaseConnection->exec_SELECTgetRows($select, self::TABLE_NAME, $where, '', $order);
                return $this->dataMapper->map('TYPO3\\CMS\\Extensionmanager\\Domain\\Model\\Extension', $result);
        }