2424 */
2525namespace OCA \Recognize \Migration ;
2626
27+ use OCP \DB \QueryBuilder \IQueryBuilder ;
2728use OCP \IDBConnection ;
2829use OCP \Migration \IOutput ;
2930use 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