From 9d00e76901d247fa52154021bfa222ec781537ba Mon Sep 17 00:00:00 2001 From: Collin Barrett Date: Thu, 23 Aug 2018 06:13:57 -0500 Subject: [PATCH] wip --- src/FilterLists.Services/Snapshot/Snapshot.cs | 14 ++------ .../Snapshot/SnapshotBatch.cs | 34 +++++++++++++------ 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/src/FilterLists.Services/Snapshot/Snapshot.cs b/src/FilterLists.Services/Snapshot/Snapshot.cs index 8b1f16923..4cca2b402 100644 --- a/src/FilterLists.Services/Snapshot/Snapshot.cs +++ b/src/FilterLists.Services/Snapshot/Snapshot.cs @@ -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 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 existingSnapshotRule removedSnapshotRules.ForEach(sr => sr.RemovedBySnapshot = snapEntity); } - private void RemoveDuplicateSnapshotRules(IQueryable 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; diff --git a/src/FilterLists.Services/Snapshot/SnapshotBatch.cs b/src/FilterLists.Services/Snapshot/SnapshotBatch.cs index a1af7099e..1385e54df 100644 --- a/src/FilterLists.Services/Snapshot/SnapshotBatch.cs +++ b/src/FilterLists.Services/Snapshot/SnapshotBatch.cs @@ -13,6 +13,7 @@ public class SnapshotBatch private readonly FilterListsDbContext dbContext; private readonly IEnumerable lines; private readonly Data.Entities.Snapshot snapEntity; + private IQueryable existingRules; public SnapshotBatch(FilterListsDbContext dbContext, IEnumerable lines, Data.Entities.Snapshot snapEntity) @@ -24,21 +25,32 @@ public SnapshotBatch(FilterListsDbContext dbContext, IEnumerable 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 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 CreateNewRules(IQueryable 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 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); + } } } \ No newline at end of file