Browse Source

fix: Metadata field search

Signed-off-by: Louis Chemineau <louis@chmn.me>
pull/50273/head
Louis Chemineau 10 months ago
parent
commit
a635710117
Failed to extract signature
  1. 17
      lib/private/Files/Cache/SearchBuilder.php
  2. 9
      tests/lib/Files/Cache/SearchBuilderTest.php

17
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

9
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'])

Loading…
Cancel
Save