Skip to content

Commit 2c65e6f

Browse files
committed
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 25a3962 commit 2c65e6f

File tree

5 files changed

+27
-98
lines changed

5 files changed

+27
-98
lines changed

apps/federatedfilesharing/lib/FederatedShareProvider.php

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -555,10 +555,7 @@ public function getSharesInFolder($userId, Folder $node, $reshares, $shallow = t
555555
$qb = $this->dbConnection->getQueryBuilder();
556556
$qb->select('*')
557557
->from('share', 's')
558-
->andWhere($qb->expr()->orX(
559-
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
560-
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
561-
))
558+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)))
562559
->andWhere(
563560
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_REMOTE))
564561
);
@@ -1045,10 +1042,7 @@ public function getAccessList($nodes, $currentAccess) {
10451042
->from('share')
10461043
->where($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_REMOTE)))
10471044
->andWhere($qb->expr()->in('file_source', $qb->createNamedParameter($ids, IQueryBuilder::PARAM_INT_ARRAY)))
1048-
->andWhere($qb->expr()->orX(
1049-
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
1050-
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
1051-
));
1045+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)));
10521046
$cursor = $qb->execute();
10531047

10541048
if ($currentAccess === false) {

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;
@@ -54,15 +55,9 @@ public function run($argument) {
5455
->from('share')
5556
->where(
5657
$qb->expr()->andX(
57-
$qb->expr()->orX(
58-
$qb->expr()->eq('share_type', $qb->expr()->literal(IShare::TYPE_LINK)),
59-
$qb->expr()->eq('share_type', $qb->expr()->literal(IShare::TYPE_EMAIL))
60-
),
58+
$qb->expr()->in('share_type', $qb->createNamedParameter([IShare::TYPE_LINK, IShare::TYPE_EMAIL], IQueryBuilder::PARAM_INT_ARRAY)),
6159
$qb->expr()->lte('expiration', $qb->expr()->literal($now)),
62-
$qb->expr()->orX(
63-
$qb->expr()->eq('item_type', $qb->expr()->literal('file')),
64-
$qb->expr()->eq('item_type', $qb->expr()->literal('folder'))
65-
)
60+
$qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY))
6661
)
6762
);
6863

apps/files_sharing/lib/OrphanHelper.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,7 @@ public function getAllShares() {
6565
$query = $this->connection->getQueryBuilder();
6666
$query->select('id', 'file_source', 'uid_owner', 'file_target')
6767
->from('share')
68-
->where($query->expr()->eq('item_type', $query->createNamedParameter('file')))
69-
->orWhere($query->expr()->eq('item_type', $query->createNamedParameter('folder')));
68+
->where($query->expr()->in('item_type', $query->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)));
7069
$result = $query->executeQuery();
7170
while ($row = $result->fetch()) {
7271
yield [

apps/sharebymail/lib/ShareByMailProvider.php

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1111,10 +1111,7 @@ public function getSharesInFolder($userId, Folder $node, $reshares, $shallow = t
11111111
$qb = $this->dbConnection->getQueryBuilder();
11121112
$qb->select('*')
11131113
->from('share', 's')
1114-
->andWhere($qb->expr()->orX(
1115-
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
1116-
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
1117-
))
1114+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)))
11181115
->andWhere(
11191116
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_EMAIL))
11201117
);
@@ -1163,10 +1160,7 @@ public function getAccessList($nodes, $currentAccess): array {
11631160
->from('share')
11641161
->where($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_EMAIL)))
11651162
->andWhere($qb->expr()->in('file_source', $qb->createNamedParameter($ids, IQueryBuilder::PARAM_INT_ARRAY)))
1166-
->andWhere($qb->expr()->orX(
1167-
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
1168-
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
1169-
));
1163+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)));
11701164
$cursor = $qb->executeQuery();
11711165

11721166
$public = false;

lib/private/Share20/DefaultShareProvider.php

Lines changed: 19 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -319,10 +319,7 @@ public function acceptShare(IShare $share, string $recipient): IShare {
319319
->where($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USERGROUP)))
320320
->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($recipient)))
321321
->andWhere($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
322-
->andWhere($qb->expr()->orX(
323-
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
324-
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
325-
))
322+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)))
326323
->execute();
327324

328325
$data = $stmt->fetch();
@@ -380,10 +377,7 @@ public function getChildren(\OCP\Share\IShare $parent) {
380377
], IQueryBuilder::PARAM_INT_ARRAY)
381378
)
382379
)
383-
->andWhere($qb->expr()->orX(
384-
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
385-
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
386-
))
380+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)))
387381
->orderBy('id');
388382

389383
$cursor = $qb->execute();
@@ -446,10 +440,7 @@ public function deleteFromSelf(IShare $share, $recipient) {
446440
->where($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USERGROUP)))
447441
->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($recipient)))
448442
->andWhere($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
449-
->andWhere($qb->expr()->orX(
450-
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
451-
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
452-
))
443+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)))
453444
->execute();
454445

455446
$data = $stmt->fetch();
@@ -562,10 +553,7 @@ public function move(\OCP\Share\IShare $share, $recipient) {
562553
->where($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USERGROUP)))
563554
->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($recipient)))
564555
->andWhere($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
565-
->andWhere($qb->expr()->orX(
566-
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
567-
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
568-
))
556+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)))
569557
->setMaxResults(1)
570558
->execute();
571559

@@ -618,16 +606,9 @@ public function getSharesInFolder($userId, Folder $node, $reshares, $shallow = t
618606
'f.parent AS f_parent', 'f.name', 'f.mimetype', 'f.mimepart', 'f.size', 'f.mtime', 'f.storage_mtime',
619607
'f.encrypted', 'f.unencrypted_size', 'f.etag', 'f.checksum')
620608
->from('share', 's')
621-
->andWhere($qb->expr()->orX(
622-
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
623-
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
624-
));
609+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)));
625610

626-
$qb->andWhere($qb->expr()->orX(
627-
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USER)),
628-
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_GROUP)),
629-
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_LINK))
630-
));
611+
$qb->andWhere($qb->expr()->in('share_type', $qb->createNamedParameter([IShare::TYPE_USER, IShare::TYPE_GROUP, IShare::TYPE_LINK], IQueryBuilder::PARAM_INT_ARRAY)));
631612

632613
/**
633614
* Reshares for this user are shares where they are the owner.
@@ -690,10 +671,7 @@ public function getSharesBy($userId, $shareType, $node, $reshares, $limit, $offs
690671
$qb = $this->dbConn->getQueryBuilder();
691672
$qb->select('*')
692673
->from('share')
693-
->andWhere($qb->expr()->orX(
694-
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
695-
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
696-
));
674+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)));
697675

698676
$qb->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter($shareType)));
699677

@@ -753,10 +731,7 @@ public function getShareById($id, $recipientId = null) {
753731
], IQueryBuilder::PARAM_INT_ARRAY)
754732
)
755733
)
756-
->andWhere($qb->expr()->orX(
757-
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
758-
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
759-
));
734+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)));
760735

761736
$cursor = $qb->execute();
762737
$data = $cursor->fetch();
@@ -798,10 +773,7 @@ public function getSharesByPath(Node $path) {
798773
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_GROUP))
799774
)
800775
)
801-
->andWhere($qb->expr()->orX(
802-
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
803-
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
804-
))
776+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)))
805777
->execute();
806778

807779
$shares = [];
@@ -869,10 +841,7 @@ public function getSharedWith($userId, $shareType, $node, $limit, $offset) {
869841

870842
$qb->where($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USER)))
871843
->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($userId)))
872-
->andWhere($qb->expr()->orX(
873-
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
874-
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
875-
));
844+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)));
876845

877846
// Filter by node if provided
878847
if ($node !== null) {
@@ -938,10 +907,7 @@ public function getSharedWith($userId, $shareType, $node, $limit, $offset) {
938907
$groups,
939908
IQueryBuilder::PARAM_STR_ARRAY
940909
)))
941-
->andWhere($qb->expr()->orX(
942-
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
943-
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
944-
));
910+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)));
945911

946912
$cursor = $qb->execute();
947913
while ($data = $cursor->fetch()) {
@@ -984,10 +950,7 @@ public function getShareByToken($token) {
984950
->from('share')
985951
->where($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_LINK)))
986952
->andWhere($qb->expr()->eq('token', $qb->createNamedParameter($token)))
987-
->andWhere($qb->expr()->orX(
988-
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
989-
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
990-
))
953+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)))
991954
->executeQuery();
992955

993956
$data = $cursor->fetch();
@@ -1085,7 +1048,7 @@ private function resolveGroupShares($shareMap, $userId) {
10851048
->from('share')
10861049
->where($qb->expr()->eq('share_with', $qb->createNamedParameter($userId)))
10871050
->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USERGROUP)))
1088-
->andWhere($qb->expr()->in('item_type', [$qb->createNamedParameter('file'), $qb->createNamedParameter('folder')]));
1051+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)));
10891052

10901053
// this is called with either all group shares or one group share.
10911054
// for all shares it's easier to just only search by share_with,
@@ -1142,10 +1105,7 @@ public function userDeleted($uid, $shareType) {
11421105
*/
11431106
$qb->where(
11441107
$qb->expr()->andX(
1145-
$qb->expr()->orX(
1146-
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_GROUP)),
1147-
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USERGROUP))
1148-
),
1108+
$qb->expr()->in('share_type', $qb->createNamedParameter([IShare::TYPE_GROUP, IShare::TYPE_USERGROUP], IQueryBuilder::PARAM_INT_ARRAY)),
11491109
$qb->expr()->eq('uid_owner', $qb->createNamedParameter($uid))
11501110
)
11511111
);
@@ -1318,26 +1278,19 @@ public function getAccessList($nodes, $currentAccess) {
13181278

13191279
$qb = $this->dbConn->getQueryBuilder();
13201280

1321-
$or = $qb->expr()->orX(
1322-
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USER)),
1323-
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_GROUP)),
1324-
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_LINK))
1325-
);
1281+
$shareTypes = [IShare::TYPE_USER, IShare::TYPE_GROUP, IShare::TYPE_LINK];
13261282

13271283
if ($currentAccess) {
1328-
$or->add($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USERGROUP)));
1284+
$shareTypes[] = IShare::TYPE_USERGROUP;
13291285
}
13301286

13311287
$qb->select('id', 'parent', 'share_type', 'share_with', 'file_source', 'file_target', 'permissions')
13321288
->from('share')
13331289
->where(
1334-
$or
1290+
$qb->expr()->in('share_type', $qb->createNamedParameter($shareTypes, IQueryBuilder::PARAM_INT_ARRAY))
13351291
)
13361292
->andWhere($qb->expr()->in('file_source', $qb->createNamedParameter($ids, IQueryBuilder::PARAM_INT_ARRAY)))
1337-
->andWhere($qb->expr()->orX(
1338-
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
1339-
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
1340-
));
1293+
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)));
13411294

13421295
// Ensure accepted is true for user and usergroup type
13431296
$qb->andWhere(
@@ -1655,13 +1608,7 @@ public function getAllShares(): iterable {
16551608

16561609
$qb->select('*')
16571610
->from('share')
1658-
->where(
1659-
$qb->expr()->orX(
1660-
$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share\IShare::TYPE_USER)),
1661-
$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share\IShare::TYPE_GROUP)),
1662-
$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share\IShare::TYPE_LINK))
1663-
)
1664-
);
1611+
->where($qb->expr()->in('share_type', $qb->createNamedParameter([IShare::TYPE_USER, IShare::TYPE_GROUP, IShare::TYPE_LINK], IQueryBuilder::PARAM_INT_ARRAY)));
16651612

16661613
$cursor = $qb->execute();
16671614
while ($data = $cursor->fetch()) {

0 commit comments

Comments
 (0)