summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoas Schilling <coding@schilljs.com>2024-02-07 12:51:38 +0100
committerJoas Schilling <coding@schilljs.com>2024-04-10 11:49:23 +0200
commit1256d8bb934b7c9921612f85245a8b3296ca629b (patch)
treee1450faca8ff7315371bbea270a13e6ca7d67845
parentf425841fbec7ee31454509983fc9f115b39b410a (diff)
perf(sharing): Move item_type validation to PHPperf/noid/move-item_type-validation-to-php
We do not support anything but file and folder and are not aware of an app doing that, so the assumption is that it can help to move to an index covering share_type + share_with, instead of share_type + item_type and afterwards a second time on share_with Signed-off-by: Joas Schilling <coding@schilljs.com>
-rw-r--r--lib/Share/RoomShareProvider.php47
1 files changed, 25 insertions, 22 deletions
diff --git a/lib/Share/RoomShareProvider.php b/lib/Share/RoomShareProvider.php
index bddd57b41..3b37cea21 100644
--- a/lib/Share/RoomShareProvider.php
+++ b/lib/Share/RoomShareProvider.php
@@ -527,10 +527,6 @@ class RoomShareProvider implements IShareProvider {
'f.encrypted', 'f.unencrypted_size', 'f.etag', 'f.checksum'
)
->from('share', 's')
- ->andWhere($qb->expr()->orX(
- $qb->expr()->eq('s.item_type', $qb->createNamedParameter('file')),
- $qb->expr()->eq('s.item_type', $qb->createNamedParameter('folder'))
- ))
->andWhere(
$qb->expr()->eq('s.share_type', $qb->createNamedParameter(IShare::TYPE_ROOM))
);
@@ -562,6 +558,9 @@ class RoomShareProvider implements IShareProvider {
$cursor = $qb->executeQuery();
$shares = [];
while ($data = $cursor->fetch()) {
+ if ($data['item_type'] !== 'file' && $data['item_type'] !== 'folder') {
+ continue;
+ }
$shares[$data['fileid']][] = $this->createShareObject($data);
}
$cursor->closeCursor();
@@ -723,16 +722,16 @@ class RoomShareProvider implements IShareProvider {
->from('share')
->where($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERROOM)))
- ->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()->eq('share_with', $qb->createNamedParameter($userId)));
if ($allRoomShares) {
$stmt = $query->executeQuery();
while ($data = $stmt->fetch()) {
+ if ($data['item_type'] !== 'file' && $data['item_type'] !== 'folder') {
+ continue;
+ }
+
if (isset($shareMap[$data['parent']])) {
$shareMap[$data['parent']]->setPermissions((int)$data['permissions']);
$shareMap[$data['parent']]->setTarget($data['file_target']);
@@ -749,6 +748,10 @@ class RoomShareProvider implements IShareProvider {
$stmt = $query->executeQuery();
while ($data = $stmt->fetch()) {
+ if ($data['item_type'] !== 'file' && $data['item_type'] !== 'folder') {
+ continue;
+ }
+
$shareMap[$data['parent']]->setPermissions((int)$data['permissions']);
$shareMap[$data['parent']]->setTarget($data['file_target']);
}
@@ -817,12 +820,12 @@ class RoomShareProvider implements IShareProvider {
)
->selectAlias('st.id', 'storage_string_id')
->from('share', 's')
- ->orderBy('s.id', 'ASC')
->leftJoin('s', 'filecache', 'f', $qb->expr()->eq('s.file_source', 'f.fileid'))
->leftJoin('f', 'storages', 'st', $qb->expr()->eq('f.storage', 'st.numeric_id'));
if ($limit !== -1) {
- $qb->setMaxResults($limit);
+ $qb->orderBy('s.id', 'ASC')
+ ->setMaxResults($limit);
}
// Filter by node if provided
@@ -834,11 +837,7 @@ class RoomShareProvider implements IShareProvider {
->andWhere($qb->expr()->in('s.share_with', $qb->createNamedParameter(
$rooms,
IQueryBuilder::PARAM_STR_ARRAY
- )))
- ->andWhere($qb->expr()->orX(
- $qb->expr()->eq('s.item_type', $qb->createNamedParameter('file')),
- $qb->expr()->eq('s.item_type', $qb->createNamedParameter('folder'))
- ));
+ )));
$cursor = $qb->executeQuery();
while ($data = $cursor->fetch()) {
@@ -863,6 +862,10 @@ class RoomShareProvider implements IShareProvider {
}
private function isAccessibleResult(array $data): bool {
+ if ($data['item_type'] !== 'file' && $data['item_type'] !== 'folder') {
+ return false;
+ }
+
// exclude shares leading to deleted file entries
if ($data['fileid'] === null || $data['path'] === null) {
return false;
@@ -971,18 +974,18 @@ class RoomShareProvider implements IShareProvider {
$types[] = self::SHARE_TYPE_USERROOM;
}
- $qb->select('id', 'parent', 'share_type', 'share_with', 'file_source', 'file_target', 'permissions')
+ $qb->select('id', 'parent', 'share_type', 'share_with', 'file_source', 'file_target', 'permissions', 'item_type')
->from('share')
->where($qb->expr()->in('share_type', $qb->createNamedParameter($types, 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('file_source', $qb->createNamedParameter($ids, IQueryBuilder::PARAM_INT_ARRAY)));
$cursor = $qb->executeQuery();
$users = [];
while ($row = $cursor->fetch()) {
+ if ($row['item_type'] !== 'file' && $row['item_type'] !== 'folder') {
+ continue;
+ }
+
$type = (int)$row['share_type'];
if ($type === IShare::TYPE_ROOM) {
$roomToken = $row['share_with'];