From 2b24baece7192d682766a46a5ee4007f6d6907ca Mon Sep 17 00:00:00 2001 From: Daniel Kesselberg Date: Thu, 14 Sep 2023 14:34:45 +0200 Subject: [PATCH] fix: skip mtime hack for tag search Signed-off-by: Daniel Kesselberg --- apps/systemtags/lib/Search/TagSearchProvider.php | 2 +- lib/private/Files/Cache/SearchBuilder.php | 7 +++++++ lib/private/Files/Search/SearchOrder.php | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/apps/systemtags/lib/Search/TagSearchProvider.php b/apps/systemtags/lib/Search/TagSearchProvider.php index 5c731e42cc3e0..dc810049e7558 100644 --- a/apps/systemtags/lib/Search/TagSearchProvider.php +++ b/apps/systemtags/lib/Search/TagSearchProvider.php @@ -127,7 +127,7 @@ public function search(IUser $user, ISearchQuery $query): SearchResult { $query->getLimit(), (int)$query->getCursor(), $query->getSortOrder() === ISearchQuery::SORT_DATE_DESC ? [ - new SearchOrder(ISearchOrder::DIRECTION_DESCENDING, 'mtime'), + new SearchOrder(ISearchOrder::DIRECTION_DESCENDING, 'enforce_mtime'), ] : [], $user ); diff --git a/lib/private/Files/Cache/SearchBuilder.php b/lib/private/Files/Cache/SearchBuilder.php index b9a70bbd39b2c..8f13462acdd31 100644 --- a/lib/private/Files/Cache/SearchBuilder.php +++ b/lib/private/Files/Cache/SearchBuilder.php @@ -236,6 +236,7 @@ public function addSearchOrdersToQuery(IQueryBuilder $query, array $orders) { $field = 'file.fileid'; } + // The mtime hack: // Mysql really likes to pick an index for sorting if it can't fully satisfy the where // filter with an index, since search queries pretty much never are fully filtered by index // mysql often picks an index for sorting instead of the much more useful index for filtering. @@ -246,6 +247,12 @@ public function addSearchOrdersToQuery(IQueryBuilder $query, array $orders) { $field = $query->func()->add($field, $query->createNamedParameter(0)); } + // The index on mtime might be useful for ordering a result set by mtime. + // Use "enforce_mtime" as search order to skip the mtime hack. + if ($field === 'enforce_mtime') { + $field = 'mtime'; + } + $query->addOrderBy($field, $order->getDirection()); } } diff --git a/lib/private/Files/Search/SearchOrder.php b/lib/private/Files/Search/SearchOrder.php index 1395a87ac7219..c0adb9662fee5 100644 --- a/lib/private/Files/Search/SearchOrder.php +++ b/lib/private/Files/Search/SearchOrder.php @@ -68,6 +68,7 @@ private function sortFileInfoNoDirection(FileInfo $a, FileInfo $b): int { case 'mimetype': return $a->getMimetype() <=> $b->getMimetype(); case 'mtime': + case 'enforce_mtime': return $a->getMtime() <=> $b->getMtime(); case 'size': return $a->getSize() <=> $b->getSize();