Materializing lists to prevent rescoring (#42017)

Read title. Making MainListPage materialize search results so
enumerating doesn't rescore the item.
This commit is contained in:
Michael Jolley
2025-09-26 09:59:23 -05:00
committed by GitHub
parent 2e0fe16128
commit a1c8541d8b

View File

@@ -32,9 +32,9 @@ public partial class MainListPage : DynamicListPage,
private readonly IServiceProvider _serviceProvider; private readonly IServiceProvider _serviceProvider;
private readonly TopLevelCommandManager _tlcManager; private readonly TopLevelCommandManager _tlcManager;
private IEnumerable<Scored<IListItem>>? _filteredItems; private List<Scored<IListItem>>? _filteredItems;
private IEnumerable<Scored<IListItem>>? _filteredApps; private List<Scored<IListItem>>? _filteredApps;
private IEnumerable<Scored<IListItem>>? _fallbackItems; private List<Scored<IListItem>>? _fallbackItems;
private bool _includeApps; private bool _includeApps;
private bool _filteredItemsIncludesApps; private bool _filteredItemsIncludesApps;
private int _appResultLimit = 10; private int _appResultLimit = 10;
@@ -158,13 +158,13 @@ public partial class MainListPage : DynamicListPage,
{ {
lock (_tlcManager.TopLevelCommands) lock (_tlcManager.TopLevelCommands)
{ {
IEnumerable<Scored<IListItem>> limitedApps = Enumerable.Empty<Scored<IListItem>>(); List<Scored<IListItem>> limitedApps = new List<Scored<IListItem>>();
// Fuzzy matching can produce a lot of results, so we want to limit the // Fuzzy matching can produce a lot of results, so we want to limit the
// number of apps we show at once if it's a large set. // number of apps we show at once if it's a large set.
if (_filteredApps?.Any() == true) if (_filteredApps?.Count > 0)
{ {
limitedApps = _filteredApps.OrderByDescending(s => s.Score).Take(_appResultLimit); limitedApps = _filteredApps.OrderByDescending(s => s.Score).Take(_appResultLimit).ToList();
} }
var items = Enumerable.Empty<Scored<IListItem>>() var items = Enumerable.Empty<Scored<IListItem>>()
@@ -330,23 +330,23 @@ public partial class MainListPage : DynamicListPage,
{ {
newApps = AllAppsCommandProvider.Page.GetItems().ToList(); newApps = AllAppsCommandProvider.Page.GetItems().ToList();
} }
}
if (token.IsCancellationRequested) if (token.IsCancellationRequested)
{ {
return; return;
} }
if (token.IsCancellationRequested)
{
return;
} }
// Produce a list of everything that matches the current filter. // Produce a list of everything that matches the current filter.
_filteredItems = ListHelpers.FilterListWithScores<IListItem>(newFilteredItems ?? [], SearchText, ScoreTopLevelItem); _filteredItems = [.. ListHelpers.FilterListWithScores<IListItem>(newFilteredItems ?? [], SearchText, ScoreTopLevelItem)];
if (token.IsCancellationRequested)
{
return;
}
// Defaulting scored to 1 but we'll eventually use user rankings // Defaulting scored to 1 but we'll eventually use user rankings
_fallbackItems = newFallbacks.Select(f => new Scored<IListItem> { Item = f, Score = 1 }); _fallbackItems = [.. newFallbacks.Select(f => new Scored<IListItem> { Item = f, Score = 1 })];
if (token.IsCancellationRequested) if (token.IsCancellationRequested)
{ {
@@ -367,7 +367,12 @@ public partial class MainListPage : DynamicListPage,
// but we need to know the limit now to avoid re-scoring apps // but we need to know the limit now to avoid re-scoring apps
var appLimit = AllAppsCommandProvider.TopLevelResultLimit; var appLimit = AllAppsCommandProvider.TopLevelResultLimit;
_filteredApps = scoredApps; _filteredApps = [.. scoredApps];
if (token.IsCancellationRequested)
{
return;
}
} }
RaiseItemsChanged(); RaiseItemsChanged();