]> source.dussan.org Git - nextcloud-server.git/commitdiff
fix(metadata): Allow to load metadata of multiple files at once 42008/head
authorJoas Schilling <coding@schilljs.com>
Mon, 4 Dec 2023 12:26:47 +0000 (13:26 +0100)
committerJoas Schilling <coding@schilljs.com>
Mon, 4 Dec 2023 12:34:10 +0000 (13:34 +0100)
Signed-off-by: Joas Schilling <coding@schilljs.com>
lib/private/FilesMetadata/FilesMetadataManager.php
lib/private/FilesMetadata/Service/MetadataRequestService.php
lib/public/FilesMetadata/IFilesMetadataManager.php

index 28498af4ab014e0e531f72d6bd143deb86aa0683..c651fead0cea57f3736e8320e6fc3728e0161a69 100644 (file)
@@ -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<int, IFilesMetadata>
+        * @since 28.0.0
+        */
+       public function getMetadataForFiles(array $fileIds): array {
+               return $this->metadataRequestService->getMetadataFromFileIds($fileIds);
+       }
+
        /**
         * @param IFilesMetadata $filesMetadata metadata
         *
index 85874e92d4aa732876e2fa51c2caf042e9d283ec..cdce624d75c49a5317ab5cff8d495e8eb302d7c9 100644 (file)
@@ -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<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
         *
index de6fc62ba944f5e7e234356d49d5d4803e21a52b..184df2b041837bada3a719ef524aaa90bfd21463 100644 (file)
@@ -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<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.