This commit is contained in:
Collin Barrett 2018-08-23 06:13:57 -05:00
parent 540b1e4d91
commit 9d00e76901
2 changed files with 25 additions and 23 deletions

View file

@ -71,7 +71,7 @@ private async Task SaveAsync()
if (lines != null)
{
await SaveInBatches(lines);
await DedupSnapshotRules();
await AddRemovedSnapshotRules();
await SetSuccessful();
}
@ -136,11 +136,10 @@ private static async Task SaveBatches(IEnumerable<SnapshotBatch> batches)
await batch.SaveAsync();
}
private async Task DedupSnapshotRules()
private async Task AddRemovedSnapshotRules()
{
var existingSnapshotRules = GetExistingSnapshotRules();
AddRemovedBySnapshots(existingSnapshotRules);
RemoveDuplicateSnapshotRules(existingSnapshotRules);
await dbContext.SaveChangesAsync();
}
@ -157,15 +156,6 @@ private void AddRemovedBySnapshots(IQueryable<SnapshotRule> existingSnapshotRule
removedSnapshotRules.ForEach(sr => sr.RemovedBySnapshot = snapEntity);
}
private void RemoveDuplicateSnapshotRules(IQueryable<SnapshotRule> existingSnapshotRules)
{
var duplicateSnapshotRules = dbContext.SnapshotRules.Where(sr =>
sr.AddedBySnapshot == snapEntity &&
existingSnapshotRules.Any(e =>
e.Rule == sr.Rule && e.RemovedBySnapshot == null));
dbContext.SnapshotRules.RemoveRange(duplicateSnapshotRules);
}
private async Task SetSuccessful()
{
snapEntity.WasSuccessful = true;

View file

@ -13,6 +13,7 @@ public class SnapshotBatch
private readonly FilterListsDbContext dbContext;
private readonly IEnumerable<string> lines;
private readonly Data.Entities.Snapshot snapEntity;
private IQueryable<Rule> existingRules;
public SnapshotBatch(FilterListsDbContext dbContext, IEnumerable<string> lines,
Data.Entities.Snapshot snapEntity)
@ -24,21 +25,32 @@ public SnapshotBatch(FilterListsDbContext dbContext, IEnumerable<string> lines,
public async Task SaveAsync()
{
var existingRules = GetExistingRules();
var newRules = CreateNewRules(existingRules);
dbContext.Rules.AddRange(newRules);
var rules = existingRules.Concat(newRules);
AddSnapshotRules(rules);
GetExistingRules();
AddAddedSnapshotRulesForExistingRules();
AddAddedSnapshotRulesForNewRules();
await dbContext.SaveChangesAsync();
}
private IQueryable<Rule> GetExistingRules() =>
dbContext.Rules.Join(lines, rule => rule.Raw, line => line, (rule, line) => rule);
private void GetExistingRules() =>
existingRules = dbContext.Rules.Join(lines, rule => rule.Raw, line => line, (rule, line) => rule);
private List<Rule> CreateNewRules(IQueryable<Rule> existingRules) =>
lines.Except(existingRules.Select(r => r.Raw)).Select(r => new Rule {Raw = r}).ToList();
private void AddAddedSnapshotRulesForExistingRules()
{
var existingSnapshotRules = dbContext.SnapshotRules
.Where(sr =>
existingRules.Contains(sr.Rule) &&
sr.AddedBySnapshot.FilterListId == snapEntity.FilterListId &&
sr.RemovedBySnapshot == null);
var newSnapshotRules = existingRules.Where(r => !existingSnapshotRules.Select(sr => sr.Rule).Contains(r))
.Select(r => new SnapshotRule {Rule = r});
snapEntity.AddedSnapshotRules.AddRange(newSnapshotRules);
}
private void AddSnapshotRules(IQueryable<Rule> rules) =>
snapEntity.AddedSnapshotRules.AddRange(rules.Select(r => new SnapshotRule {Rule = r}));
private void AddAddedSnapshotRulesForNewRules()
{
var rules = lines.Except(existingRules.Select(r => r.Raw)).Select(l => new Rule {Raw = l});
var snapshotRules = rules.Select(r => new SnapshotRule {Rule = r});
snapEntity.AddedSnapshotRules.AddRange(snapshotRules);
}
}
}