Skip to content

Commit 6ece12a

Browse files
authored
Merge pull request #1345 from nextcloud/backport/1343/stable9
[stable9] fix(RemoveDuplicateFaceDetections): Deduplicate progressively, not in one chunk
2 parents 9109ae3 + 6770b44 commit 6ece12a

File tree

1 file changed

+32
-14
lines changed

1 file changed

+32
-14
lines changed

lib/Migration/RemoveDuplicateFaceDetections.php

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
*/
2525
namespace OCA\Recognize\Migration;
2626

27+
use OCP\DB\QueryBuilder\IQueryBuilder;
2728
use OCP\IDBConnection;
2829
use OCP\Migration\IOutput;
2930
use OCP\Migration\IRepairStep;
@@ -43,27 +44,44 @@ public function getName(): string {
4344

4445
public function run(IOutput $output): void {
4546
try {
46-
$subQuery = $this->db->getQueryBuilder();
47-
$subQuery->selectAlias($subQuery->func()->min('id'), 'id')
47+
$selectQuery = $this->db->getQueryBuilder();
48+
$selectQuery
49+
->select('file_id', 'user_id', 'x', 'y', 'height', 'width')
50+
->selectAlias($selectQuery->func()->min('id'), 'min_id')
4851
->from('recognize_face_detections')
4952
->groupBy('file_id', 'user_id', 'x', 'y', 'height', 'width');
5053

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-
}
54+
$result = $selectQuery->executeQuery();
5855

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

63-
$qb->executeStatement();
68+
while (
69+
/** @var array{min_id: int, file_id: int, user_id: string, x: float, y: float, height: float, width: float} $row */
70+
$row = $result->fetch()
71+
) {
72+
$deleteQuery->setParameter('min_id', $row['min_id'], IQueryBuilder::PARAM_INT);
73+
$deleteQuery->setParameter('file_id', $row['file_id'], IQueryBuilder::PARAM_INT);
74+
$deleteQuery->setParameter('user_id', $row['user_id']);
75+
$deleteQuery->setParameter('x', $row['x']);
76+
$deleteQuery->setParameter('y', $row['y']);
77+
$deleteQuery->setParameter('height', $row['height']);
78+
$deleteQuery->setParameter('width', $row['width']);
79+
$deleteQuery->executeStatement();
80+
}
81+
$result->closeCursor();
6482
} catch (\Throwable $e) {
6583
$output->warning('Failed to automatically remove duplicate face detections for recognize.');
66-
$this->logger->error('Failed to automatically remove duplicate face detections', ['exception' => $e]);
84+
throw new \Exception('Failed to automatically remove duplicate face detections', previous: $e);
6785
}
6886
}
6987
}

0 commit comments

Comments
 (0)