Skip to content

Commit 840ee6d

Browse files
committed
fix: Metadata field search
Signed-off-by: Louis Chemineau <louis@chmn.me>
1 parent 5c8f529 commit 840ee6d

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
@@ -33,6 +33,7 @@
3333
use OCP\Files\Search\ISearchComparison;
3434
use OCP\Files\Search\ISearchOperator;
3535
use OCP\Files\Search\ISearchOrder;
36+
use OCP\FilesMetadata\IFilesMetadataManager;
3637
use OCP\FilesMetadata\IMetadataQuery;
3738

3839
/**
@@ -101,13 +102,10 @@ class SearchBuilder {
101102

102103
public const TAG_FAVORITE = '_$!<Favorite>!$_';
103104

104-
/** @var IMimeTypeLoader */
105-
private $mimetypeLoader;
106-
107105
public function __construct(
108-
IMimeTypeLoader $mimetypeLoader
106+
private IMimeTypeLoader $mimetypeLoader,
107+
private IFilesMetadataManager $filesMetadataManager,
109108
) {
110-
$this->mimetypeLoader = $mimetypeLoader;
111109
}
112110

113111
/**
@@ -306,11 +304,18 @@ private function validateComparison(ISearchComparison $operator) {
306304

307305

308306
private function getExtraOperatorField(ISearchComparison $operator, IMetadataQuery $metadataQuery): array {
309-
$paramType = self::$fieldTypes[$operator->getField()];
310307
$field = $operator->getField();
311308
$value = $operator->getValue();
312309
$type = $operator->getType();
313310

311+
$knownMetadata = $this->filesMetadataManager->getKnownMetadata();
312+
$isIndex = $knownMetadata->isIndex($field);
313+
$paramType = $knownMetadata->getType($field) === 'int' ? 'integer' : 'string';
314+
315+
if (!$isIndex) {
316+
throw new \InvalidArgumentException('Cannot search non indexed metadata key');
317+
}
318+
314319
switch($operator->getExtra()) {
315320
case IMetadataQuery::EXTRA:
316321
$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
@@ -30,6 +30,7 @@
3030
use OCP\Files\Search\ISearchBinaryOperator;
3131
use OCP\Files\Search\ISearchComparison;
3232
use OCP\Files\Search\ISearchOperator;
33+
use OCP\FilesMetadata\IFilesMetadataManager;
3334
use Test\TestCase;
3435

3536
/**
@@ -39,9 +40,12 @@ class SearchBuilderTest extends TestCase {
3940
/** @var IQueryBuilder */
4041
private $builder;
4142

42-
/** @var IMimeTypeLoader|\PHPUnit\Framework\MockObject\MockObject */
43+
/** @var IMimeTypeLoader&\PHPUnit\Framework\MockObject\MockObject */
4344
private $mimetypeLoader;
4445

46+
/** @var IFilesMetadataManager&\PHPUnit\Framework\MockObject\MockObject */
47+
private $filesMetadataManager;
48+
4549
/** @var SearchBuilder */
4650
private $searchBuilder;
4751

@@ -52,6 +56,7 @@ protected function setUp(): void {
5256
parent::setUp();
5357
$this->builder = \OC::$server->getDatabaseConnection()->getQueryBuilder();
5458
$this->mimetypeLoader = $this->createMock(IMimeTypeLoader::class);
59+
$this->filesMetadataManager = $this->createMock(IFilesMetadataManager::class);
5560

5661
$this->mimetypeLoader->expects($this->any())
5762
->method('getId')
@@ -75,7 +80,7 @@ protected function setUp(): void {
7580
[6, 'image']
7681
]);
7782

78-
$this->searchBuilder = new SearchBuilder($this->mimetypeLoader);
83+
$this->searchBuilder = new SearchBuilder($this->mimetypeLoader, $this->filesMetadataManager);
7984
$this->numericStorageId = 10000;
8085

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

0 commit comments

Comments
 (0)