Skip to content

Commit 1ecf3b3

Browse files
authored
Merge pull request #44004 from nextcloud/share-resolve-group-perf
2 parents 8d845c4 + 0e74972 commit 1ecf3b3

File tree

1 file changed

+28
-50
lines changed

1 file changed

+28
-50
lines changed

lib/private/Share20/DefaultShareProvider.php

Lines changed: 28 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -829,7 +829,7 @@ public function getShareById($id, $recipientId = null) {
829829

830830
// If the recipient is set for a group share resolve to that user
831831
if ($recipientId !== null && $share->getShareType() === IShare::TYPE_GROUP) {
832-
$share = $this->resolveGroupShares([$share], $recipientId)[0];
832+
$share = $this->resolveGroupShares([(int) $share->getId() => $share], $recipientId)[0];
833833
}
834834

835835
return $share;
@@ -1006,7 +1006,8 @@ public function getSharedWith($userId, $shareType, $node, $limit, $offset) {
10061006
}
10071007

10081008
if ($this->isAccessibleResult($data)) {
1009-
$shares2[] = $this->createShare($data);
1009+
$share = $this->createShare($data);
1010+
$shares2[$share->getId()] = $share;
10101011
}
10111012
}
10121013
$cursor->closeCursor();
@@ -1127,61 +1128,38 @@ private function createShare($data) {
11271128
}
11281129

11291130
/**
1130-
* @param Share[] $shares
1131+
* Update the data from group shares with any per-user modifications
1132+
*
1133+
* @param array<int, Share> $shareMap shares indexed by share id
11311134
* @param $userId
11321135
* @return Share[] The updates shares if no update is found for a share return the original
11331136
*/
1134-
private function resolveGroupShares($shares, $userId) {
1135-
$result = [];
1136-
1137-
$start = 0;
1138-
while (true) {
1139-
/** @var Share[] $shareSlice */
1140-
$shareSlice = array_slice($shares, $start, 100);
1141-
$start += 100;
1142-
1143-
if ($shareSlice === []) {
1144-
break;
1145-
}
1146-
1147-
/** @var int[] $ids */
1148-
$ids = [];
1149-
/** @var Share[] $shareMap */
1150-
$shareMap = [];
1151-
1152-
foreach ($shareSlice as $share) {
1153-
$ids[] = (int)$share->getId();
1154-
$shareMap[$share->getId()] = $share;
1155-
}
1156-
1157-
$qb = $this->dbConn->getQueryBuilder();
1158-
1159-
$query = $qb->select('*')
1160-
->from('share')
1161-
->where($qb->expr()->in('parent', $qb->createNamedParameter($ids, IQueryBuilder::PARAM_INT_ARRAY)))
1162-
->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($userId)))
1163-
->andWhere($qb->expr()->orX(
1164-
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
1165-
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
1166-
));
1167-
1168-
$stmt = $query->execute();
1169-
1170-
while ($data = $stmt->fetch()) {
1171-
$shareMap[$data['parent']]->setPermissions((int)$data['permissions']);
1172-
$shareMap[$data['parent']]->setStatus((int)$data['accepted']);
1173-
$shareMap[$data['parent']]->setTarget($data['file_target']);
1174-
$shareMap[$data['parent']]->setParent($data['parent']);
1175-
}
1137+
private function resolveGroupShares($shareMap, $userId) {
1138+
$qb = $this->dbConn->getQueryBuilder();
1139+
$query = $qb->select('*')
1140+
->from('share')
1141+
->where($qb->expr()->eq('share_with', $qb->createNamedParameter($userId)))
1142+
->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USERGROUP)))
1143+
->andWhere($qb->expr()->in('item_type', [$qb->createNamedParameter('file'), $qb->createNamedParameter('folder')]));
1144+
1145+
// this is called with either all group shares or one group share.
1146+
// for all shares it's easier to just only search by share_with,
1147+
// for a single share it's efficient to filter by parent
1148+
if (count($shareMap) === 1) {
1149+
$share = reset($shareMap);
1150+
$query->andWhere($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())));
1151+
}
11761152

1177-
$stmt->closeCursor();
1153+
$stmt = $query->execute();
11781154

1179-
foreach ($shareMap as $share) {
1180-
$result[] = $share;
1181-
}
1155+
while ($data = $stmt->fetch()) {
1156+
$shareMap[$data['parent']]->setPermissions((int)$data['permissions']);
1157+
$shareMap[$data['parent']]->setStatus((int)$data['accepted']);
1158+
$shareMap[$data['parent']]->setTarget($data['file_target']);
1159+
$shareMap[$data['parent']]->setParent($data['parent']);
11821160
}
11831161

1184-
return $result;
1162+
return array_values($shareMap);
11851163
}
11861164

11871165
/**

0 commit comments

Comments
 (0)