mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-27 01:50:24 +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:
parent
4043c89310
commit
6ecff2ac28
Notes:
sideshowbarker
2024-07-18 04:38:32 +09:00
Author: https://github.com/tcl3 Commit: https://github.com/SerenityOS/serenity/commit/6ecff2ac28 Pull-request: https://github.com/SerenityOS/serenity/pull/18331 Reviewed-by: https://github.com/LucasChollet Reviewed-by: https://github.com/alimpfard Reviewed-by: https://github.com/linusg
3 changed files with 19 additions and 5 deletions
|
@ -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;
|
||||
},
|
||||
|
|
|
@ -18,6 +18,8 @@
|
|||
|
||||
namespace Assistant {
|
||||
|
||||
static constexpr size_t MAX_SEARCH_RESULTS = 6;
|
||||
|
||||
class Result : public RefCounted<Result> {
|
||||
public:
|
||||
virtual ~Result() = default;
|
||||
|
|
|
@ -144,8 +144,6 @@ private:
|
|||
|
||||
}
|
||||
|
||||
static constexpr size_t MAX_SEARCH_RESULTS = 6;
|
||||
|
||||
ErrorOr<int> serenity_main(Main::Arguments arguments)
|
||||
{
|
||||
TRY(Core::System::pledge("stdio recvfd sendfd rpath cpath unix proc exec thread"));
|
||||
|
@ -270,7 +268,7 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
|
|||
else
|
||||
app_state.selected_index = 0;
|
||||
app_state.results = results;
|
||||
app_state.visible_result_count = min(results.size(), MAX_SEARCH_RESULTS);
|
||||
app_state.visible_result_count = min(results.size(), Assistant::MAX_SEARCH_RESULTS);
|
||||
|
||||
update_ui_timer->restart();
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue