Skip to content

Commit dfc58a3

Browse files
committed
fix: Use simple query and chunk in PHP
Signed-off-by: Julius Härtl <jus@bitgrid.net>
1 parent 583e2c3 commit dfc58a3

1 file changed

Lines changed: 26 additions & 15 deletions

File tree

lib/Db/SessionMapper.php

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

102102
public function deleteInactiveWithoutSteps(?int $documentId = null) {
103-
$qb = $this->db->getQueryBuilder();
104-
$qb->select('session_id')
105-
->from('text_steps');
103+
$lastContact = time() - SessionService::SESSION_VALID_TIME;
104+
105+
$inactiveSessionBuilder = $this->db->getQueryBuilder();
106+
$inactiveSessionBuilder->select('s.id')
107+
->from('text_sessions', 's')
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'));
106111
if ($documentId !== null) {
107-
$qb->where($qb->expr()->eq('document_id', $qb->createNamedParameter($documentId)));
112+
$inactiveSessionBuilder->andWhere($inactiveSessionBuilder->expr()->eq('s.document_id', $inactiveSessionBuilder->createNamedParameter($documentId)));
108113
}
109-
$result = $qb
110-
->groupBy('session_id')
111-
->executeQuery();
112-
$activeSessions = $result->fetchAll(\PDO::FETCH_COLUMN);
114+
$result = $inactiveSessionBuilder->executeQuery();
115+
$documentIds = array_map(function ($row) {
116+
return (int)$row['id'];
117+
}, $result->fetchAll());
113118
$result->closeCursor();
114119

115-
$qb = $this->db->getQueryBuilder();
116-
$qb->delete($this->getTableName());
117-
$qb->where($qb->expr()->lt('last_contact', $qb->createNamedParameter(time() - SessionService::SESSION_VALID_TIME)));
118-
if ($documentId !== null) {
119-
$qb->andWhere($qb->expr()->eq('document_id', $qb->createNamedParameter($documentId)));
120+
$chunks = array_chunk($documentIds, 500);
121+
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();
120132
}
121-
$qb->andWhere($qb->expr()->notIn('id', $qb->createNamedParameter($activeSessions, IQueryBuilder::PARAM_INT_ARRAY)));
122-
return $qb->executeStatement();
133+
return $deletedCount;
123134
}
124135

125136
public function deleteByDocumentId($documentId) {

0 commit comments

Comments
 (0)