[TASK] Change fetch of maximum version using LEFT JOIN 88/32288/2
authorAndreas Fernandez <andreas.fernandez@aspedia.de>
Fri, 8 Aug 2014 12:03:02 +0000 (14:03 +0200)
committerJigal van Hemert <jigal.van.hemert@typo3.org>
Wed, 20 Aug 2014 21:05:50 +0000 (23:05 +0200)
Currently, the method fetchMaximalVersionsForAllExtensions uses a
subselect to determine the highest available version. This solution is
rather inefficient and incomptabile to DBAL. The query is replaced by
a LEFT JOIN.

Resolves: #60857
Releases: 6.2, 6.3
Change-Id: I7ae3c523259bf260c41080aee269f6df33edb408
Reviewed-on: http://review.typo3.org/32288
Reviewed-by: Jigal van Hemert <jigal.van.hemert@typo3.org>
Tested-by: Jigal van Hemert <jigal.van.hemert@typo3.org>
typo3/sysext/extensionmanager/Classes/Domain/Repository/ExtensionRepository.php

index a7c5cbf..d8575fa 100644 (file)
@@ -313,26 +313,27 @@ class ExtensionRepository extends \TYPO3\CMS\Extbase\Persistence\Repository {
 
        /**
         * Fetches the UIDs of all maximal versions for all extensions.
 
        /**
         * Fetches the UIDs of all maximal versions for all extensions.
-        * This is done by doing a subselect in the WHERE clause to get all
-        * max versions and then the UID of that record in the outer select.
+        * This is done by doing a LEFT JOIN to itself ("a" and "b") and comparing
+        * both integer_version fields.
         *
         * @param int $repositoryUid
         * @return array
         */
        protected function fetchMaximalVersionsForAllExtensions($repositoryUid) {
         *
         * @param int $repositoryUid
         * @return array
         */
        protected function fetchMaximalVersionsForAllExtensions($repositoryUid) {
-               $extensionUids = $this->databaseConnection->exec_SELECTgetRows(
-                       'a.uid AS uid',
-                       self::TABLE_NAME . ' a',
-                       'integer_version=(' .
-                               $this->databaseConnection->SELECTquery(
-                                       'MAX(integer_version)',
-                                       self::TABLE_NAME . ' b',
-                                       'b.repository=' . (int)$repositoryUid . ' AND a.extension_key=b.extension_key'
-                               ) .
-                       ') AND repository=' . (int)$repositoryUid,
-                       '', '', '', 'uid'
+               $queryResult = $this->databaseConnection->sql_query(
+                       'SELECT a.uid AS uid ' .
+                       'FROM ' . self::TABLE_NAME . ' a ' .
+                       'LEFT JOIN ' . self::TABLE_NAME . ' b ON a.repository = b.repository AND a.extension_key = b.extension_key AND a.integer_version < b.integer_version ' .
+                       'WHERE a.repository = ' . (int)$repositoryUid . ' AND b.extension_key IS NULL ' .
+                       'ORDER BY a.uid'
                );
                );
-               return array_keys($extensionUids);
+
+               $extensionUids = array();
+               while ($row = $this->databaseConnection->sql_fetch_assoc($queryResult)) {
+                       $extensionUids[] = $row['uid'];
+               }
+               $this->databaseConnection->sql_free_result($queryResult);
+               return $extensionUids;
        }
 
        /**
        }
 
        /**