Skip to content

Commit 9852a99

Browse files
committed
feat(files): Allow advanced search for files
Signed-off-by: Benjamin Gaussorgues <benjamin.gaussorgues@nextcloud.com>
1 parent 662d4f7 commit 9852a99

File tree

1 file changed

+31
-11
lines changed

1 file changed

+31
-11
lines changed

apps/files/lib/Search/FilesSearchProvider.php

Lines changed: 31 additions & 11 deletions
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;
@@ -47,7 +48,6 @@
4748
use OCP\Search\SearchResultEntry;
4849

4950
class FilesSearchProvider implements IProvider {
50-
5151
/** @var IL10N */
5252
private $l10n;
5353

@@ -102,16 +102,7 @@ public function getOrder(string $route, array $routeParameters): int {
102102
*/
103103
public function search(IUser $user, ISearchQuery $query): SearchResult {
104104
$userFolder = $this->rootFolder->getUserFolder($user->getUID());
105-
$fileQuery = new SearchQuery(
106-
new SearchComparison(ISearchComparison::COMPARE_LIKE, 'name', '%' . $query->getTerm() . '%'),
107-
$query->getLimit(),
108-
(int)$query->getCursor(),
109-
$query->getSortOrder() === ISearchQuery::SORT_DATE_DESC ? [
110-
new SearchOrder(ISearchOrder::DIRECTION_DESCENDING, 'mtime'),
111-
] : [],
112-
$user
113-
);
114-
105+
$fileQuery = $this->buildSearchQuery($query, $user);
115106
return SearchResult::paginated(
116107
$this->l10n->t('Files'),
117108
array_map(function (Node $result) use ($userFolder) {
@@ -141,6 +132,35 @@ public function search(IUser $user, ISearchQuery $query): SearchResult {
141132
);
142133
}
143134

135+
private function buildSearchQuery(ISearchQuery $query, IUser $user): SearchQuery {
136+
$comparisons = [];
137+
foreach ($query->getFilters() as $filter => $value) {
138+
$comparison = match ($filter) {
139+
'term' => new SearchComparison(ISearchComparison::COMPARE_LIKE, 'name', '%' . $value . '%'),
140+
'from' => new SearchComparison(ISearchComparison::COMPARE_GREATER_THAN_EQUAL, 'mtime', $value),
141+
'to' => new SearchComparison(ISearchComparison::COMPARE_LESS_THAN_EQUAL, 'mtime', $value),
142+
'min-size' => new SearchComparison(ISearchComparison::COMPARE_GREATER_THAN_EQUAL, 'size', (int) $value),
143+
'max-size' => new SearchComparison(ISearchComparison::COMPARE_LESS_THAN_EQUAL, 'size', (int) $value),
144+
'mime' => new SearchComparison(ISearchComparison::COMPARE_EQUAL, 'mimetype', $value),
145+
'type' => new SearchComparison(ISearchComparison::COMPARE_LIKE, 'mimetype', $value . '/%'),
146+
default => false,
147+
};
148+
if ($comparison) {
149+
$comparisons[] = $comparison;
150+
}
151+
}
152+
153+
return new SearchQuery(
154+
new SearchBinaryOperator(SearchBinaryOperator::OPERATOR_AND, $comparisons),
155+
$query->getLimit(),
156+
(int) $query->getCursor(),
157+
$query->getSortOrder() === ISearchQuery::SORT_DATE_DESC
158+
? [new SearchOrder(ISearchOrder::DIRECTION_DESCENDING, 'mtime')]
159+
: [],
160+
$user
161+
);
162+
}
163+
144164
/**
145165
* Format subline for files
146166
*

0 commit comments

Comments
 (0)