diff --git a/apps/dav/lib/Files/FileSearchBackend.php b/apps/dav/lib/Files/FileSearchBackend.php index 05e495ff51f..b3b3b5508cf 100644 --- a/apps/dav/lib/Files/FileSearchBackend.php +++ b/apps/dav/lib/Files/FileSearchBackend.php @@ -346,6 +346,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; @@ -379,7 +388,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 8cbc4591d75..0b2cc45ec88 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 5823e81f59a..88b90beb538 100644 --- a/lib/private/Files/Search/SearchQuery.php +++ b/lib/private/Files/Search/SearchQuery.php @@ -17,6 +17,7 @@ use OCP\IUser; class SearchQuery implements ISearchQuery { /** * @param ISearchOrder[] $order + * @param list $selectFields */ public function __construct( private ISearchOperator $searchOperation, @@ -25,6 +26,7 @@ class SearchQuery implements ISearchQuery { private array $order, private ?IUser $user = null, private bool $limitToHome = false, + private array $selectFields = [], ) { } @@ -60,4 +62,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 dc96a7a2f98..0fa9afc7669 100644 --- a/lib/public/Files/Search/ISearchQuery.php +++ b/lib/public/Files/Search/ISearchQuery.php @@ -58,4 +58,12 @@ interface ISearchQuery { * @since 18.0.0 */ public function limitToHome(): bool; + + /** + * The fields to include in the search results + * + * @return list + * @since 35.0.0 + */ + public function getSelectFields(): array; }