From b6cd555633a67989da6324f61ce7785662590735 Mon Sep 17 00:00:00 2001 From: Istvan Soos Date: Mon, 9 Dec 2024 17:51:39 +0100 Subject: [PATCH] Prevent costly sort if the results will be ignored anyway. --- app/lib/search/mem_index.dart | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/app/lib/search/mem_index.dart b/app/lib/search/mem_index.dart index 6a32afc9ca..efdc050b3f 100644 --- a/app/lib/search/mem_index.dart +++ b/app/lib/search/mem_index.dart @@ -213,10 +213,12 @@ class InMemoryPackageIndex { /// it linearly into the [0.4-1.0] range, to allow better /// multiplication outcomes. packageScores.multiplyAllFromValues(_adjustedOverallScores); - indexedHits = _rankWithValues(packageScores); + indexedHits = _rankWithValues(packageScores, + requiredLengthThreshold: query.offset); break; case SearchOrder.text: - indexedHits = _rankWithValues(packageScores); + indexedHits = _rankWithValues(packageScores, + requiredLengthThreshold: query.offset); break; case SearchOrder.created: indexedHits = _createdOrderedHits.whereInScores(packageScores); @@ -395,7 +397,11 @@ class InMemoryPackageIndex { return null; } - List _rankWithValues(IndexedScore score) { + List _rankWithValues( + IndexedScore score, { + // if the item count is fewer than this threshold, an empty list will be returned + int? requiredLengthThreshold, + }) { final list = []; for (var i = 0; i < score.length; i++) { final value = score.getValue(i); @@ -403,13 +409,17 @@ class InMemoryPackageIndex { list.add(IndexedPackageHit( i, PackageHit(package: score.keys[i], score: value))); } + if ((requiredLengthThreshold ?? 0) > list.length) { + // There is no point to sort or even keep the results, as the search query offset ignores these anyway. + return []; + } list.sort((a, b) { final scoreCompare = -a.hit.score!.compareTo(b.hit.score!); if (scoreCompare != 0) return scoreCompare; // if two packages got the same score, order by last updated return _compareUpdated(_documents[a.index], _documents[b.index]); }); - return list.toList(); + return list; } List _rankWithComparator(