From bdc77bc3ed23f45a68e6a5a3d7869eee06b56b97 Mon Sep 17 00:00:00 2001 From: Benjamin Gaussorgues Date: Mon, 25 Sep 2023 15:07:29 +0200 Subject: [PATCH] feat(files): Allow advanced search for files Signed-off-by: Benjamin Gaussorgues --- apps/files/lib/Search/FilesSearchProvider.php | 42 ++++++++++++++----- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/apps/files/lib/Search/FilesSearchProvider.php b/apps/files/lib/Search/FilesSearchProvider.php index ba2d4bafa3062..eb50afc3a51b1 100644 --- a/apps/files/lib/Search/FilesSearchProvider.php +++ b/apps/files/lib/Search/FilesSearchProvider.php @@ -29,6 +29,7 @@ */ namespace OCA\Files\Search; +use OC\Files\Search\SearchBinaryOperator; use OC\Files\Search\SearchComparison; use OC\Files\Search\SearchOrder; use OC\Files\Search\SearchQuery; @@ -47,7 +48,6 @@ use OCP\Search\SearchResultEntry; class FilesSearchProvider implements IProvider { - /** @var IL10N */ private $l10n; @@ -102,16 +102,7 @@ public function getOrder(string $route, array $routeParameters): int { */ public function search(IUser $user, ISearchQuery $query): SearchResult { $userFolder = $this->rootFolder->getUserFolder($user->getUID()); - $fileQuery = new SearchQuery( - new SearchComparison(ISearchComparison::COMPARE_LIKE, 'name', '%' . $query->getTerm() . '%'), - $query->getLimit(), - (int)$query->getCursor(), - $query->getSortOrder() === ISearchQuery::SORT_DATE_DESC ? [ - new SearchOrder(ISearchOrder::DIRECTION_DESCENDING, 'mtime'), - ] : [], - $user - ); - + $fileQuery = $this->buildSearchQuery($query, $user); return SearchResult::paginated( $this->l10n->t('Files'), array_map(function (Node $result) use ($userFolder) { @@ -141,6 +132,35 @@ public function search(IUser $user, ISearchQuery $query): SearchResult { ); } + private function buildSearchQuery(ISearchQuery $query, IUser $user): SearchQuery { + $comparisons = []; + foreach ($query->getFilters() as $filter) { + $comparison = match ($filter->name) { + 'term', 's_term' => new SearchComparison(ISearchComparison::COMPARE_LIKE, 'name', '%' . $filter->value . '%'), + 't_since' => new SearchComparison(ISearchComparison::COMPARE_GREATER_THAN_EQUAL, 'mtime', $filter->value), + 't_until' => new SearchComparison(ISearchComparison::COMPARE_LESS_THAN_EQUAL, 'mtime', $filter->value), + 'i_min-size' => new SearchComparison(ISearchComparison::COMPARE_GREATER_THAN_EQUAL, 'size', $filter->value), + 'i_max-size' => new SearchComparison(ISearchComparison::COMPARE_LESS_THAN_EQUAL, 'size', $filter->value), + 's_mime' => new SearchComparison(ISearchComparison::COMPARE_EQUAL, 'mimetype', $filter->value), + 's_type' => new SearchComparison(ISearchComparison::COMPARE_LIKE, 'mimetype', $filter->value . '/%'), + default => false, + }; + if ($comparison) { + $comparisons[] = $comparison; + } + } + + return new SearchQuery( + new SearchBinaryOperator(SearchBinaryOperator::OPERATOR_AND, $comparisons), + $query->getLimit(), + (int) $query->getCursor(), + $query->getSortOrder() === ISearchQuery::SORT_DATE_DESC + ? [new SearchOrder(ISearchOrder::DIRECTION_DESCENDING, 'mtime')] + : [], + $user + ); + } + /** * Format subline for files *