Skip to content

Commit

Permalink
Revert "[TASK] Speed up DB query for tables with versions"
Browse files Browse the repository at this point in the history
This reverts commit 0dab9b4.

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 <noreply@typo3.com>
Tested-by: Benni Mack <benni@typo3.org>
Tested-by: Oliver Hader <oliver.hader@typo3.org>
Reviewed-by: Benni Mack <benni@typo3.org>
Reviewed-by: Oliver Hader <oliver.hader@typo3.org>
  • Loading branch information
ohader committed Nov 7, 2019
1 parent 8a1679b commit 8f3d8dd
Showing 1 changed file with 26 additions and 17 deletions.
43 changes: 26 additions & 17 deletions typo3/sysext/workspaces/Classes/Service/WorkspaceService.php
Expand Up @@ -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));
Expand All @@ -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;
}

Expand Down

0 comments on commit 8f3d8dd

Please sign in to comment.