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