Skip to content

Commit ba4145e

Browse files
committed
fix: Use simple query and chunk in PHP
reverts #4339 and #4539 except for the added tests and moves to plain PHP chunking to avoid issues with MySQL 8 Signed-off-by: Julius Härtl <[email protected]>
1 parent 06a1bf9 commit ba4145e

File tree

1 file changed

+26
-19
lines changed

1 file changed

+26
-19
lines changed

lib/Db/SessionMapper.php

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -100,30 +100,37 @@ public function findAllInactive() {
100100
}
101101

102102
public function deleteInactiveWithoutSteps(?int $documentId = null): int {
103-
$selectSubQuery = $this->db->getQueryBuilder();
104-
$selectSubQuery->select('s.id')
103+
$lastContact = time() - SessionService::SESSION_VALID_TIME;
104+
105+
$inactiveSessionBuilder = $this->db->getQueryBuilder();
106+
$inactiveSessionBuilder->select('s.id')
105107
->from('text_sessions', 's')
106-
->leftJoin('s', 'text_steps', 'st', $selectSubQuery->expr()->eq('st.session_id', 's.id'))
107-
->where($selectSubQuery->expr()->lt('last_contact', $selectSubQuery->createParameter('lastContact')))
108-
->andWhere($selectSubQuery->expr()->isNull('st.id'));
108+
->leftJoin('s', 'text_steps', 'st', $inactiveSessionBuilder->expr()->eq('st.session_id', 's.id'))
109+
->where($inactiveSessionBuilder->expr()->lt('last_contact', $inactiveSessionBuilder->createNamedParameter($lastContact)))
110+
->andWhere($inactiveSessionBuilder->expr()->isNull('st.id'));
109111
if ($documentId !== null) {
110-
$selectSubQuery->andWhere($selectSubQuery->expr()->eq('s.document_id', $selectSubQuery->createParameter('documentId')));
112+
$inactiveSessionBuilder->andWhere($inactiveSessionBuilder->expr()->eq('s.document_id', $inactiveSessionBuilder->createNamedParameter($documentId)));
111113
}
114+
$result = $inactiveSessionBuilder->executeQuery();
115+
$documentIds = array_map(function ($row) {
116+
return (int)$row['id'];
117+
}, $result->fetchAll());
118+
$result->closeCursor();
112119

113-
$qb = $this->db->getQueryBuilder();
114-
$qb->delete($this->getTableName());
115-
if ($documentId !== null) {
116-
$qb->where($selectSubQuery->expr()->eq('document_id', $selectSubQuery->createParameter('documentId')));
117-
$qb->andWhere($qb->expr()->in('id', $qb->createFunction($selectSubQuery->getSQL())));
118-
} else {
119-
$qb->where($qb->expr()->in('id', $qb->createFunction($selectSubQuery->getSQL())));
120-
}
121-
$qb->setParameters([
122-
'lastContact' => time() - SessionService::SESSION_VALID_TIME,
123-
'documentId' => $documentId,
124-
]);
120+
$chunks = array_chunk($documentIds, 500);
125121

126-
return $qb->executeStatement();
122+
$deleteBuilder = $this->db->getQueryBuilder();
123+
$deleteBuilder->delete($this->getTableName())
124+
->where($deleteBuilder->expr()->in('id', $deleteBuilder->createParameter('ids'), IQueryBuilder::PARAM_INT_ARRAY));
125+
126+
$deletedCount = 0;
127+
foreach ($chunks as $ids) {
128+
$deleteBuilder->setParameter('ids', $ids, IQueryBuilder::PARAM_INT_ARRAY);
129+
130+
$deletedCount += $deleteBuilder->executeStatement();
131+
$result->closeCursor();
132+
}
133+
return $deletedCount;
127134
}
128135

129136
public function deleteByDocumentId($documentId): int {

0 commit comments

Comments
 (0)