diff options
author | Joas Schilling <coding@schilljs.com> | 2023-12-04 13:26:47 +0100 |
---|---|---|
committer | backportbot-nextcloud[bot] <backportbot-nextcloud[bot]@users.noreply.github.com> | 2023-12-04 13:58:40 +0000 |
commit | 4ce175b88f7706b64855f0ef3dc7eeb794bee654 (patch) | |
tree | 53fc74f622a3088ed43f2ce1a21eee9fd25ed1ba /lib | |
parent | a5eaa5631495128cf7ff18649b0803c346801b33 (diff) | |
download | nextcloud-server-4ce175b88f7706b64855f0ef3dc7eeb794bee654.tar.gz nextcloud-server-4ce175b88f7706b64855f0ef3dc7eeb794bee654.zip |
fix(metadata): Allow to load metadata of multiple files at once
Signed-off-by: Joas Schilling <coding@schilljs.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/private/FilesMetadata/FilesMetadataManager.php | 13 | ||||
-rw-r--r-- | lib/private/FilesMetadata/Service/MetadataRequestService.php | 34 | ||||
-rw-r--r-- | lib/public/FilesMetadata/IFilesMetadataManager.php | 14 |
3 files changed, 60 insertions, 1 deletions
diff --git a/lib/private/FilesMetadata/FilesMetadataManager.php b/lib/private/FilesMetadata/FilesMetadataManager.php index 28498af4ab0..c651fead0ce 100644 --- a/lib/private/FilesMetadata/FilesMetadataManager.php +++ b/lib/private/FilesMetadata/FilesMetadataManager.php @@ -148,6 +148,19 @@ class FilesMetadataManager implements IFilesMetadataManager { } /** + * returns metadata of multiple file ids + * + * @param int[] $fileIds file ids + * + * @return array File ID is the array key, files without metadata are not returned in the array + * @psalm-return array<int, IFilesMetadata> + * @since 28.0.0 + */ + public function getMetadataForFiles(array $fileIds): array { + return $this->metadataRequestService->getMetadataFromFileIds($fileIds); + } + + /** * @param IFilesMetadata $filesMetadata metadata * * @inheritDoc diff --git a/lib/private/FilesMetadata/Service/MetadataRequestService.php b/lib/private/FilesMetadata/Service/MetadataRequestService.php index 85874e92d4a..cdce624d75c 100644 --- a/lib/private/FilesMetadata/Service/MetadataRequestService.php +++ b/lib/private/FilesMetadata/Service/MetadataRequestService.php @@ -98,6 +98,40 @@ class MetadataRequestService { } /** + * returns metadata for multiple file ids + * + * If + * + * @param array $fileIds file ids + * + * @return array File ID is the array key, files without metadata are not returned in the array + * @psalm-return array<int, IFilesMetadata> + */ + public function getMetadataFromFileIds(array $fileIds): array { + $qb = $this->dbConnection->getQueryBuilder(); + $qb->select('file_id', 'json', 'sync_token')->from(self::TABLE_METADATA); + $qb->where( + $qb->expr()->in('file_id', $qb->createNamedParameter($fileIds, IQueryBuilder::PARAM_INT_ARRAY)) + ); + + $list = []; + $result = $qb->executeQuery(); + while ($data = $result->fetch()) { + $fileId = (int) $data['file_id']; + $metadata = new FilesMetadata($fileId); + try { + $metadata->importFromDatabase($data); + } catch (FilesMetadataNotFoundException) { + continue; + } + $list[$fileId] = $metadata; + } + $result->closeCursor(); + + return $list; + } + + /** * drop metadata related to a file id * * @param int $fileId file id diff --git a/lib/public/FilesMetadata/IFilesMetadataManager.php b/lib/public/FilesMetadata/IFilesMetadataManager.php index de6fc62ba94..184df2b0418 100644 --- a/lib/public/FilesMetadata/IFilesMetadataManager.php +++ b/lib/public/FilesMetadata/IFilesMetadataManager.php @@ -71,7 +71,7 @@ interface IFilesMetadataManager { ): IFilesMetadata; /** - * returns metadata from a file id + * returns metadata of a file id * * @param int $fileId file id * @param boolean $generate Generate if metadata does not exist @@ -83,6 +83,18 @@ interface IFilesMetadataManager { public function getMetadata(int $fileId, bool $generate = false): IFilesMetadata; /** + * returns metadata of multiple file ids + * + * @param int[] $fileIds file ids + * + * @return array File ID is the array key, files without metadata are not returned in the array + * @psalm-return array<int, IFilesMetadata> + * @throws FilesMetadataNotFoundException if not found + * @since 28.0.0 + */ + public function getMetadataForFiles(array $fileIds): array; + + /** * save metadata to database and refresh indexes. * metadata are saved if new data are available. * on update, a check on syncToken is done to avoid conflict (race condition) |