Frequency navigation

This commit is contained in:
2023-02-27 23:19:04 +01:00
parent 650b650cd8
commit 05c1f026e6
10 changed files with 130 additions and 42 deletions

View File

@@ -89,7 +89,7 @@ public partial class FrequencyNavigationService : IFrequencyNavigationService, I
if (TryAgeContainerScores() || DateTime.Now - _lastSave > TimeSpan.FromMinutes(5))
{
}
//TODO: move to if above
await SaveStateAsync();
}
catch (Exception e)
@@ -113,7 +113,7 @@ public partial class FrequencyNavigationService : IFrequencyNavigationService, I
var itemsToRemove = new List<string>();
foreach (var container in _containerScores)
{
var newScore = (int) Math.Floor(container.Value.Score * 0.9);
var newScore = (int)Math.Floor(container.Value.Score * 0.9);
if (newScore > 0)
{
container.Value.Score = newScore;
@@ -136,14 +136,18 @@ public partial class FrequencyNavigationService : IFrequencyNavigationService, I
return new List<string>();
_saveLock.Wait();
var matchingContainers = _containerScores
.Where(c => c.Key.Contains(searchText, StringComparison.OrdinalIgnoreCase))
.OrderBy(c => GetWeightedScore(c.Value.Score, c.Value.LastAccessed))
.Select(c => c.Key)
.ToList();
_saveLock.Release();
return matchingContainers;
try
{
return _containerScores
.Where(c => c.Key.Contains(searchText, StringComparison.OrdinalIgnoreCase))
.OrderBy(c => GetWeightedScore(c.Value.Score, c.Value.LastAccessed))
.Select(c => c.Key)
.ToList();
}
finally
{
_saveLock.Release();
}
}
private int GetWeightedScore(int score, DateTime lastAccess)
@@ -159,36 +163,48 @@ public partial class FrequencyNavigationService : IFrequencyNavigationService, I
};
}
public async Task InitAsync()
{
await LoadStateAsync();
}
public async Task InitAsync() => await LoadStateAsync();
private async Task LoadStateAsync()
{
if (!File.Exists(_dbPath))
return;
await _saveLock.WaitAsync();
await using var dbStream = File.OpenRead(_dbPath);
var containerScores = await JsonSerializer.DeserializeAsync<Dictionary<string, ContainerFrequencyData>>(dbStream);
if (containerScores is null) return;
try
{
await _saveLock.WaitAsync();
_logger.LogTrace("Loading frequency navigation state from file '{DbPath}'", _dbPath);
await using var dbStream = File.OpenRead(_dbPath);
var containerScores = await JsonSerializer.DeserializeAsync<Dictionary<string, ContainerFrequencyData>>(dbStream);
if (containerScores is null) return;
_containerScores = containerScores;
_saveLock.Release();
_containerScores = containerScores;
}
catch (Exception e)
{
_logger.LogError(e, "Error loading frequency navigation state");
}
finally
{
_saveLock.Release();
}
}
public async Task ExitAsync()
{
await SaveStateAsync();
}
public async Task ExitAsync() => await SaveStateAsync();
private async Task SaveStateAsync()
{
await _saveLock.WaitAsync();
_lastSave = DateTime.Now;
await using var dbStream = File.OpenWrite(_dbPath);
await JsonSerializer.SerializeAsync(dbStream, _containerScores);
_saveLock.Release();
try
{
_lastSave = DateTime.Now;
await using var dbStream = File.Create(_dbPath);
await JsonSerializer.SerializeAsync(dbStream, _containerScores);
dbStream.Flush();
}
finally
{
_saveLock.Release();
}
}
}