aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLouis Chemineau <louis@chmn.me>2025-01-20 13:45:33 +0100
committerbackportbot[bot] <backportbot[bot]@users.noreply.github.com>2025-01-25 09:44:50 +0000
commit5b2af8b4c0516d008acc6b728c456406e0b0c171 (patch)
tree88e5be3effa6ab3d6251aa5fdd4df4450b3440f2
parentbb2980e7382c69d962ff46f28554737dd4e61254 (diff)
downloadnextcloud-server-5b2af8b4c0516d008acc6b728c456406e0b0c171.tar.gz
nextcloud-server-5b2af8b4c0516d008acc6b728c456406e0b0c171.zip
fix: Metadata field searchbackport/50273/stable31
Signed-off-by: Louis Chemineau <louis@chmn.me>
-rw-r--r--lib/private/Files/Cache/SearchBuilder.php17
-rw-r--r--tests/lib/Files/Cache/SearchBuilderTest.php9
2 files changed, 18 insertions, 8 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
diff --git a/tests/lib/Files/Cache/SearchBuilderTest.php b/tests/lib/Files/Cache/SearchBuilderTest.php
index acb2e109144..17285d44209 100644
--- a/tests/lib/Files/Cache/SearchBuilderTest.php
+++ b/tests/lib/Files/Cache/SearchBuilderTest.php
@@ -15,6 +15,7 @@ use OCP\Files\IMimeTypeLoader;
use OCP\Files\Search\ISearchBinaryOperator;
use OCP\Files\Search\ISearchComparison;
use OCP\Files\Search\ISearchOperator;
+use OCP\FilesMetadata\IFilesMetadataManager;
use Test\TestCase;
/**
@@ -24,9 +25,12 @@ class SearchBuilderTest extends TestCase {
/** @var IQueryBuilder */
private $builder;
- /** @var IMimeTypeLoader|\PHPUnit\Framework\MockObject\MockObject */
+ /** @var IMimeTypeLoader&\PHPUnit\Framework\MockObject\MockObject */
private $mimetypeLoader;
+ /** @var IFilesMetadataManager&\PHPUnit\Framework\MockObject\MockObject */
+ private $filesMetadataManager;
+
/** @var SearchBuilder */
private $searchBuilder;
@@ -37,6 +41,7 @@ class SearchBuilderTest extends TestCase {
parent::setUp();
$this->builder = \OC::$server->getDatabaseConnection()->getQueryBuilder();
$this->mimetypeLoader = $this->createMock(IMimeTypeLoader::class);
+ $this->filesMetadataManager = $this->createMock(IFilesMetadataManager::class);
$this->mimetypeLoader->expects($this->any())
->method('getId')
@@ -60,7 +65,7 @@ class SearchBuilderTest extends TestCase {
[6, 'image']
]);
- $this->searchBuilder = new SearchBuilder($this->mimetypeLoader);
+ $this->searchBuilder = new SearchBuilder($this->mimetypeLoader, $this->filesMetadataManager);
$this->numericStorageId = 10000;
$this->builder->select(['fileid'])