Skip to content

Commit 3592f83

Browse files
Merge pull request #60844 from nextcloud/fix/noid/files-join-ext-cache-select-fields
feat(file-search): add property to SearchQuery and check select fields to decide wheter to join extended cache
2 parents 9848f9e + 476a6f0 commit 3592f83

4 files changed

Lines changed: 34 additions & 6 deletions

File tree

apps/dav/lib/Files/FileSearchBackend.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,15 @@ private function transformQuery(Query $query, ?SearchBinaryOperator $scopeOperat
346346
}
347347
}, $query->orderBy);
348348

349+
$selectFields = [];
350+
foreach ($query->select as $searchProperty) {
351+
try {
352+
$selectFields[] = $this->mapPropertyNameToColumn($searchProperty);
353+
} catch (\InvalidArgumentException) {
354+
// property does not represent a column on DB
355+
}
356+
}
357+
349358
$limit = $query->limit;
350359
$maxResults = $limit->maxResults !== 0 ? (int)$limit->maxResults : 100;
351360
$offset = $limit->firstResult;
@@ -379,7 +388,8 @@ private function transformQuery(Query $query, ?SearchBinaryOperator $scopeOperat
379388
$offset,
380389
$orders,
381390
$this->user,
382-
$limitHome
391+
$limitHome,
392+
$selectFields
383393
);
384394
}
385395

lib/private/Files/Cache/QuerySearchHelper.php

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -150,13 +150,16 @@ public function searchInCaches(ISearchQuery $searchQuery, array $caches): array
150150

151151
$builder = $this->getQueryBuilder();
152152

153-
$requestedFields = $this->searchBuilder->extractRequestedFields($searchQuery->getSearchOperation());
154-
155-
$orderFields = array_map(fn ($order) => $order->getField(), $searchQuery->getOrder());
153+
$requestedFields = array_merge(
154+
$this->searchBuilder->extractRequestedFields($searchQuery->getSearchOperation()),
155+
array_map(fn ($order) => $order->getField(), $searchQuery->getOrder()),
156+
$searchQuery->getSelectFields(),
157+
);
156158

157-
$joinExtendedCache = in_array('creation_time', $requestedFields)
159+
$joinExtendedCache = in_array('metadata_etag', $requestedFields)
160+
|| in_array('creation_time', $requestedFields)
158161
|| in_array('upload_time', $requestedFields)
159-
|| in_array('last_activity', $orderFields);
162+
|| in_array('last_activity', $requestedFields);
160163

161164
$query = $builder->selectFileCache('file', $joinExtendedCache);
162165

lib/private/Files/Search/SearchQuery.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
class SearchQuery implements ISearchQuery {
1818
/**
1919
* @param ISearchOrder[] $order
20+
* @param list<string> $selectFields
2021
*/
2122
public function __construct(
2223
private ISearchOperator $searchOperation,
@@ -25,6 +26,7 @@ public function __construct(
2526
private array $order,
2627
private ?IUser $user = null,
2728
private bool $limitToHome = false,
29+
private array $selectFields = [],
2830
) {
2931
}
3032

@@ -60,4 +62,9 @@ public function getUser(): ?IUser {
6062
public function limitToHome(): bool {
6163
return $this->limitToHome;
6264
}
65+
66+
#[\Override]
67+
public function getSelectFields(): array {
68+
return $this->selectFields;
69+
}
6370
}

lib/public/Files/Search/ISearchQuery.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,12 @@ public function getUser();
5858
* @since 18.0.0
5959
*/
6060
public function limitToHome(): bool;
61+
62+
/**
63+
* The fields to include in the search results
64+
*
65+
* @return list<string>
66+
* @since 35.0.0
67+
*/
68+
public function getSelectFields(): array;
6169
}

0 commit comments

Comments
 (0)