aboutsummaryrefslogtreecommitdiffstats
path: root/lib/private
diff options
context:
space:
mode:
authorFerdinand Thiessen <opensource@fthiessen.de>2025-01-25 10:43:59 +0100
committerGitHub <noreply@github.com>2025-01-25 10:43:59 +0100
commitf33e9a96ae21b31f8494780520b572aaf2b43bcc (patch)
treeebf21ee0f624e520bbb51db5457f4153026415a5 /lib/private
parentb0d1f2c489f1389601c3d8243aa1ac753e780acd (diff)
parenta635710117bda5602ce51b3aa26f1ae675433608 (diff)
downloadnextcloud-server-f33e9a96ae21b31f8494780520b572aaf2b43bcc.tar.gz
nextcloud-server-f33e9a96ae21b31f8494780520b572aaf2b43bcc.zip
Merge pull request #50273 from nextcloud/artonge/fix/metadata_field_search
fix: Metadata field search
Diffstat (limited to 'lib/private')
-rw-r--r--lib/private/Files/Cache/SearchBuilder.php17
1 files changed, 11 insertions, 6 deletions
diff --git a/lib/private/Files/Cache/SearchBuilder.php b/lib/private/Files/Cache/SearchBuilder.php
index e89b95b756f..6a0cba7f1f2 100644
--- a/lib/private/Files/Cache/SearchBuilder.php
+++ b/lib/private/Files/Cache/SearchBuilder.php
@@ -12,6 +12,7 @@ use OCP\Files\Search\ISearchBinaryOperator;
use OCP\Files\Search\ISearchComparison;
use OCP\Files\Search\ISearchOperator;
use OCP\Files\Search\ISearchOrder;
+use OCP\FilesMetadata\IFilesMetadataManager;
use OCP\FilesMetadata\IMetadataQuery;
/**
@@ -80,13 +81,10 @@ class SearchBuilder {
public const TAG_FAVORITE = '_$!<Favorite>!$_';
- /** @var IMimeTypeLoader */
- private $mimetypeLoader;
-
public function __construct(
- IMimeTypeLoader $mimetypeLoader,
+ private IMimeTypeLoader $mimetypeLoader,
+ private IFilesMetadataManager $filesMetadataManager,
) {
- $this->mimetypeLoader = $mimetypeLoader;
}
/**
@@ -285,11 +283,18 @@ class SearchBuilder {
private function getExtraOperatorField(ISearchComparison $operator, IMetadataQuery $metadataQuery): array {
- $paramType = self::$fieldTypes[$operator->getField()];
$field = $operator->getField();
$value = $operator->getValue();
$type = $operator->getType();
+ $knownMetadata = $this->filesMetadataManager->getKnownMetadata();
+ $isIndex = $knownMetadata->isIndex($field);
+ $paramType = $knownMetadata->getType($field) === 'int' ? 'integer' : 'string';
+
+ if (!$isIndex) {
+ throw new \InvalidArgumentException('Cannot search non indexed metadata key');
+ }
+
switch ($operator->getExtra()) {
case IMetadataQuery::EXTRA:
$metadataQuery->joinIndex($field); // join index table if not joined yet