Skip to content

Commit f33e9a9

Browse files
authored
Merge pull request #50273 from nextcloud/artonge/fix/metadata_field_search
fix: Metadata field search
2 parents b0d1f2c + a635710 commit f33e9a9

File tree

2 files changed

+18
-8
lines changed

2 files changed

+18
-8
lines changed

lib/private/Files/Cache/SearchBuilder.php

+11-6
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use OCP\Files\Search\ISearchComparison;
1313
use OCP\Files\Search\ISearchOperator;
1414
use OCP\Files\Search\ISearchOrder;
15+
use OCP\FilesMetadata\IFilesMetadataManager;
1516
use OCP\FilesMetadata\IMetadataQuery;
1617

1718
/**
@@ -80,13 +81,10 @@ class SearchBuilder {
8081

8182
public const TAG_FAVORITE = '_$!<Favorite>!$_';
8283

83-
/** @var IMimeTypeLoader */
84-
private $mimetypeLoader;
85-
8684
public function __construct(
87-
IMimeTypeLoader $mimetypeLoader,
85+
private IMimeTypeLoader $mimetypeLoader,
86+
private IFilesMetadataManager $filesMetadataManager,
8887
) {
89-
$this->mimetypeLoader = $mimetypeLoader;
9088
}
9189

9290
/**
@@ -285,11 +283,18 @@ private function validateComparison(ISearchComparison $operator) {
285283

286284

287285
private function getExtraOperatorField(ISearchComparison $operator, IMetadataQuery $metadataQuery): array {
288-
$paramType = self::$fieldTypes[$operator->getField()];
289286
$field = $operator->getField();
290287
$value = $operator->getValue();
291288
$type = $operator->getType();
292289

290+
$knownMetadata = $this->filesMetadataManager->getKnownMetadata();
291+
$isIndex = $knownMetadata->isIndex($field);
292+
$paramType = $knownMetadata->getType($field) === 'int' ? 'integer' : 'string';
293+
294+
if (!$isIndex) {
295+
throw new \InvalidArgumentException('Cannot search non indexed metadata key');
296+
}
297+
293298
switch ($operator->getExtra()) {
294299
case IMetadataQuery::EXTRA:
295300
$metadataQuery->joinIndex($field); // join index table if not joined yet

tests/lib/Files/Cache/SearchBuilderTest.php

+7-2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use OCP\Files\Search\ISearchBinaryOperator;
1616
use OCP\Files\Search\ISearchComparison;
1717
use OCP\Files\Search\ISearchOperator;
18+
use OCP\FilesMetadata\IFilesMetadataManager;
1819
use Test\TestCase;
1920

2021
/**
@@ -24,9 +25,12 @@ class SearchBuilderTest extends TestCase {
2425
/** @var IQueryBuilder */
2526
private $builder;
2627

27-
/** @var IMimeTypeLoader|\PHPUnit\Framework\MockObject\MockObject */
28+
/** @var IMimeTypeLoader&\PHPUnit\Framework\MockObject\MockObject */
2829
private $mimetypeLoader;
2930

31+
/** @var IFilesMetadataManager&\PHPUnit\Framework\MockObject\MockObject */
32+
private $filesMetadataManager;
33+
3034
/** @var SearchBuilder */
3135
private $searchBuilder;
3236

@@ -37,6 +41,7 @@ protected function setUp(): void {
3741
parent::setUp();
3842
$this->builder = \OC::$server->getDatabaseConnection()->getQueryBuilder();
3943
$this->mimetypeLoader = $this->createMock(IMimeTypeLoader::class);
44+
$this->filesMetadataManager = $this->createMock(IFilesMetadataManager::class);
4045

4146
$this->mimetypeLoader->expects($this->any())
4247
->method('getId')
@@ -60,7 +65,7 @@ protected function setUp(): void {
6065
[6, 'image']
6166
]);
6267

63-
$this->searchBuilder = new SearchBuilder($this->mimetypeLoader);
68+
$this->searchBuilder = new SearchBuilder($this->mimetypeLoader, $this->filesMetadataManager);
6469
$this->numericStorageId = 10000;
6570

6671
$this->builder->select(['fileid'])

0 commit comments

Comments
 (0)