@@ -142,6 +142,42 @@ public function deleteInactiveWithoutSteps(?int $documentId = null): int {
142142 return $ deletedCount ;
143143 }
144144
145+ public function deleteOldSessions (int $ ageInSeconds ): int {
146+ $ startTime = microtime (true );
147+ $ maxExecutionSeconds = 30 ;
148+ $ batchSize = 1000 ;
149+ $ deletedCount = 0 ;
150+ $ ageThreshold = time () - $ ageInSeconds ;
151+
152+ do {
153+ $ oldSessionsQb = $ this ->db ->getQueryBuilder ();
154+ $ result = $ oldSessionsQb ->select ('id ' )
155+ ->from ('text_sessions ' )
156+ ->where ($ oldSessionsQb ->expr ()->lt ('last_contact ' , $ oldSessionsQb ->createNamedParameter ($ ageThreshold )))
157+ ->setMaxResults ($ batchSize )
158+ ->executeQuery ();
159+
160+ $ sessionIds = array_map (function ($ row ) {
161+ return (int )$ row ['id ' ];
162+ }, $ result ->fetchAll ());
163+ $ result ->closeCursor ();
164+
165+ if (empty ($ sessionIds )) {
166+ break ;
167+ }
168+
169+ $ deleteSessionsQb = $ this ->db ->getQueryBuilder ();
170+ $ batchDeleted = $ deleteSessionsQb ->delete ('text_sessions ' )
171+ ->where ($ deleteSessionsQb ->expr ()->in ('id ' , $ deleteSessionsQb ->createParameter ('ids ' ), IQueryBuilder::PARAM_INT_ARRAY ))
172+ ->setParameter ('ids ' , $ sessionIds , IQueryBuilder::PARAM_INT_ARRAY )
173+ ->executeStatement ();
174+
175+ $ deletedCount += $ batchDeleted ;
176+ } while ((microtime (true ) - $ startTime ) < $ maxExecutionSeconds );
177+
178+ return $ deletedCount ;
179+ }
180+
145181 public function deleteByDocumentId (int $ documentId ): int {
146182 $ qb = $ this ->db ->getQueryBuilder ();
147183 $ qb ->delete ($ this ->getTableName ())
0 commit comments