|
29 | 29 | */ |
30 | 30 | namespace OCA\Files\Search; |
31 | 31 |
|
| 32 | +use OC\Files\Search\SearchBinaryOperator; |
32 | 33 | use OC\Files\Search\SearchComparison; |
33 | 34 | use OC\Files\Search\SearchOrder; |
34 | 35 | use OC\Files\Search\SearchQuery; |
|
47 | 48 | use OCP\Search\SearchResultEntry; |
48 | 49 |
|
49 | 50 | class FilesSearchProvider implements IProvider { |
50 | | - |
51 | 51 | /** @var IL10N */ |
52 | 52 | private $l10n; |
53 | 53 |
|
@@ -102,16 +102,7 @@ public function getOrder(string $route, array $routeParameters): int { |
102 | 102 | */ |
103 | 103 | public function search(IUser $user, ISearchQuery $query): SearchResult { |
104 | 104 | $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); |
115 | 106 | return SearchResult::paginated( |
116 | 107 | $this->l10n->t('Files'), |
117 | 108 | array_map(function (Node $result) use ($userFolder) { |
@@ -141,6 +132,35 @@ public function search(IUser $user, ISearchQuery $query): SearchResult { |
141 | 132 | ); |
142 | 133 | } |
143 | 134 |
|
| 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 | + |
144 | 164 | /** |
145 | 165 | * Format subline for files |
146 | 166 | * |
|
0 commit comments