Skip to content

Commit b4172f1

Browse files
marcelklehrbackportbot[bot]
authored andcommitted
perf(sharing): Use oc_share.{item_type, share_type} IN instead of OR equals
to improve performance by using the db index Signed-off-by: Marcel Klehr <mklehr@gmx.net>
1 parent 760503d commit b4172f1

File tree

5 files changed

+29
-111
lines changed

5 files changed

+29
-111
lines changed

apps/federatedfilesharing/lib/FederatedShareProvider.php

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -557,10 +557,7 @@ public function getSharesInFolder($userId, Folder $node, $reshares, $shallow = t
557557
$qb = $this->dbConnection->getQueryBuilder();
558558
$qb->select('*')
559559
->from('share', 's')
560-
->andWhere($qb->expr()->orX(
561-
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
562-
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
563-
))
560+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)))
564561
->andWhere(
565562
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_REMOTE))
566563
);
@@ -1038,10 +1035,7 @@ public function getAccessList($nodes, $currentAccess) {
10381035
->from('share')
10391036
->where($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_REMOTE)))
10401037
->andWhere($qb->expr()->in('file_source', $qb->createNamedParameter($ids, IQueryBuilder::PARAM_INT_ARRAY)))
1041-
->andWhere($qb->expr()->orX(
1042-
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
1043-
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
1044-
));
1038+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)));
10451039
$cursor = $qb->executeQuery();
10461040

10471041
if ($currentAccess === false) {
@@ -1068,12 +1062,7 @@ public function getAllShares(): iterable {
10681062

10691063
$qb->select('*')
10701064
->from('share')
1071-
->where(
1072-
$qb->expr()->orX(
1073-
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_REMOTE)),
1074-
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_REMOTE_GROUP))
1075-
)
1076-
);
1065+
->where($qb->expr()->in('share_type', $qb->createNamedParameter([IShare::TYPE_REMOTE_GROUP, IShare::TYPE_REMOTE], IQueryBuilder::PARAM_INT_ARRAY)));
10771066

10781067
$cursor = $qb->executeQuery();
10791068
while ($data = $cursor->fetch()) {

apps/files_sharing/lib/ExpireSharesJob.php

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
use OCP\AppFramework\Utility\ITimeFactory;
1010
use OCP\BackgroundJob\TimedJob;
11+
use OCP\DB\QueryBuilder\IQueryBuilder;
1112
use OCP\IDBConnection;
1213
use OCP\Share\Exceptions\ShareNotFound;
1314
use OCP\Share\IManager;
@@ -49,15 +50,9 @@ public function run($argument) {
4950
->from('share')
5051
->where(
5152
$qb->expr()->andX(
52-
$qb->expr()->orX(
53-
$qb->expr()->eq('share_type', $qb->expr()->literal(IShare::TYPE_LINK)),
54-
$qb->expr()->eq('share_type', $qb->expr()->literal(IShare::TYPE_EMAIL))
55-
),
53+
$qb->expr()->in('share_type', $qb->createNamedParameter([IShare::TYPE_LINK, IShare::TYPE_EMAIL], IQueryBuilder::PARAM_INT_ARRAY)),
5654
$qb->expr()->lte('expiration', $qb->expr()->literal($now)),
57-
$qb->expr()->orX(
58-
$qb->expr()->eq('item_type', $qb->expr()->literal('file')),
59-
$qb->expr()->eq('item_type', $qb->expr()->literal('folder'))
60-
)
55+
$qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY))
6156
)
6257
);
6358

apps/files_sharing/lib/OrphanHelper.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,7 @@ public function getAllShares() {
5858
$query = $this->connection->getQueryBuilder();
5959
$query->select('id', 'file_source', 'uid_owner', 'file_target')
6060
->from('share')
61-
->where($query->expr()->eq('item_type', $query->createNamedParameter('file')))
62-
->orWhere($query->expr()->eq('item_type', $query->createNamedParameter('folder')));
61+
->where($query->expr()->in('item_type', $query->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)));
6362
$result = $query->executeQuery();
6463
while ($row = $result->fetch()) {
6564
yield [

apps/sharebymail/lib/ShareByMailProvider.php

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1115,10 +1115,7 @@ public function getSharesInFolder($userId, Folder $node, $reshares, $shallow = t
11151115
$qb = $this->dbConnection->getQueryBuilder();
11161116
$qb->select('*')
11171117
->from('share', 's')
1118-
->andWhere($qb->expr()->orX(
1119-
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
1120-
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
1121-
))
1118+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)))
11221119
->andWhere(
11231120
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_EMAIL))
11241121
);
@@ -1167,10 +1164,7 @@ public function getAccessList($nodes, $currentAccess): array {
11671164
->from('share')
11681165
->where($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_EMAIL)))
11691166
->andWhere($qb->expr()->in('file_source', $qb->createNamedParameter($ids, IQueryBuilder::PARAM_INT_ARRAY)))
1170-
->andWhere($qb->expr()->orX(
1171-
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
1172-
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
1173-
));
1167+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)));
11741168
$cursor = $qb->executeQuery();
11751169

11761170
$public = false;

lib/private/Share20/DefaultShareProvider.php

Lines changed: 20 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -322,10 +322,7 @@ public function acceptShare(IShare $share, string $recipient): IShare {
322322
->where($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USERGROUP)))
323323
->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($recipient)))
324324
->andWhere($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
325-
->andWhere($qb->expr()->orX(
326-
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
327-
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
328-
))
325+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)))
329326
->executeQuery();
330327

331328
$data = $stmt->fetch();
@@ -383,10 +380,7 @@ public function getChildren(\OCP\Share\IShare $parent) {
383380
], IQueryBuilder::PARAM_INT_ARRAY)
384381
)
385382
)
386-
->andWhere($qb->expr()->orX(
387-
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
388-
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
389-
))
383+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)))
390384
->orderBy('id');
391385

392386
$cursor = $qb->executeQuery();
@@ -449,10 +443,7 @@ public function deleteFromSelf(IShare $share, $recipient) {
449443
->where($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USERGROUP)))
450444
->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($recipient)))
451445
->andWhere($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
452-
->andWhere($qb->expr()->orX(
453-
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
454-
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
455-
))
446+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)))
456447
->executeQuery();
457448

458449
$data = $stmt->fetch();
@@ -565,10 +556,7 @@ public function move(\OCP\Share\IShare $share, $recipient) {
565556
->where($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USERGROUP)))
566557
->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($recipient)))
567558
->andWhere($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
568-
->andWhere($qb->expr()->orX(
569-
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
570-
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
571-
))
559+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)))
572560
->setMaxResults(1)
573561
->executeQuery();
574562

@@ -621,16 +609,9 @@ public function getSharesInFolder($userId, Folder $node, $reshares, $shallow = t
621609
'f.parent AS f_parent', 'f.name', 'f.mimetype', 'f.mimepart', 'f.size', 'f.mtime', 'f.storage_mtime',
622610
'f.encrypted', 'f.unencrypted_size', 'f.etag', 'f.checksum')
623611
->from('share', 's')
624-
->andWhere($qb->expr()->orX(
625-
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
626-
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
627-
));
612+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)));
628613

629-
$qb->andWhere($qb->expr()->orX(
630-
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USER)),
631-
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_GROUP)),
632-
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_LINK))
633-
));
614+
$qb->andWhere($qb->expr()->in('share_type', $qb->createNamedParameter([IShare::TYPE_USER, IShare::TYPE_GROUP, IShare::TYPE_LINK], IQueryBuilder::PARAM_INT_ARRAY)));
634615

635616
/**
636617
* Reshares for this user are shares where they are the owner.
@@ -693,10 +674,7 @@ public function getSharesBy($userId, $shareType, $node, $reshares, $limit, $offs
693674
$qb = $this->dbConn->getQueryBuilder();
694675
$qb->select('*')
695676
->from('share')
696-
->andWhere($qb->expr()->orX(
697-
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
698-
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
699-
));
677+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)));
700678

701679
$qb->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter($shareType)));
702680

@@ -756,10 +734,7 @@ public function getShareById($id, $recipientId = null) {
756734
], IQueryBuilder::PARAM_INT_ARRAY)
757735
)
758736
)
759-
->andWhere($qb->expr()->orX(
760-
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
761-
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
762-
));
737+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)));
763738

764739
$cursor = $qb->executeQuery();
765740
$data = $cursor->fetch();
@@ -795,17 +770,8 @@ public function getSharesByPath(Node $path) {
795770
$cursor = $qb->select('*')
796771
->from('share')
797772
->andWhere($qb->expr()->eq('file_source', $qb->createNamedParameter($path->getId())))
798-
->andWhere(
799-
$qb->expr()->orX(
800-
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USER)),
801-
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_GROUP)),
802-
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_LINK)),
803-
)
804-
)
805-
->andWhere($qb->expr()->orX(
806-
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
807-
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
808-
))
773+
->andWhere($qb->expr()->in('share_type', $qb->createNamedParameter([IShare::TYPE_USER, IShare::TYPE_GROUP, IShare::TYPE_LINK], IQueryBuilder::PARAM_INT_ARRAY)))
774+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)))
809775
->orderBy('id', 'ASC')
810776
->executeQuery();
811777

@@ -874,10 +840,7 @@ public function getSharedWith($userId, $shareType, $node, $limit, $offset) {
874840

875841
$qb->where($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USER)))
876842
->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($userId)))
877-
->andWhere($qb->expr()->orX(
878-
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
879-
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
880-
));
843+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)));
881844

882845
// Filter by node if provided
883846
if ($node !== null) {
@@ -942,10 +905,7 @@ public function getSharedWith($userId, $shareType, $node, $limit, $offset) {
942905
$groups,
943906
IQueryBuilder::PARAM_STR_ARRAY
944907
)))
945-
->andWhere($qb->expr()->orX(
946-
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
947-
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
948-
));
908+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)));
949909

950910
$cursor = $qb->executeQuery();
951911
while ($data = $cursor->fetch()) {
@@ -988,10 +948,7 @@ public function getShareByToken($token) {
988948
->from('share')
989949
->where($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_LINK)))
990950
->andWhere($qb->expr()->eq('token', $qb->createNamedParameter($token)))
991-
->andWhere($qb->expr()->orX(
992-
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
993-
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
994-
))
951+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)))
995952
->executeQuery();
996953

997954
$data = $cursor->fetch();
@@ -1090,7 +1047,7 @@ private function resolveGroupShares($shareMap, $userId) {
10901047
->from('share')
10911048
->where($qb->expr()->eq('share_with', $qb->createNamedParameter($userId)))
10921049
->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USERGROUP)))
1093-
->andWhere($qb->expr()->in('item_type', [$qb->createNamedParameter('file'), $qb->createNamedParameter('folder')]));
1050+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)));
10941051

10951052
// this is called with either all group shares or one group share.
10961053
// for all shares it's easier to just only search by share_with,
@@ -1147,10 +1104,7 @@ public function userDeleted($uid, $shareType) {
11471104
*/
11481105
$qb->where(
11491106
$qb->expr()->andX(
1150-
$qb->expr()->orX(
1151-
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_GROUP)),
1152-
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USERGROUP))
1153-
),
1107+
$qb->expr()->in('share_type', $qb->createNamedParameter([IShare::TYPE_GROUP, IShare::TYPE_USERGROUP], IQueryBuilder::PARAM_INT_ARRAY)),
11541108
$qb->expr()->eq('uid_owner', $qb->createNamedParameter($uid))
11551109
)
11561110
);
@@ -1323,26 +1277,19 @@ public function getAccessList($nodes, $currentAccess) {
13231277

13241278
$qb = $this->dbConn->getQueryBuilder();
13251279

1326-
$or = $qb->expr()->orX(
1327-
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USER)),
1328-
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_GROUP)),
1329-
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_LINK))
1330-
);
1280+
$shareTypes = [IShare::TYPE_USER, IShare::TYPE_GROUP, IShare::TYPE_LINK];
13311281

13321282
if ($currentAccess) {
1333-
$or->add($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USERGROUP)));
1283+
$shareTypes[] = IShare::TYPE_USERGROUP;
13341284
}
13351285

13361286
$qb->select('id', 'parent', 'share_type', 'share_with', 'file_source', 'file_target', 'permissions')
13371287
->from('share')
13381288
->where(
1339-
$or
1289+
$qb->expr()->in('share_type', $qb->createNamedParameter($shareTypes, IQueryBuilder::PARAM_INT_ARRAY))
13401290
)
13411291
->andWhere($qb->expr()->in('file_source', $qb->createNamedParameter($ids, IQueryBuilder::PARAM_INT_ARRAY)))
1342-
->andWhere($qb->expr()->orX(
1343-
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
1344-
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
1345-
));
1292+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)));
13461293

13471294
// Ensure accepted is true for user and usergroup type
13481295
$qb->andWhere(
@@ -1659,13 +1606,7 @@ public function getAllShares(): iterable {
16591606

16601607
$qb->select('*')
16611608
->from('share')
1662-
->where(
1663-
$qb->expr()->orX(
1664-
$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share\IShare::TYPE_USER)),
1665-
$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share\IShare::TYPE_GROUP)),
1666-
$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share\IShare::TYPE_LINK))
1667-
)
1668-
);
1609+
->where($qb->expr()->in('share_type', $qb->createNamedParameter([IShare::TYPE_USER, IShare::TYPE_GROUP, IShare::TYPE_LINK], IQueryBuilder::PARAM_INT_ARRAY)));
16691610

16701611
$cursor = $qb->executeQuery();
16711612
while ($data = $cursor->fetch()) {

0 commit comments

Comments
 (0)