Passed
Pull Request — master (#262)
by Matias
06:19 queued 04:24
created

RelationMapper::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 2
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
nc 1
nop 1
dl 0
loc 2
ccs 0
cts 2
cp 0
crap 2
rs 10
c 1
b 0
f 0
1
<?php
2
/**
3
 * @copyright Copyright (c) 2020, Matias De lellis <[email protected]>
4
 *
5
 * @author Matias De lellis <[email protected]>
6
 *
7
 * @license GNU AGPL version 3 or any later version
8
 *
9
 * This program is free software: you can redistribute it and/or modify
10
 * it under the terms of the GNU Affero General Public License as
11
 * published by the Free Software Foundation, either version 3 of the
12
 * License, or (at your option) any later version.
13
 *
14
 * This program is distributed in the hope that it will be useful,
15
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
 * GNU Affero General Public License for more details.
18
 *
19
 * You should have received a copy of the GNU Affero General Public License
20
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
 *
22
 */
23
24
namespace OCA\FaceRecognition\Db;
25
26
use OC\DB\QueryBuilder\Literal;
0 ignored issues
show
Bug introduced by
The type OC\DB\QueryBuilder\Literal was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
27
28
use OCP\IDBConnection;
29
use OCP\AppFramework\Db\QBMapper;
30
use OCP\AppFramework\Db\DoesNotExistException;
31
use OCP\DB\QueryBuilder\IQueryBuilder;
32
33
class RelationMapper extends QBMapper {
34
35
	public function __construct(IDBConnection $db) {
36
		parent::__construct($db, 'facerecog_relations', '\OCA\FaceRecognition\Db\Relation');
37
	}
38
39
	public function exists(Relation $relation): bool {
40
		$qb = $this->db->getQueryBuilder();
41
		$query = $qb
42
			->select(['id'])
43
			->from($this->getTableName())
44
			->where($qb->expr()->andX($qb->expr()->eq('face1', $qb->createParameter('face1')), $qb->expr()->eq('face2', $qb->createParameter('face2'))))
45
			->orWhere($qb->expr()->andX($qb->expr()->eq('face2', $qb->createParameter('face1')), $qb->expr()->eq('face1', $qb->createParameter('face2'))))
46
			->setParameter('face1', $relation->getFace1())
47
			->setParameter('face2', $relation->getFace2());
48
49
		$resultStatement = $query->execute();
50
		$row = $resultStatement->fetch();
51
		$resultStatement->closeCursor();
52
53
		return ($row !== false);
54
	}
55
56
	public function findFromPerson(string $userId, int $personId, int $state): array {
57
		$qb = $this->db->getQueryBuilder();
58
		$qb->select('r.id', 'r.face1', 'r.face2', 'r.state')
59
		   ->from($this->getTableName(), 'r')
60
		   ->innerJoin('r', 'facerecog_faces' ,'f', $qb->expr()->orX($qb->expr()->eq('r.face1', 'f.id'), $qb->expr()->eq('r.face2', 'f.id')))
0 ignored issues
show
Bug introduced by
$qb->expr()->orX($qb->ex...>eq('r.face2', 'f.id')) of type OCP\DB\QueryBuilder\ICompositeExpression is incompatible with the type string expected by parameter $condition of OCP\DB\QueryBuilder\IQueryBuilder::innerJoin(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

60
		   ->innerJoin('r', 'facerecog_faces' ,'f', /** @scrutinizer ignore-type */ $qb->expr()->orX($qb->expr()->eq('r.face1', 'f.id'), $qb->expr()->eq('r.face2', 'f.id')))
Loading history...
61
		   ->innerJoin('f', 'facerecog_persons' ,'p', $qb->expr()->eq('f.person', 'p.id'))
62
		   ->where($qb->expr()->eq('p.user', $qb->createNamedParameter($userId)))
63
		   ->andWhere($qb->expr()->eq('p.id', $qb->createNamedParameter($personId)))
64
		   ->andWhere($qb->expr()->eq('r.state', $qb->createNamedParameter($state)));
65
66
		return $this->findEntities($qb);
67
	}
68
69
	public function findFromPersons(int $personId1, int $personId2) {
70
		$sub1 = $this->db->getQueryBuilder();
71
		$sub1->select('f.id')
72
		      ->from('facerecog_faces', 'f')
73
		      ->where($sub1->expr()->eq('f.person', $sub1->createParameter('person1')));
74
75
		$sub2 = $this->db->getQueryBuilder();
76
		$sub2->select('f.id')
77
		      ->from('facerecog_faces', 'f')
78
		      ->where($sub2->expr()->eq('f.person', $sub2->createParameter('person2')));
79
80
		$qb = $this->db->getQueryBuilder();
81
		$qb->select('r.id', 'r.face1', 'r.face2', 'r.state')
82
		   ->from($this->getTableName(), 'r')
83
		   ->where('((r.face1 IN (' . $sub1->getSQL() . ')) AND (r.face2 IN (' . $sub2->getSQL() . ')))')
84
		   ->orWhere('((r.face2 IN (' . $sub1->getSQL() . ')) AND (r.face1 IN (' . $sub2->getSQL() . ')))')
85
		   ->setParameter('person1', $personId1)
86
		   ->setParameter('person2', $personId2);
87
88
		return $this->findEntities($qb);
89
	}
90
91
}