mirror of
https://github.com/nextcloud/server.git
synced 2026-05-28 04:32:30 -04:00
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>
This commit is contained in:
parent
7a05c00593
commit
b464469bc1
5 changed files with 29 additions and 111 deletions
|
|
@ -557,10 +557,7 @@ class FederatedShareProvider implements IShareProvider {
|
|||
$qb = $this->dbConnection->getQueryBuilder();
|
||||
$qb->select('*')
|
||||
->from('share', 's')
|
||||
->andWhere($qb->expr()->orX(
|
||||
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
|
||||
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
|
||||
))
|
||||
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)))
|
||||
->andWhere(
|
||||
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_REMOTE))
|
||||
);
|
||||
|
|
@ -1038,10 +1035,7 @@ class FederatedShareProvider implements IShareProvider {
|
|||
->from('share')
|
||||
->where($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_REMOTE)))
|
||||
->andWhere($qb->expr()->in('file_source', $qb->createNamedParameter($ids, IQueryBuilder::PARAM_INT_ARRAY)))
|
||||
->andWhere($qb->expr()->orX(
|
||||
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
|
||||
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
|
||||
));
|
||||
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)));
|
||||
$cursor = $qb->executeQuery();
|
||||
|
||||
if ($currentAccess === false) {
|
||||
|
|
@ -1068,12 +1062,7 @@ class FederatedShareProvider implements IShareProvider {
|
|||
|
||||
$qb->select('*')
|
||||
->from('share')
|
||||
->where(
|
||||
$qb->expr()->orX(
|
||||
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_REMOTE)),
|
||||
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_REMOTE_GROUP))
|
||||
)
|
||||
);
|
||||
->where($qb->expr()->in('share_type', $qb->createNamedParameter([IShare::TYPE_REMOTE_GROUP, IShare::TYPE_REMOTE], IQueryBuilder::PARAM_INT_ARRAY)));
|
||||
|
||||
$cursor = $qb->executeQuery();
|
||||
while ($data = $cursor->fetch()) {
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ namespace OCA\Files_Sharing;
|
|||
|
||||
use OCP\AppFramework\Utility\ITimeFactory;
|
||||
use OCP\BackgroundJob\TimedJob;
|
||||
use OCP\DB\QueryBuilder\IQueryBuilder;
|
||||
use OCP\IDBConnection;
|
||||
use OCP\Share\Exceptions\ShareNotFound;
|
||||
use OCP\Share\IManager;
|
||||
|
|
@ -49,15 +50,9 @@ class ExpireSharesJob extends TimedJob {
|
|||
->from('share')
|
||||
->where(
|
||||
$qb->expr()->andX(
|
||||
$qb->expr()->orX(
|
||||
$qb->expr()->eq('share_type', $qb->expr()->literal(IShare::TYPE_LINK)),
|
||||
$qb->expr()->eq('share_type', $qb->expr()->literal(IShare::TYPE_EMAIL))
|
||||
),
|
||||
$qb->expr()->in('share_type', $qb->createNamedParameter([IShare::TYPE_LINK, IShare::TYPE_EMAIL], IQueryBuilder::PARAM_INT_ARRAY)),
|
||||
$qb->expr()->lte('expiration', $qb->expr()->literal($now)),
|
||||
$qb->expr()->orX(
|
||||
$qb->expr()->eq('item_type', $qb->expr()->literal('file')),
|
||||
$qb->expr()->eq('item_type', $qb->expr()->literal('folder'))
|
||||
)
|
||||
$qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY))
|
||||
)
|
||||
);
|
||||
|
||||
|
|
|
|||
|
|
@ -58,8 +58,7 @@ class OrphanHelper {
|
|||
$query = $this->connection->getQueryBuilder();
|
||||
$query->select('id', 'file_source', 'uid_owner', 'file_target')
|
||||
->from('share')
|
||||
->where($query->expr()->eq('item_type', $query->createNamedParameter('file')))
|
||||
->orWhere($query->expr()->eq('item_type', $query->createNamedParameter('folder')));
|
||||
->where($query->expr()->in('item_type', $query->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)));
|
||||
$result = $query->executeQuery();
|
||||
while ($row = $result->fetch()) {
|
||||
yield [
|
||||
|
|
|
|||
|
|
@ -1115,10 +1115,7 @@ class ShareByMailProvider extends DefaultShareProvider implements IShareProvider
|
|||
$qb = $this->dbConnection->getQueryBuilder();
|
||||
$qb->select('*')
|
||||
->from('share', 's')
|
||||
->andWhere($qb->expr()->orX(
|
||||
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
|
||||
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
|
||||
))
|
||||
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)))
|
||||
->andWhere(
|
||||
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_EMAIL))
|
||||
);
|
||||
|
|
@ -1167,10 +1164,7 @@ class ShareByMailProvider extends DefaultShareProvider implements IShareProvider
|
|||
->from('share')
|
||||
->where($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_EMAIL)))
|
||||
->andWhere($qb->expr()->in('file_source', $qb->createNamedParameter($ids, IQueryBuilder::PARAM_INT_ARRAY)))
|
||||
->andWhere($qb->expr()->orX(
|
||||
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
|
||||
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
|
||||
));
|
||||
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)));
|
||||
$cursor = $qb->executeQuery();
|
||||
|
||||
$public = false;
|
||||
|
|
|
|||
|
|
@ -322,10 +322,7 @@ class DefaultShareProvider implements IShareProviderWithNotification, IShareProv
|
|||
->where($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USERGROUP)))
|
||||
->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($recipient)))
|
||||
->andWhere($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
|
||||
->andWhere($qb->expr()->orX(
|
||||
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
|
||||
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
|
||||
))
|
||||
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)))
|
||||
->executeQuery();
|
||||
|
||||
$data = $stmt->fetch();
|
||||
|
|
@ -383,10 +380,7 @@ class DefaultShareProvider implements IShareProviderWithNotification, IShareProv
|
|||
], IQueryBuilder::PARAM_INT_ARRAY)
|
||||
)
|
||||
)
|
||||
->andWhere($qb->expr()->orX(
|
||||
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
|
||||
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
|
||||
))
|
||||
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)))
|
||||
->orderBy('id');
|
||||
|
||||
$cursor = $qb->executeQuery();
|
||||
|
|
@ -449,10 +443,7 @@ class DefaultShareProvider implements IShareProviderWithNotification, IShareProv
|
|||
->where($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USERGROUP)))
|
||||
->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($recipient)))
|
||||
->andWhere($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
|
||||
->andWhere($qb->expr()->orX(
|
||||
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
|
||||
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
|
||||
))
|
||||
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)))
|
||||
->executeQuery();
|
||||
|
||||
$data = $stmt->fetch();
|
||||
|
|
@ -565,10 +556,7 @@ class DefaultShareProvider implements IShareProviderWithNotification, IShareProv
|
|||
->where($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USERGROUP)))
|
||||
->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($recipient)))
|
||||
->andWhere($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
|
||||
->andWhere($qb->expr()->orX(
|
||||
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
|
||||
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
|
||||
))
|
||||
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)))
|
||||
->setMaxResults(1)
|
||||
->executeQuery();
|
||||
|
||||
|
|
@ -621,16 +609,9 @@ class DefaultShareProvider implements IShareProviderWithNotification, IShareProv
|
|||
'f.parent AS f_parent', 'f.name', 'f.mimetype', 'f.mimepart', 'f.size', 'f.mtime', 'f.storage_mtime',
|
||||
'f.encrypted', 'f.unencrypted_size', 'f.etag', 'f.checksum')
|
||||
->from('share', 's')
|
||||
->andWhere($qb->expr()->orX(
|
||||
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
|
||||
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
|
||||
));
|
||||
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)));
|
||||
|
||||
$qb->andWhere($qb->expr()->orX(
|
||||
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USER)),
|
||||
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_GROUP)),
|
||||
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_LINK))
|
||||
));
|
||||
$qb->andWhere($qb->expr()->in('share_type', $qb->createNamedParameter([IShare::TYPE_USER, IShare::TYPE_GROUP, IShare::TYPE_LINK], IQueryBuilder::PARAM_INT_ARRAY)));
|
||||
|
||||
/**
|
||||
* Reshares for this user are shares where they are the owner.
|
||||
|
|
@ -693,10 +674,7 @@ class DefaultShareProvider implements IShareProviderWithNotification, IShareProv
|
|||
$qb = $this->dbConn->getQueryBuilder();
|
||||
$qb->select('*')
|
||||
->from('share')
|
||||
->andWhere($qb->expr()->orX(
|
||||
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
|
||||
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
|
||||
));
|
||||
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)));
|
||||
|
||||
$qb->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter($shareType)));
|
||||
|
||||
|
|
@ -756,10 +734,7 @@ class DefaultShareProvider implements IShareProviderWithNotification, IShareProv
|
|||
], IQueryBuilder::PARAM_INT_ARRAY)
|
||||
)
|
||||
)
|
||||
->andWhere($qb->expr()->orX(
|
||||
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
|
||||
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
|
||||
));
|
||||
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)));
|
||||
|
||||
$cursor = $qb->executeQuery();
|
||||
$data = $cursor->fetch();
|
||||
|
|
@ -795,17 +770,8 @@ class DefaultShareProvider implements IShareProviderWithNotification, IShareProv
|
|||
$cursor = $qb->select('*')
|
||||
->from('share')
|
||||
->andWhere($qb->expr()->eq('file_source', $qb->createNamedParameter($path->getId())))
|
||||
->andWhere(
|
||||
$qb->expr()->orX(
|
||||
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USER)),
|
||||
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_GROUP)),
|
||||
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_LINK)),
|
||||
)
|
||||
)
|
||||
->andWhere($qb->expr()->orX(
|
||||
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
|
||||
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
|
||||
))
|
||||
->andWhere($qb->expr()->in('share_type', $qb->createNamedParameter([IShare::TYPE_USER, IShare::TYPE_GROUP, IShare::TYPE_LINK], IQueryBuilder::PARAM_INT_ARRAY)))
|
||||
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)))
|
||||
->orderBy('id', 'ASC')
|
||||
->executeQuery();
|
||||
|
||||
|
|
@ -874,10 +840,7 @@ class DefaultShareProvider implements IShareProviderWithNotification, IShareProv
|
|||
|
||||
$qb->where($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USER)))
|
||||
->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($userId)))
|
||||
->andWhere($qb->expr()->orX(
|
||||
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
|
||||
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
|
||||
));
|
||||
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)));
|
||||
|
||||
// Filter by node if provided
|
||||
if ($node !== null) {
|
||||
|
|
@ -942,10 +905,7 @@ class DefaultShareProvider implements IShareProviderWithNotification, IShareProv
|
|||
$groups,
|
||||
IQueryBuilder::PARAM_STR_ARRAY
|
||||
)))
|
||||
->andWhere($qb->expr()->orX(
|
||||
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
|
||||
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
|
||||
));
|
||||
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)));
|
||||
|
||||
$cursor = $qb->executeQuery();
|
||||
while ($data = $cursor->fetch()) {
|
||||
|
|
@ -988,10 +948,7 @@ class DefaultShareProvider implements IShareProviderWithNotification, IShareProv
|
|||
->from('share')
|
||||
->where($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_LINK)))
|
||||
->andWhere($qb->expr()->eq('token', $qb->createNamedParameter($token)))
|
||||
->andWhere($qb->expr()->orX(
|
||||
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
|
||||
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
|
||||
))
|
||||
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)))
|
||||
->executeQuery();
|
||||
|
||||
$data = $cursor->fetch();
|
||||
|
|
@ -1090,7 +1047,7 @@ class DefaultShareProvider implements IShareProviderWithNotification, IShareProv
|
|||
->from('share')
|
||||
->where($qb->expr()->eq('share_with', $qb->createNamedParameter($userId)))
|
||||
->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USERGROUP)))
|
||||
->andWhere($qb->expr()->in('item_type', [$qb->createNamedParameter('file'), $qb->createNamedParameter('folder')]));
|
||||
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)));
|
||||
|
||||
// this is called with either all group shares or one group share.
|
||||
// for all shares it's easier to just only search by share_with,
|
||||
|
|
@ -1147,10 +1104,7 @@ class DefaultShareProvider implements IShareProviderWithNotification, IShareProv
|
|||
*/
|
||||
$qb->where(
|
||||
$qb->expr()->andX(
|
||||
$qb->expr()->orX(
|
||||
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_GROUP)),
|
||||
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USERGROUP))
|
||||
),
|
||||
$qb->expr()->in('share_type', $qb->createNamedParameter([IShare::TYPE_GROUP, IShare::TYPE_USERGROUP], IQueryBuilder::PARAM_INT_ARRAY)),
|
||||
$qb->expr()->eq('uid_owner', $qb->createNamedParameter($uid))
|
||||
)
|
||||
);
|
||||
|
|
@ -1323,26 +1277,19 @@ class DefaultShareProvider implements IShareProviderWithNotification, IShareProv
|
|||
|
||||
$qb = $this->dbConn->getQueryBuilder();
|
||||
|
||||
$or = $qb->expr()->orX(
|
||||
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USER)),
|
||||
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_GROUP)),
|
||||
$qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_LINK))
|
||||
);
|
||||
$shareTypes = [IShare::TYPE_USER, IShare::TYPE_GROUP, IShare::TYPE_LINK];
|
||||
|
||||
if ($currentAccess) {
|
||||
$or->add($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USERGROUP)));
|
||||
$shareTypes[] = IShare::TYPE_USERGROUP;
|
||||
}
|
||||
|
||||
$qb->select('id', 'parent', 'share_type', 'share_with', 'file_source', 'file_target', 'permissions')
|
||||
->from('share')
|
||||
->where(
|
||||
$or
|
||||
$qb->expr()->in('share_type', $qb->createNamedParameter($shareTypes, IQueryBuilder::PARAM_INT_ARRAY))
|
||||
)
|
||||
->andWhere($qb->expr()->in('file_source', $qb->createNamedParameter($ids, IQueryBuilder::PARAM_INT_ARRAY)))
|
||||
->andWhere($qb->expr()->orX(
|
||||
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
|
||||
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
|
||||
));
|
||||
->andWhere($qb->expr()->in('item_type', $qb->createNamedParameter(['file', 'folder'], IQueryBuilder::PARAM_STR_ARRAY)));
|
||||
|
||||
// Ensure accepted is true for user and usergroup type
|
||||
$qb->andWhere(
|
||||
|
|
@ -1659,13 +1606,7 @@ class DefaultShareProvider implements IShareProviderWithNotification, IShareProv
|
|||
|
||||
$qb->select('*')
|
||||
->from('share')
|
||||
->where(
|
||||
$qb->expr()->orX(
|
||||
$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share\IShare::TYPE_USER)),
|
||||
$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share\IShare::TYPE_GROUP)),
|
||||
$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share\IShare::TYPE_LINK))
|
||||
)
|
||||
);
|
||||
->where($qb->expr()->in('share_type', $qb->createNamedParameter([IShare::TYPE_USER, IShare::TYPE_GROUP, IShare::TYPE_LINK], IQueryBuilder::PARAM_INT_ARRAY)));
|
||||
|
||||
$cursor = $qb->executeQuery();
|
||||
while ($data = $cursor->fetch()) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue