Skip to content

Commit 39c41d3

Browse files
authored
Merge pull request #61156 from nextcloud/backport/60844/stable33
[stable33] feat(file-search): add property to SearchQuery and check select fields to decide wheter to join extended cache
2 parents 4951eee + 7cc173b commit 39c41d3

4 files changed

Lines changed: 37 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
@@ -342,6 +342,15 @@ private function transformQuery(Query $query, ?SearchBinaryOperator $scopeOperat
342342
}
343343
}, $query->orderBy);
344344

345+
$selectFields = [];
346+
foreach ($query->select as $searchProperty) {
347+
try {
348+
$selectFields[] = $this->mapPropertyNameToColumn($searchProperty);
349+
} catch (\InvalidArgumentException) {
350+
// property does not represent a column on DB
351+
}
352+
}
353+
345354
$limit = $query->limit;
346355
$maxResults = $limit->maxResults !== 0 ? (int)$limit->maxResults : 100;
347356
$offset = $limit->firstResult;
@@ -375,7 +384,8 @@ private function transformQuery(Query $query, ?SearchBinaryOperator $scopeOperat
375384
$offset,
376385
$orders,
377386
$this->user,
378-
$limitHome
387+
$limitHome,
388+
$selectFields
379389
);
380390
}
381391

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: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ class SearchQuery implements ISearchQuery {
2323
/** @var ?IUser */
2424
private $user;
2525
private $limitToHome;
26+
/** @var array */
27+
private $selectFields;
2628

2729
/**
2830
* SearchQuery constructor.
@@ -33,6 +35,7 @@ class SearchQuery implements ISearchQuery {
3335
* @param array $order
3436
* @param ?IUser $user
3537
* @param bool $limitToHome
38+
* @param list<string> $selectFields
3639
*/
3740
public function __construct(
3841
ISearchOperator $searchOperation,
@@ -41,13 +44,15 @@ public function __construct(
4144
array $order,
4245
?IUser $user = null,
4346
bool $limitToHome = false,
47+
array $selectFields = [],
4448
) {
4549
$this->searchOperation = $searchOperation;
4650
$this->limit = $limit;
4751
$this->offset = $offset;
4852
$this->order = $order;
4953
$this->user = $user;
5054
$this->limitToHome = $limitToHome;
55+
$this->selectFields = $selectFields;
5156
}
5257

5358
/**
@@ -88,4 +93,9 @@ public function getUser() {
8893
public function limitToHome(): bool {
8994
return $this->limitToHome;
9095
}
96+
97+
#[\Override]
98+
public function getSelectFields(): array {
99+
return $this->selectFields;
100+
}
91101
}

lib/public/Files/Search/ISearchQuery.php

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

0 commit comments

Comments
 (0)