1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 16:37:35 +00:00

Assistant: Avoid creating unnecessary FileResult objects

A BinaryHeap is now used to keep track of the 6 highest scoring files.
This ensures that a FileResult is not created for a result that will
never be displayed.
This commit is contained in:
Tim Ledbetter 2023-04-12 17:38:08 +01:00 committed by Sam Atkins
parent 4043c89310
commit 6ecff2ac28
3 changed files with 19 additions and 5 deletions

View file

@ -5,6 +5,7 @@
*/
#include "Providers.h"
#include <AK/BinaryHeap.h>
#include <AK/FuzzyMatch.h>
#include <AK/LexicalPath.h>
#include <AK/URL.h>
@ -132,7 +133,7 @@ void FileProvider::query(DeprecatedString const& query, Function<void(Vector<Non
m_fuzzy_match_work = Threading::BackgroundAction<Optional<Vector<NonnullRefPtr<Result>>>>::construct(
[this, query](auto& task) -> Optional<Vector<NonnullRefPtr<Result>>> {
Vector<NonnullRefPtr<Result>> results;
BinaryHeap<int, DeprecatedString, MAX_SEARCH_RESULTS> sorted_results;
for (auto& path : m_full_path_cache) {
if (task.is_canceled())
@ -144,7 +145,20 @@ void FileProvider::query(DeprecatedString const& query, Function<void(Vector<Non
if (match_result.score < 0)
continue;
results.append(adopt_ref(*new FileResult(path, match_result.score)));
if (sorted_results.size() < MAX_SEARCH_RESULTS || match_result.score > sorted_results.peek_min_key()) {
if (sorted_results.size() == MAX_SEARCH_RESULTS)
sorted_results.pop_min();
sorted_results.insert(match_result.score, path);
}
}
Vector<NonnullRefPtr<Result>> results;
results.ensure_capacity(sorted_results.size());
while (!sorted_results.is_empty()) {
auto score = sorted_results.peek_min_key();
auto path = sorted_results.pop_min();
results.append(make_ref_counted<FileResult>(path, score));
}
return results;
},