From b8bd66778213e27d350b28d830bc8c421944fc60 Mon Sep 17 00:00:00 2001 From: faxe1008 Date: Sat, 16 Apr 2022 22:01:20 +0200 Subject: [PATCH] AK: Add FuzzyMatch header This patch adds a header containing the fuzzy match algorithm previously used in Assistant. The algorithm was moved to AK since there are many places where a search may benefit from fuzzyness. --- .../FuzzyMatch.cpp => AK/FuzzyMatch.h | 26 +++++++++++++---- .../Applications/Assistant/CMakeLists.txt | 1 - Userland/Applications/Assistant/FuzzyMatch.h | 29 ------------------- Userland/Applications/Assistant/Providers.cpp | 2 +- 4 files changed, 22 insertions(+), 36 deletions(-) rename Userland/Applications/Assistant/FuzzyMatch.cpp => AK/FuzzyMatch.h (82%) delete mode 100644 Userland/Applications/Assistant/FuzzyMatch.h diff --git a/Userland/Applications/Assistant/FuzzyMatch.cpp b/AK/FuzzyMatch.h similarity index 82% rename from Userland/Applications/Assistant/FuzzyMatch.cpp rename to AK/FuzzyMatch.h index b931537b0b3..1165cea050b 100644 --- a/Userland/Applications/Assistant/FuzzyMatch.cpp +++ b/AK/FuzzyMatch.h @@ -4,11 +4,17 @@ * SPDX-License-Identifier: BSD-2-Clause */ -#include "FuzzyMatch.h" -#include -#include +#pragma once -namespace Assistant { +#include +#include + +namespace AK { + +struct FuzzyMatchResult { + bool matched { false }; + int score { 0 }; +}; static constexpr int const RECURSION_LIMIT = 10; static constexpr int const MAX_MATCHES = 256; @@ -118,7 +124,15 @@ static FuzzyMatchResult fuzzy_match_recursive(String const& needle, String const return { true, out_score }; } -FuzzyMatchResult fuzzy_match(String const& needle, String const& haystack) +// This fuzzy_match algorithm is based off a similar algorithm used by Sublime Text. The key insight is that instead +// of doing a total in the distance between characters (I.E. Levenshtein Distance), we apply some meaningful heuristics +// related to our dataset that we're trying to match to build up a score. Scores can then be sorted and displayed +// with the highest at the top. +// +// Scores are not normalized between any values and have no particular meaning. The starting value is 100 and when we +// detect good indicators of a match we add to the score. When we detect bad indicators, we penalize the match and subtract +// from its score. Therefore, the longer the needle/haystack the greater the range of scores could be. +static FuzzyMatchResult fuzzy_match(String const& needle, String const& haystack) { int recursion_count = 0; u8 matches[MAX_MATCHES] {}; @@ -126,3 +140,5 @@ FuzzyMatchResult fuzzy_match(String const& needle, String const& haystack) } } +using AK::fuzzy_match; +using AK::FuzzyMatchResult; diff --git a/Userland/Applications/Assistant/CMakeLists.txt b/Userland/Applications/Assistant/CMakeLists.txt index 1112ff5eeb8..478c4dbe699 100644 --- a/Userland/Applications/Assistant/CMakeLists.txt +++ b/Userland/Applications/Assistant/CMakeLists.txt @@ -6,7 +6,6 @@ serenity_component( set(SOURCES Providers.cpp - FuzzyMatch.cpp main.cpp ) diff --git a/Userland/Applications/Assistant/FuzzyMatch.h b/Userland/Applications/Assistant/FuzzyMatch.h deleted file mode 100644 index a35832c6db8..00000000000 --- a/Userland/Applications/Assistant/FuzzyMatch.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2021, Spencer Dixon - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#pragma once - -#include -#include - -namespace Assistant { - -struct FuzzyMatchResult { - bool matched { false }; - int score { 0 }; -}; - -// This fuzzy_match algorithm is based off a similar algorithm used by Sublime Text. The key insight is that instead -// of doing a total in the distance between characters (I.E. Levenshtein Distance), we apply some meaningful heuristics -// related to our dataset that we're trying to match to build up a score. Scores can then be sorted and displayed -// with the highest at the top. -// -// Scores are not normalized between any values and have no particular meaning. The starting value is 100 and when we -// detect good indicators of a match we add to the score. When we detect bad indicators, we penalize the match and subtract -// from its score. Therefore, the longer the needle/haystack the greater the range of scores could be. -FuzzyMatchResult fuzzy_match(String const& needle, String const& haystack); - -} diff --git a/Userland/Applications/Assistant/Providers.cpp b/Userland/Applications/Assistant/Providers.cpp index 0a244636382..e22789d6187 100644 --- a/Userland/Applications/Assistant/Providers.cpp +++ b/Userland/Applications/Assistant/Providers.cpp @@ -5,7 +5,7 @@ */ #include "Providers.h" -#include "FuzzyMatch.h" +#include #include #include #include