@@ -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