2929 */
3030class DeleteOrphanedItems extends TimedJob {
3131
32+ const CHUNK_SIZE = 200 ;
33+
3234 /** @var \OCP\IDBConnection */
3335 protected $ connection ;
3436
@@ -66,19 +68,38 @@ public function run($argument) {
6668 /**
6769 * Deleting orphaned system tag mappings
6870 *
71+ * @param string $table
72+ * @param string $idCol
73+ * @param string $typeCol
6974 * @return int Number of deleted entries
7075 */
7176 protected function cleanUp ($ table , $ idCol , $ typeCol ) {
72- $ subQuery = $ this ->connection ->getQueryBuilder ();
73- $ subQuery ->select ($ subQuery ->expr ()->literal ('1 ' ))
74- ->from ('filecache ' , 'f ' )
75- ->where ($ subQuery ->expr ()->eq ($ idCol , 'f.fileid ' ));
77+ $ deletedEntries = 0 ;
7678
7779 $ query = $ this ->connection ->getQueryBuilder ();
78- $ deletedEntries = $ query ->delete ($ table )
80+ $ query ->select ('t1. ' . $ idCol )
81+ ->from ($ table , 't1 ' )
7982 ->where ($ query ->expr ()->eq ($ typeCol , $ query ->expr ()->literal ('files ' )))
80- ->andWhere ($ query ->expr ()->isNull ($ query ->createFunction ('( ' . $ subQuery ->getSql () . ') ' )))
81- ->execute ();
83+ ->andWhere ($ query ->expr ()->isNull ('t2.fileid ' ))
84+ ->leftJoin ('t1 ' , 'filecache ' , 't2 ' , $ query ->expr ()->eq ($ query ->expr ()->castColumn ('t1. ' . $ idCol , IQueryBuilder::PARAM_INT ), 't2.fileid ' ))
85+ ->groupBy ('t1. ' . $ idCol )
86+ ->setMaxResults (self ::CHUNK_SIZE );
87+
88+ $ deleteQuery = $ this ->connection ->getQueryBuilder ();
89+ $ deleteQuery ->delete ($ table )
90+ ->where ($ deleteQuery ->expr ()->eq ($ idCol , $ deleteQuery ->createParameter ('objectid ' )));
91+
92+ $ deletedInLastChunk = self ::CHUNK_SIZE ;
93+ while ($ deletedInLastChunk === self ::CHUNK_SIZE ) {
94+ $ result = $ query ->execute ();
95+ $ deletedInLastChunk = 0 ;
96+ while ($ row = $ result ->fetch ()) {
97+ $ deletedInLastChunk ++;
98+ $ deletedEntries += $ deleteQuery ->setParameter ('objectid ' , (int ) $ row [$ idCol ])
99+ ->execute ();
100+ }
101+ $ result ->closeCursor ();
102+ }
82103
83104 return $ deletedEntries ;
84105 }
@@ -111,8 +132,7 @@ protected function cleanUserTags() {
111132 * @return int Number of deleted entries
112133 */
113134 protected function cleanComments () {
114- $ qb = $ this ->connection ->getQueryBuilder ();
115- $ deletedEntries = $ this ->cleanUp ('comments ' , $ qb ->expr ()->castColumn ('object_id ' , IQueryBuilder::PARAM_INT ), 'object_type ' );
135+ $ deletedEntries = $ this ->cleanUp ('comments ' , 'object_id ' , 'object_type ' );
116136 $ this ->logger ->debug ("$ deletedEntries orphaned comments deleted " , ['app ' => 'DeleteOrphanedItems ' ]);
117137 return $ deletedEntries ;
118138 }
@@ -123,8 +143,7 @@ protected function cleanComments() {
123143 * @return int Number of deleted entries
124144 */
125145 protected function cleanCommentMarkers () {
126- $ qb = $ this ->connection ->getQueryBuilder ();
127- $ deletedEntries = $ this ->cleanUp ('comments_read_markers ' , $ qb ->expr ()->castColumn ('object_id ' , IQueryBuilder::PARAM_INT ), 'object_type ' );
146+ $ deletedEntries = $ this ->cleanUp ('comments_read_markers ' , 'object_id ' , 'object_type ' );
128147 $ this ->logger ->debug ("$ deletedEntries orphaned comment read marks deleted " , ['app ' => 'DeleteOrphanedItems ' ]);
129148 return $ deletedEntries ;
130149 }
0 commit comments