From: Joas Schilling Date: Mon, 4 Dec 2023 12:26:47 +0000 (+0100) Subject: fix(metadata): Allow to load metadata of multiple files at once X-Git-Tag: v29.0.0beta1~722^2 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=refs%2Fpull%2F42008%2Fhead;p=nextcloud-server.git fix(metadata): Allow to load metadata of multiple files at once Signed-off-by: Joas Schilling --- 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 @@ -147,6 +147,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 + * @since 28.0.0 + */ + public function getMetadataForFiles(array $fileIds): array { + return $this->metadataRequestService->getMetadataFromFileIds($fileIds); + } + /** * @param IFilesMetadata $filesMetadata metadata * 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 @@ -97,6 +97,40 @@ class MetadataRequestService { return $metadata; } + /** + * 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 + */ + 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 * 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 @@ -82,6 +82,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 + * @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.