Skip to content

Commit 8580d6b

Browse files
committed
fix(RemoveDuplicateFaceDetections): Deduplicate progressively, not in one chunk
Signed-off-by: Marcel Klehr <mklehr@gmx.net>
1 parent f3ee7a4 commit 8580d6b

File tree

1 file changed

+23
-13
lines changed

1 file changed

+23
-13
lines changed

lib/Migration/RemoveDuplicateFaceDetections.php

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -43,24 +43,34 @@ public function getName(): string {
4343

4444
public function run(IOutput $output): void {
4545
try {
46-
$subQuery = $this->db->getQueryBuilder();
47-
$subQuery->selectAlias($subQuery->func()->min('id'), 'id')
46+
$selectQuery = $this->db->getQueryBuilder();
47+
$selectQuery->selectAlias($selectQuery->func()->min('id'), 'min_id')
48+
->select('file_id', 'user_id', 'x', 'y', 'height', 'width')
4849
->from('recognize_face_detections')
4950
->groupBy('file_id', 'user_id', 'x', 'y', 'height', 'width');
5051

51-
if ($this->db->getDatabaseProvider() === IDBConnection::PLATFORM_MYSQL) {
52-
$secondSubQuery = $this->db->getQueryBuilder();
53-
$secondSubQuery->select('id')->from($secondSubQuery->createFunction('(' . $subQuery->getSQL() .')'), 'x');
54-
$sql = $secondSubQuery->getSQL();
55-
} else {
56-
$sql = $subQuery->getSQL();
57-
}
52+
$result = $selectQuery->executeQuery();
5853

59-
$qb = $this->db->getQueryBuilder();
60-
$qb->delete('recognize_face_detections')
61-
->where($qb->expr()->notIn('id', $qb->createFunction('(' . $sql .')')));
54+
$deleteQuery = $this->db->getQueryBuilder();
55+
$deleteQuery->delete('recognize_face_detections')
56+
->where($deleteQuery->expr()->neq('id', $deleteQuery->createParameter('min_id')))
57+
->andWhere($deleteQuery->expr()->eq('file_id', $deleteQuery->createParameter('file_id')))
58+
->andWhere($deleteQuery->expr()->eq('user_id', $deleteQuery->createParameter('user_id')))
59+
->andWhere($deleteQuery->expr()->eq('x', $deleteQuery->createParameter('x')))
60+
->andWhere($deleteQuery->expr()->eq('y', $deleteQuery->createParameter('y')))
61+
->andWhere($deleteQuery->expr()->eq('height', $deleteQuery->createParameter('height')))
62+
->andWhere($deleteQuery->expr()->eq('width', $deleteQuery->createParameter('width')));
6263

63-
$qb->executeStatement();
64+
while($row = $result->fetch()) {
65+
$deleteQuery->setParameter('min_id', $row['min_id']);
66+
$deleteQuery->setParameter('file_id', $row['file_id']);
67+
$deleteQuery->setParameter('user_id', $row['user_id']);
68+
$deleteQuery->setParameter('x', $row['x']);
69+
$deleteQuery->setParameter('y', $row['y']);
70+
$deleteQuery->setParameter('height', $row['height']);
71+
$deleteQuery->setParameter('width', $row['width']);
72+
$deleteQuery->executeStatement();
73+
}
6474
} catch (\Throwable $e) {
6575
$output->warning('Failed to automatically remove duplicate face detections for recognize.');
6676
$this->logger->error('Failed to automatically remove duplicate face detections', ['exception' => $e]);

0 commit comments

Comments
 (0)