aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorMaxence Lange <maxence@artificial-owl.com>2023-11-07 12:43:01 -0100
committerMaxence Lange <maxence@artificial-owl.com>2023-11-07 12:43:08 -0100
commitf497d8b6e5a42635ec181dfeda404862ee4c8e3d (patch)
treee6cd926b6f7ab4d9762f0312ad8962c78aaf1309 /lib
parente62e9e3dbf1a2573554b1a9eabbf5b59b652dae6 (diff)
downloadnextcloud-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.php2
-rw-r--r--lib/private/Files/Node/Folder.php2
-rw-r--r--lib/private/Files/Search/QueryOptimizer/PathPrefixOptimizer.php4
-rw-r--r--lib/private/Files/Search/SearchComparison.php16
-rw-r--r--lib/private/Files/Search/SearchOrder.php8
-rw-r--r--lib/private/FilesMetadata/FilesMetadataManager.php9
-rw-r--r--lib/private/FilesMetadata/Job/UpdateSingleMetadata.php5
-rw-r--r--lib/private/FilesMetadata/Listener/MetadataDelete.php3
-rw-r--r--lib/private/FilesMetadata/Listener/MetadataUpdate.php3
-rw-r--r--lib/public/Files/Search/ISearchComparison.php15
-rw-r--r--lib/public/Files/Search/ISearchOrder.php9
-rw-r--r--lib/public/FilesMetadata/IFilesMetadataManager.php10
-rw-r--r--lib/public/FilesMetadata/Model/IMetadataQuery.php1
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';
/**