Skip to content

Commit 7665381

Browse files
committed
Files: Extend search to also cover tags
fixes #326 Signed-off-by: Marcel Klehr <[email protected]>
1 parent 48f0515 commit 7665381

File tree

5 files changed

+30
-9
lines changed

5 files changed

+30
-9
lines changed

apps/files/lib/Search/FilesSearchProvider.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929

3030
namespace OCA\Files\Search;
3131

32+
use OC\Files\Search\SearchBinaryOperator;
3233
use OC\Files\Search\SearchComparison;
3334
use OC\Files\Search\SearchOrder;
3435
use OC\Files\Search\SearchQuery;
@@ -103,7 +104,11 @@ public function getOrder(string $route, array $routeParameters): int {
103104
public function search(IUser $user, ISearchQuery $query): SearchResult {
104105
$userFolder = $this->rootFolder->getUserFolder($user->getUID());
105106
$fileQuery = new SearchQuery(
106-
new SearchComparison(ISearchComparison::COMPARE_LIKE, 'name', '%' . $query->getTerm() . '%'),
107+
new SearchBinaryOperator(SearchBinaryOperator::OPERATOR_OR, [
108+
new SearchComparison(ISearchComparison::COMPARE_LIKE, 'name', '%' . $query->getTerm() . '%'),
109+
new SearchComparison(ISearchComparison::COMPARE_LIKE, 'tagname', '%' . $query->getTerm() . '%'),
110+
new SearchComparison(ISearchComparison::COMPARE_LIKE, 'systemtag', '%' . $query->getTerm() . '%'),
111+
]),
107112
$query->getLimit(),
108113
(int)$query->getCursor(),
109114
$query->getSortOrder() === ISearchQuery::SORT_DATE_DESC ? [

lib/private/Files/Cache/Cache.php

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -840,6 +840,8 @@ public function searchByMime($mimetype) {
840840
public function searchQuery(ISearchQuery $searchQuery) {
841841
$builder = $this->getQueryBuilder();
842842

843+
$isPostgres = $this->connection->getDatabasePlatform()->getName() === 'postgresql';
844+
843845
$query = $builder->selectFileCache('file');
844846

845847
$query->whereStorageId();
@@ -850,13 +852,21 @@ public function searchQuery(ISearchQuery $searchQuery) {
850852
throw new \InvalidArgumentException("Searching by tag requires the user to be set in the query");
851853
}
852854
$query
853-
->innerJoin('file', 'vcategory_to_object', 'tagmap', $builder->expr()->eq('file.fileid', 'tagmap.objid'))
854-
->innerJoin('tagmap', 'vcategory', 'tag', $builder->expr()->andX(
855+
->leftJoin('file', 'vcategory_to_object', 'tagmap', $builder->expr()->eq('file.fileid', 'tagmap.objid') )
856+
->leftJoin('tagmap', 'vcategory', 'tag', $builder->expr()->andX(
855857
$builder->expr()->eq('tagmap.type', 'tag.type'),
856-
$builder->expr()->eq('tagmap.categoryid', 'tag.id')
858+
$builder->expr()->eq('tagmap.categoryid', 'tag.id'),
859+
$builder->expr()->eq('tag.type', $builder->createNamedParameter('files')),
860+
$builder->expr()->eq('tag.uid', $builder->createNamedParameter($user->getUID()))
861+
))
862+
->leftJoin('file', 'systemtag_object_mapping', 'systemtagmap', $builder->expr()->andX(
863+
$builder->expr()->eq($isPostgres? 'file.fileid::varchar(64)' : 'file.fileid', 'systemtagmap.objectid'),
864+
$builder->expr()->eq('systemtagmap.objecttype', $builder->createNamedParameter('files'))
857865
))
858-
->andWhere($builder->expr()->eq('tag.type', $builder->createNamedParameter('files')))
859-
->andWhere($builder->expr()->eq('tag.uid', $builder->createNamedParameter($user->getUID())));
866+
->leftJoin('systemtagmap', 'systemtag', 'systemtag', $builder->expr()->andX(
867+
$builder->expr()->eq('systemtag.id', 'systemtagmap.systemtagid'),
868+
$builder->expr()->eq('systemtag.visibility', $builder->createNamedParameter(true))
869+
));
860870
}
861871

862872
$searchExpr = $this->querySearchHelper->searchOperatorToDBExpr($builder, $searchQuery->getSearchOperation());

lib/private/Files/Cache/CacheQueryBuilder.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public function __construct(IDBConnection $connection, SystemConfig $systemConfi
4747

4848
public function selectFileCache(string $alias = null) {
4949
$name = $alias ? $alias : 'filecache';
50-
$this->select("$name.fileid", 'storage', 'path', 'path_hash', "$name.parent", 'name', 'mimetype', 'mimepart', 'size', 'mtime',
50+
$this->select("$name.fileid", 'storage', 'path', 'path_hash', "$name.parent", "$name.name", 'mimetype', 'mimepart', 'size', 'mtime',
5151
'storage_mtime', 'encrypted', 'etag', 'permissions', 'checksum', 'metadata_etag', 'creation_time', 'upload_time')
5252
->from('filecache', $name)
5353
->leftJoin($name, 'filecache_extended', 'fe', $this->expr()->eq("$name.fileid", 'fe.fileid'));

lib/private/Files/Cache/QuerySearchHelper.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ public function shouldJoinTags(ISearchOperator $operator) {
8181
return $shouldJoin || $this->shouldJoinTags($operator);
8282
}, false);
8383
} elseif ($operator instanceof ISearchComparison) {
84-
return $operator->getField() === 'tagname' || $operator->getField() === 'favorite';
84+
return $operator->getField() === 'tagname' || $operator->getField() === 'favorite' || $operator->getField() === 'systemtag';
8585
}
8686
return false;
8787
}
@@ -162,8 +162,12 @@ private function getOperatorFieldAndValue(ISearchComparison $operator) {
162162
} elseif ($field === 'favorite') {
163163
$field = 'tag.category';
164164
$value = self::TAG_FAVORITE;
165+
} elseif ($field === 'name') {
166+
$field = 'file.name';
165167
} elseif ($field === 'tagname') {
166168
$field = 'tag.category';
169+
} elseif ($field === 'systemtag') {
170+
$field = 'systemtag.name';
167171
} elseif ($field === 'fileid') {
168172
$field = 'file.fileid';
169173
} elseif ($field === 'path' && $type === ISearchComparison::COMPARE_EQUAL) {
@@ -181,6 +185,7 @@ private function validateComparison(ISearchComparison $operator) {
181185
'path' => 'string',
182186
'size' => 'integer',
183187
'tagname' => 'string',
188+
'systemtag' => 'string',
184189
'favorite' => 'boolean',
185190
'fileid' => 'integer'
186191
];
@@ -191,6 +196,7 @@ private function validateComparison(ISearchComparison $operator) {
191196
'path' => ['eq', 'like'],
192197
'size' => ['eq', 'gt', 'lt', 'gte', 'lte'],
193198
'tagname' => ['eq', 'like'],
199+
'systemtag' => ['eq', 'like'],
194200
'favorite' => ['eq'],
195201
'fileid' => ['eq']
196202
];

tests/lib/Files/Cache/QuerySearchHelperTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ protected function setUp(): void {
7979
$this->numericStorageId = 10000;
8080

8181
$this->builder->select(['fileid'])
82-
->from('filecache')
82+
->from('filecache', 'file') // alias needed for QuerySearchHelper#getOperatorFieldAndValue
8383
->where($this->builder->expr()->eq('storage', new Literal($this->numericStorageId)));
8484
}
8585

0 commit comments

Comments
 (0)