Skip to content

Commit

Permalink
Merge pull request #50420 from nextcloud/backport/50273/stable31
Browse files Browse the repository at this point in the history
[stable31] fix: Metadata field search
  • Loading branch information
AndyScherzinger authored Jan 25, 2025
2 parents bb2980e + 5b2af8b commit c186379
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 8 deletions.
17 changes: 11 additions & 6 deletions lib/private/Files/Cache/SearchBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
use OCP\Files\Search\ISearchComparison;
use OCP\Files\Search\ISearchOperator;
use OCP\Files\Search\ISearchOrder;
use OCP\FilesMetadata\IFilesMetadataManager;
use OCP\FilesMetadata\IMetadataQuery;

/**
Expand Down Expand Up @@ -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;
}

/**
Expand Down Expand Up @@ -285,11 +283,18 @@ private function validateComparison(ISearchComparison $operator) {


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
Expand Down
9 changes: 7 additions & 2 deletions tests/lib/Files/Cache/SearchBuilderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
use OCP\Files\Search\ISearchBinaryOperator;
use OCP\Files\Search\ISearchComparison;
use OCP\Files\Search\ISearchOperator;
use OCP\FilesMetadata\IFilesMetadataManager;
use Test\TestCase;

/**
Expand All @@ -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;

Expand All @@ -37,6 +41,7 @@ protected function setUp(): void {
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')
Expand All @@ -60,7 +65,7 @@ protected function setUp(): void {
[6, 'image']
]);

$this->searchBuilder = new SearchBuilder($this->mimetypeLoader);
$this->searchBuilder = new SearchBuilder($this->mimetypeLoader, $this->filesMetadataManager);
$this->numericStorageId = 10000;

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

0 comments on commit c186379

Please sign in to comment.