From 8f3d8dde49dc4a58f967fd9ef48a477572fee467 Mon Sep 17 00:00:00 2001 From: Oliver Hader Date: Wed, 6 Nov 2019 20:11:13 +0100 Subject: [PATCH] Revert "[TASK] Speed up DB query for tables with versions" This reverts commit 0dab9b4183208040c76e84ea845396b742d91fab. The change resulted in AJAX timeouts when dealing with lots of database records on MySQL 5.6 - it was fine however on MySQL 5.7. Reverts: #86945 Resolves: #89464 Releases: master, 9.5, 8.7 Change-Id: Ied400255186f5e72521d3318521c3edb0f4f7784 Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/62208 Tested-by: TYPO3com Tested-by: Benni Mack Tested-by: Oliver Hader Reviewed-by: Benni Mack Reviewed-by: Oliver Hader --- .../Classes/Service/WorkspaceService.php | 43 +++++++++++-------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/typo3/sysext/workspaces/Classes/Service/WorkspaceService.php b/typo3/sysext/workspaces/Classes/Service/WorkspaceService.php index b897e6625474..4df9a9455b37 100644 --- a/typo3/sysext/workspaces/Classes/Service/WorkspaceService.php +++ b/typo3/sysext/workspaces/Classes/Service/WorkspaceService.php @@ -869,8 +869,7 @@ protected function fetchPagesWithVersionsInTable($workspaceId, $tableName) if (!isset($this->pagesWithVersionsInTable[$workspaceId][$tableName])) { $this->pagesWithVersionsInTable[$workspaceId][$tableName] = []; - $connection = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable($tableName); - $queryBuilder = $connection->createQueryBuilder(); + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($tableName); $queryBuilder->getRestrictions() ->removeAll() ->add(GeneralUtility::makeInstance(DeletedRestriction::class)); @@ -889,33 +888,43 @@ protected function fetchPagesWithVersionsInTable($workspaceId, $tableName) ); // create sub-queries, parameters are available for main query $versionQueryBuilder = $this->createQueryBuilderForTable($tableName) - ->select('B.pid AS pageId') - ->from($tableName, 'B') - ->join('B', $tableName, 'A', $queryBuilder->expr()->eq('B.uid', $queryBuilder->quoteIdentifier('A.t3ver_oid'))) + ->select('A.t3ver_oid') + ->from($tableName, 'A') ->where( $queryBuilder->expr()->eq('A.pid', $pageIdParameter), $queryBuilder->expr()->eq('A.t3ver_wsid', $workspaceIdParameter), $queryBuilder->expr()->neq('A.t3ver_state', $movePointerParameter) - ) - ->groupBy('B.pid'); + ); $movePointerQueryBuilder = $this->createQueryBuilderForTable($tableName) - ->select('B.pid AS pageId') - ->from($tableName, 'B') - ->join('B', $tableName, 'A', $queryBuilder->expr()->eq('B.t3ver_move_id', $queryBuilder->quoteIdentifier('A.t3ver_oid'))) + ->select('A.t3ver_oid') + ->from($tableName, 'A') ->where( $queryBuilder->expr()->eq('A.pid', $pageIdParameter), $queryBuilder->expr()->eq('A.t3ver_wsid', $workspaceIdParameter), $queryBuilder->expr()->eq('A.t3ver_state', $movePointerParameter) - ) - ->groupBy('B.pid'); + ); + $subQuery = '%s IN (%s)'; // execute main query - $result = $connection->executeQuery( - $versionQueryBuilder->getSQL() . ' UNION ' . $movePointerQueryBuilder->getSQL(), - $queryBuilder->getParameters() - ); + $result = $queryBuilder + ->select('B.pid AS pageId') + ->from($tableName, 'B') + ->orWhere( + sprintf( + $subQuery, + $queryBuilder->quoteIdentifier('B.uid'), + $versionQueryBuilder->getSQL() + ), + sprintf( + $subQuery, + $queryBuilder->quoteIdentifier('B.t3ver_move_id'), + $movePointerQueryBuilder->getSQL() + ) + ) + ->groupBy('B.pid') + ->execute(); $pageIds = []; - while ($row = $result->fetch(\PDO::FETCH_ASSOC)) { + while ($row = $result->fetch()) { $pageIds[$row['pageId']] = true; }