diff options
author | Maxence Lange <maxence@artificial-owl.com> | 2023-11-07 12:43:01 -0100 |
---|---|---|
committer | Maxence Lange <maxence@artificial-owl.com> | 2023-11-07 12:43:08 -0100 |
commit | f497d8b6e5a42635ec181dfeda404862ee4c8e3d (patch) | |
tree | e6cd926b6f7ab4d9762f0312ad8962c78aaf1309 /lib | |
parent | e62e9e3dbf1a2573554b1a9eabbf5b59b652dae6 (diff) | |
download | nextcloud-server-f497d8b6e5a42635ec181dfeda404862ee4c8e3d.tar.gz nextcloud-server-f497d8b6e5a42635ec181dfeda404862ee4c8e3d.zip |
IFilesMetadata
Signed-off-by: Maxence Lange <maxence@artificial-owl.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/private/Files/Cache/SearchBuilder.php | 2 | ||||
-rw-r--r-- | lib/private/Files/Node/Folder.php | 2 | ||||
-rw-r--r-- | lib/private/Files/Search/QueryOptimizer/PathPrefixOptimizer.php | 4 | ||||
-rw-r--r-- | lib/private/Files/Search/SearchComparison.php | 16 | ||||
-rw-r--r-- | lib/private/Files/Search/SearchOrder.php | 8 | ||||
-rw-r--r-- | lib/private/FilesMetadata/FilesMetadataManager.php | 9 | ||||
-rw-r--r-- | lib/private/FilesMetadata/Job/UpdateSingleMetadata.php | 5 | ||||
-rw-r--r-- | lib/private/FilesMetadata/Listener/MetadataDelete.php | 3 | ||||
-rw-r--r-- | lib/private/FilesMetadata/Listener/MetadataUpdate.php | 3 | ||||
-rw-r--r-- | lib/public/Files/Search/ISearchComparison.php | 15 | ||||
-rw-r--r-- | lib/public/Files/Search/ISearchOrder.php | 9 | ||||
-rw-r--r-- | lib/public/FilesMetadata/IFilesMetadataManager.php | 10 | ||||
-rw-r--r-- | lib/public/FilesMetadata/Model/IMetadataQuery.php | 1 |
13 files changed, 41 insertions, 46 deletions
diff --git a/lib/private/Files/Cache/SearchBuilder.php b/lib/private/Files/Cache/SearchBuilder.php index ba4aabf2b4f..1f9a6af931b 100644 --- a/lib/private/Files/Cache/SearchBuilder.php +++ b/lib/private/Files/Cache/SearchBuilder.php @@ -78,7 +78,7 @@ class SearchBuilder { return array_reduce($operator->getArguments(), function (array $fields, ISearchOperator $operator) { return array_unique(array_merge($fields, $this->extractRequestedFields($operator))); }, []); - } elseif ($operator instanceof ISearchComparison && !$operator->isExtra()) { + } elseif ($operator instanceof ISearchComparison && !$operator->getExtra()) { return [$operator->getField()]; } return []; diff --git a/lib/private/Files/Node/Folder.php b/lib/private/Files/Node/Folder.php index eba7ce1d77e..c7462572fed 100644 --- a/lib/private/Files/Node/Folder.php +++ b/lib/private/Files/Node/Folder.php @@ -252,8 +252,6 @@ class Folder extends Node implements \OCP\Files\Folder { if ($order) { usort($files, function (FileInfo $a, FileInfo $b) use ($order) { foreach ($order as $orderField) { - // needed !? - // if ($orderField->isExtra()) { continue; } $cmp = $orderField->sortFileInfo($a, $b); if ($cmp !== 0) { return $cmp; diff --git a/lib/private/Files/Search/QueryOptimizer/PathPrefixOptimizer.php b/lib/private/Files/Search/QueryOptimizer/PathPrefixOptimizer.php index cf9e6ad5b91..664402f1238 100644 --- a/lib/private/Files/Search/QueryOptimizer/PathPrefixOptimizer.php +++ b/lib/private/Files/Search/QueryOptimizer/PathPrefixOptimizer.php @@ -51,7 +51,7 @@ class PathPrefixOptimizer extends QueryOptimizerStep { } public function processOperator(ISearchOperator &$operator) { - if (!$this->useHashEq && $operator instanceof ISearchComparison && !$operator->isExtra() && $operator->getField() === 'path' && $operator->getType() === ISearchComparison::COMPARE_EQUAL) { + if (!$this->useHashEq && $operator instanceof ISearchComparison && !$operator->getExtra() && $operator->getField() === 'path' && $operator->getType() === ISearchComparison::COMPARE_EQUAL) { $operator->setQueryHint(ISearchComparison::HINT_PATH_EQ_HASH, false); } @@ -72,7 +72,7 @@ class PathPrefixOptimizer extends QueryOptimizerStep { private function operatorPairIsPathPrefix(ISearchOperator $like, ISearchOperator $equal): bool { return ( $like instanceof ISearchComparison && $equal instanceof ISearchComparison && - !$like->isExtra() && !$equal->isExtra() && $like->getField() === 'path' && $equal->getField() === 'path' && + !$like->getExtra() && !$equal->getExtra() && $like->getField() === 'path' && $equal->getField() === 'path' && $like->getType() === ISearchComparison::COMPARE_LIKE_CASE_SENSITIVE && $equal->getType() === ISearchComparison::COMPARE_EQUAL && $like->getValue() === SearchComparison::escapeLikeParameter($equal->getValue()) . '/%' ); diff --git a/lib/private/Files/Search/SearchComparison.php b/lib/private/Files/Search/SearchComparison.php index 5caa632f618..4f9ac266397 100644 --- a/lib/private/Files/Search/SearchComparison.php +++ b/lib/private/Files/Search/SearchComparison.php @@ -1,4 +1,6 @@ <?php + +declare(strict_types=1); /** * @copyright Copyright (c) 2017 Robin Appelman <robin@icewind.nl> * @@ -39,32 +41,32 @@ class SearchComparison implements ISearchComparison { /** * @return string */ - public function getType() { + public function getType(): string { return $this->type; } /** * @return string */ - public function getField() { + public function getField(): string { return $this->field; } /** * @return \DateTime|int|string */ - public function getValue() { + public function getValue(): string|int|\DateTime { return $this->value; } + /** + * @return string + * @since 28.0.0 + */ public function getExtra(): string { return $this->extra; } - public function isExtra(): bool { - return ($this->extra !== ''); - } - public function getQueryHint(string $name, $default) { return $this->hints[$name] ?? $default; } diff --git a/lib/private/Files/Search/SearchOrder.php b/lib/private/Files/Search/SearchOrder.php index ca974ca9c03..de514262bf5 100644 --- a/lib/private/Files/Search/SearchOrder.php +++ b/lib/private/Files/Search/SearchOrder.php @@ -48,14 +48,14 @@ class SearchOrder implements ISearchOrder { return $this->field; } + /** + * @return string + * @since 28.0.0 + */ public function getExtra(): string { return $this->extra; } - public function isExtra(): bool { - return ($this->extra !== ''); - } - public function sortFileInfo(FileInfo $a, FileInfo $b): int { $cmp = $this->sortFileInfoNoDirection($a, $b); return $cmp * ($this->direction === ISearchOrder::DIRECTION_ASCENDING ? 1 : -1); diff --git a/lib/private/FilesMetadata/FilesMetadataManager.php b/lib/private/FilesMetadata/FilesMetadataManager.php index 7e941234ce3..54310f934d7 100644 --- a/lib/private/FilesMetadata/FilesMetadataManager.php +++ b/lib/private/FilesMetadata/FilesMetadataManager.php @@ -242,6 +242,7 @@ class FilesMetadataManager implements IFilesMetadataManager { /** * @param string $key metadata key * @param string $type metadata type + * @param bool $indexed TRUE if metadata can be search * * @inheritDoc * @since 28.0.0 @@ -253,17 +254,17 @@ class FilesMetadataManager implements IFilesMetadataManager { * @see IMetadataValueWrapper::TYPE_INT_LIST * @see IMetadataValueWrapper::TYPE_STRING */ - public function initMetadataIndex(string $key, string $type): void { + public function initMetadata(string $key, string $type, bool $indexed): void { $current = $this->getKnownMetadata(); try { - if ($current->getType($key) === $type && $current->isIndex($key)) { - return; // if key exists, with same type and is already indexed, we do nothing. + if ($current->getType($key) === $type && $indexed === $current->isIndex($key)) { + return; // if key exists, with same type and indexed, we do nothing. } } catch (FilesMetadataNotFoundException) { // if value does not exist, we keep on the writing of course } - $current->import([$key => ['type' => $type, 'indexed' => true]]); + $current->import([$key => ['type' => $type, 'indexed' => $indexed]]); $this->config->setAppValue('core', self::CONFIG_KEY, json_encode($current)); } diff --git a/lib/private/FilesMetadata/Job/UpdateSingleMetadata.php b/lib/private/FilesMetadata/Job/UpdateSingleMetadata.php index d628e468cdd..ff7dfcb8368 100644 --- a/lib/private/FilesMetadata/Job/UpdateSingleMetadata.php +++ b/lib/private/FilesMetadata/Job/UpdateSingleMetadata.php @@ -33,6 +33,7 @@ use OCP\Files\IRootFolder; use OCP\Files\NotPermittedException; use OCP\FilesMetadata\Event\MetadataLiveEvent; use OCP\FilesMetadata\IFilesMetadataManager; +use Psr\Log\LoggerInterface; /** * Simple background job, created when requested by an app during the @@ -47,6 +48,7 @@ class UpdateSingleMetadata extends QueuedJob { ITimeFactory $time, private IRootFolder $rootFolder, private FilesMetadataManager $filesMetadataManager, + private LoggerInterface $logger ) { parent::__construct($time); } @@ -60,7 +62,8 @@ class UpdateSingleMetadata extends QueuedJob { $file = array_shift($node); $this->filesMetadataManager->refreshMetadata($file, IFilesMetadataManager::PROCESS_BACKGROUND); } - } catch (NotPermittedException|NoUserException $e) { + } catch (\Exception $e) { + $this->logger->warning('issue while running UpdateSingleMetadata', ['exception' => $e, 'userId' => $userId, 'fileId' => $fileId]); } } } diff --git a/lib/private/FilesMetadata/Listener/MetadataDelete.php b/lib/private/FilesMetadata/Listener/MetadataDelete.php index 7f8fd035735..25c944475a9 100644 --- a/lib/private/FilesMetadata/Listener/MetadataDelete.php +++ b/lib/private/FilesMetadata/Listener/MetadataDelete.php @@ -30,6 +30,7 @@ use OCP\EventDispatcher\Event; use OCP\EventDispatcher\IEventListener; use OCP\Files\Events\Node\NodeDeletedEvent; use OCP\FilesMetadata\IFilesMetadataManager; +use Psr\Log\LoggerInterface; /** * Handle file deletion event and remove stored metadata related to the deleted file @@ -39,6 +40,7 @@ use OCP\FilesMetadata\IFilesMetadataManager; class MetadataDelete implements IEventListener { public function __construct( private IFilesMetadataManager $filesMetadataManager, + private LoggerInterface $logger ) { } @@ -56,6 +58,7 @@ class MetadataDelete implements IEventListener { $this->filesMetadataManager->deleteMetadata($nodeId); } } catch (Exception $e) { + $this->logger->warning('issue while running MetadataDelete', ['exception' => $e]); } } } diff --git a/lib/private/FilesMetadata/Listener/MetadataUpdate.php b/lib/private/FilesMetadata/Listener/MetadataUpdate.php index 64c8bb474b1..395a852e9e3 100644 --- a/lib/private/FilesMetadata/Listener/MetadataUpdate.php +++ b/lib/private/FilesMetadata/Listener/MetadataUpdate.php @@ -31,6 +31,7 @@ use OCP\EventDispatcher\IEventListener; use OCP\Files\Events\Node\NodeCreatedEvent; use OCP\Files\Events\Node\NodeWrittenEvent; use OCP\FilesMetadata\IFilesMetadataManager; +use Psr\Log\LoggerInterface; /** * Handle file creation/modification events and initiate a new event related to the created/edited file. @@ -42,6 +43,7 @@ use OCP\FilesMetadata\IFilesMetadataManager; class MetadataUpdate implements IEventListener { public function __construct( private IFilesMetadataManager $filesMetadataManager, + private LoggerInterface $logger ) { } @@ -56,6 +58,7 @@ class MetadataUpdate implements IEventListener { try { $this->filesMetadataManager->refreshMetadata($event->getNode()); } catch (Exception $e) { + $this->logger->warning('issue while running MetadataUpdate', ['exception' => $e]); } } } diff --git a/lib/public/Files/Search/ISearchComparison.php b/lib/public/Files/Search/ISearchComparison.php index 068a7e4c699..68924d1e369 100644 --- a/lib/public/Files/Search/ISearchComparison.php +++ b/lib/public/Files/Search/ISearchComparison.php @@ -44,7 +44,7 @@ interface ISearchComparison extends ISearchOperator { * @return string * @since 12.0.0 */ - public function getType(); + public function getType(): string; /** * Get the name of the field to compare with @@ -54,8 +54,7 @@ interface ISearchComparison extends ISearchOperator { * @return string * @since 12.0.0 */ - public function getField(); - + public function getField(): string; /** * extra means data are not related to the main files table @@ -66,18 +65,10 @@ interface ISearchComparison extends ISearchOperator { public function getExtra(): string; /** - * returns if data are 'extra' or not - * - * @return bool - * @since 28.0.0 - */ - public function isExtra(): bool; - - /** * Get the value to compare the field with * * @return string|integer|\DateTime * @since 12.0.0 */ - public function getValue(); + public function getValue(): string|int|\DateTime; } diff --git a/lib/public/Files/Search/ISearchOrder.php b/lib/public/Files/Search/ISearchOrder.php index bcb927e73db..5b73e7b102c 100644 --- a/lib/public/Files/Search/ISearchOrder.php +++ b/lib/public/Files/Search/ISearchOrder.php @@ -58,15 +58,6 @@ interface ISearchOrder { public function getExtra(): string; /** - * returns if data are 'extra' or not - * - * @return bool - * @since 28.0.0 - */ - public function isExtra(): bool; - - - /** * Apply the sorting on 2 FileInfo objects * * @param FileInfo $a diff --git a/lib/public/FilesMetadata/IFilesMetadataManager.php b/lib/public/FilesMetadata/IFilesMetadataManager.php index 7ba8cac795a..1cd0fcb4125 100644 --- a/lib/public/FilesMetadata/IFilesMetadataManager.php +++ b/lib/public/FilesMetadata/IFilesMetadataManager.php @@ -38,10 +38,9 @@ use OCP\FilesMetadata\Model\IMetadataQuery; * @since 28.0.0 */ interface IFilesMetadataManager { - /** - * @since 28.0.0 - */ + /** @since 28.0.0 */ public const PROCESS_LIVE = 1; + /** @since 28.0.0 */ public const PROCESS_BACKGROUND = 2; /** @@ -128,10 +127,13 @@ interface IFilesMetadataManager { /** * initiate a metadata key with its type. * The call is mandatory before using the metadata property in a webdav request. + * It is not needed to only use this method when the app is enabled: the method can be + * called each time during the app loading as the metadata will only be initiated if not known * * @param string $key metadata key * @param string $type metadata type + * @param bool $indexed TRUE if metadata can be search * @since 28.0.0 */ - public function initMetadataIndex(string $key, string $type): void; + public function initMetadata(string $key, string $type, bool $indexed): void; } diff --git a/lib/public/FilesMetadata/Model/IMetadataQuery.php b/lib/public/FilesMetadata/Model/IMetadataQuery.php index 3e68b47f822..d3f55ce6cce 100644 --- a/lib/public/FilesMetadata/Model/IMetadataQuery.php +++ b/lib/public/FilesMetadata/Model/IMetadataQuery.php @@ -31,6 +31,7 @@ namespace OCP\FilesMetadata\Model; * @since 28.0.0 */ interface IMetadataQuery { + /** @since 28.0.0 */ public const EXTRA = 'metadata'; /** |