From 01ae42f6155bfbb74ccdba1a5634ec890de594d3 Mon Sep 17 00:00:00 2001 From: Cristian Scheid Date: Fri, 29 May 2026 13:36:39 -0300 Subject: [PATCH] feat(file-search): add property to SearchQuery and check select fields to decide wheter to join extended cache Signed-off-by: Cristian Scheid --- apps/dav/lib/Files/FileSearchBackend.php | 12 +++++++++++- lib/private/Files/Cache/QuerySearchHelper.php | 13 ++++++++----- lib/private/Files/Search/SearchQuery.php | 10 ++++++++++ lib/public/Files/Search/ISearchQuery.php | 8 ++++++++ 4 files changed, 37 insertions(+), 6 deletions(-) diff --git a/apps/dav/lib/Files/FileSearchBackend.php b/apps/dav/lib/Files/FileSearchBackend.php index 7c44e132c08..7045c5407c1 100644 --- a/apps/dav/lib/Files/FileSearchBackend.php +++ b/apps/dav/lib/Files/FileSearchBackend.php @@ -342,6 +342,15 @@ class FileSearchBackend implements ISearchBackend { } }, $query->orderBy); + $selectFields = []; + foreach ($query->select as $searchProperty) { + try { + $selectFields[] = $this->mapPropertyNameToColumn($searchProperty); + } catch (\InvalidArgumentException) { + // property does not represent a column on DB + } + } + $limit = $query->limit; $maxResults = $limit->maxResults !== 0 ? (int)$limit->maxResults : 100; $offset = $limit->firstResult; @@ -375,7 +384,8 @@ class FileSearchBackend implements ISearchBackend { $offset, $orders, $this->user, - $limitHome + $limitHome, + $selectFields ); } diff --git a/lib/private/Files/Cache/QuerySearchHelper.php b/lib/private/Files/Cache/QuerySearchHelper.php index 8e344293ba5..5da74b84bce 100644 --- a/lib/private/Files/Cache/QuerySearchHelper.php +++ b/lib/private/Files/Cache/QuerySearchHelper.php @@ -150,13 +150,16 @@ class QuerySearchHelper { $builder = $this->getQueryBuilder(); - $requestedFields = $this->searchBuilder->extractRequestedFields($searchQuery->getSearchOperation()); + $requestedFields = array_merge( + $this->searchBuilder->extractRequestedFields($searchQuery->getSearchOperation()), + array_map(fn ($order) => $order->getField(), $searchQuery->getOrder()), + $searchQuery->getSelectFields(), + ); - $orderFields = array_map(fn ($order) => $order->getField(), $searchQuery->getOrder()); - - $joinExtendedCache = in_array('creation_time', $requestedFields) + $joinExtendedCache = in_array('metadata_etag', $requestedFields) + || in_array('creation_time', $requestedFields) || in_array('upload_time', $requestedFields) - || in_array('last_activity', $orderFields); + || in_array('last_activity', $requestedFields); $query = $builder->selectFileCache('file', $joinExtendedCache); diff --git a/lib/private/Files/Search/SearchQuery.php b/lib/private/Files/Search/SearchQuery.php index 592749cf4a0..0ccc63df4cf 100644 --- a/lib/private/Files/Search/SearchQuery.php +++ b/lib/private/Files/Search/SearchQuery.php @@ -23,6 +23,8 @@ class SearchQuery implements ISearchQuery { /** @var ?IUser */ private $user; private $limitToHome; + /** @var array */ + private $selectFields; /** * SearchQuery constructor. @@ -33,6 +35,7 @@ class SearchQuery implements ISearchQuery { * @param array $order * @param ?IUser $user * @param bool $limitToHome + * @param list $selectFields */ public function __construct( ISearchOperator $searchOperation, @@ -41,6 +44,7 @@ class SearchQuery implements ISearchQuery { array $order, ?IUser $user = null, bool $limitToHome = false, + array $selectFields = [], ) { $this->searchOperation = $searchOperation; $this->limit = $limit; @@ -48,6 +52,7 @@ class SearchQuery implements ISearchQuery { $this->order = $order; $this->user = $user; $this->limitToHome = $limitToHome; + $this->selectFields = $selectFields; } /** @@ -88,4 +93,9 @@ class SearchQuery implements ISearchQuery { public function limitToHome(): bool { return $this->limitToHome; } + + #[\Override] + public function getSelectFields(): array { + return $this->selectFields; + } } diff --git a/lib/public/Files/Search/ISearchQuery.php b/lib/public/Files/Search/ISearchQuery.php index 1b400c56e5b..7fa28dd2b79 100644 --- a/lib/public/Files/Search/ISearchQuery.php +++ b/lib/public/Files/Search/ISearchQuery.php @@ -57,4 +57,12 @@ interface ISearchQuery { * @since 18.0.0 */ public function limitToHome(): bool; + + /** + * The fields to include in the search results + * + * @return list + * @since 32.0.12 + */ + public function getSelectFields(): array; }