GDesktopAppInfo: prioritize match_type over match_category when searching apps

Commit 9e2ad88455 improved app search results by allowing to differentiate
their match_type: prefix match or substring match; while giving more priority
to prefix matches over substring matches, but only when they are in the same
match_category[1].

This was a step forward but, as outlined in #3082, still not enough to get
most relevant results first to the user, because apparently (and for the
specific case of desktop app searching) a prefix match in a lower category
is more relevant to the user than a substring match in a higher category.

So that's what this commit implements, i.e. it makes sure prefix matches
are still preferred over substring matches but this time not only when
in the same category but also across different categories.

[1] Match category is the Desktop file key where the match happened.
    They are shown below from top to lesser priority.
      DESKTOP_KEY_Name
      DESKTOP_KEY_Exec
      DESKTOP_KEY_Keywords
      DESKTOP_KEY_GenericName
      DESKTOP_KEY_X_GNOME_FullName
      DESKTOP_KEY_Comment

Fixes #3082
This commit is contained in:
Nelson Benítez León
2023-09-25 03:29:53 +01:00
committed by Philip Withnall
parent 3c22e2745c
commit 40f567aa2a
3 changed files with 35 additions and 14 deletions

View File

@@ -458,7 +458,9 @@ const gchar desktop_key_match_category[N_DESKTOP_KEYS] = {
typedef enum {
/* Lower numbers have higher priority.
* Prefix match should put before substring match.
* Prefix match should put before substring match, independently of
* category relevance, i.e. a prefix match in 'Keyword' category will
* come before a substring match in a more relevant category like 'Name'.
*/
MATCH_TYPE_PREFIX = 1,
MATCH_TYPE_SUBSTRING = 2
@@ -576,7 +578,10 @@ compare_results (gconstpointer a,
}
else
{
if (ra->category == rb->category)
/* We prioritize prefix matches over category relevance e.g. a prefix match in 'Keyword'
* category is better than a substring match in a more relevance category like 'Name'.
*/
if (ra->match_type != rb->match_type)
return ra->match_type - rb->match_type;
return ra->category - rb->category;
@@ -590,10 +595,10 @@ compare_categories (gconstpointer a,
const struct search_result *ra = a;
const struct search_result *rb = b;
/* Also compare match types so we can put prefix match in a group while
* substring match in another group.
/* We prioritize prefix matches over category relevance e.g. a prefix match in 'Keyword'
* category is better than a substring match in a more relevance category like 'Name'.
*/
if (ra->category == rb->category)
if (ra->match_type != rb->match_type)
return ra->match_type - rb->match_type;
return ra->category - rb->category;