-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
…the same `UniqueLatestReplier` to re-achieve c8f4920 * fix entities that already exists are still attached in `DbContext.ChangeTracker` + local function `DetachAndReplace()` @ `ThreadLatestReplierSaver.SaveFromThread()` - field `_latestRepliersKeyByUnique` to let `FillFromRequestingWith602()` directly assign new instances of related entity `LatestReplier` @ ThreadCrawlFacade.cs @ c#/crawler
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,5 @@ | ||
using Microsoft.EntityFrameworkCore.ChangeTracking; | ||
|
||
namespace tbm.Crawler.Tieba.Crawl.Saver.Related; | ||
|
||
public class ThreadLatestReplierSaver( | ||
|
@@ -10,19 +12,38 @@ public class ThreadLatestReplierSaver( | |
|
||
public Action SaveFromThread(CrawlerDbContext db, IReadOnlyCollection<ThreadPost> threads) | ||
{ | ||
var uniqueLatestRepliers = threads | ||
static void DetachAndReplace( | ||
Check failure on line 15 in c#/crawler/src/Tieba/Crawl/Saver/Related/ThreadLatestReplierSaver.cs GitHub Actions / runs-on (ubuntu-latest) / build (crawler)
Check failure on line 15 in c#/crawler/src/Tieba/Crawl/Saver/Related/ThreadLatestReplierSaver.cs GitHub Actions / runs-on (ubuntu-latest) / build (crawler)
Check failure on line 15 in c#/crawler/src/Tieba/Crawl/Saver/Related/ThreadLatestReplierSaver.cs GitHub Actions / runs-on (macos-latest) / build (crawler)
Check failure on line 15 in c#/crawler/src/Tieba/Crawl/Saver/Related/ThreadLatestReplierSaver.cs GitHub Actions / runs-on (macos-latest) / build (crawler)
Check failure on line 15 in c#/crawler/src/Tieba/Crawl/Saver/Related/ThreadLatestReplierSaver.cs GitHub Actions / runs-on (windows-latest) / build (crawler)
Check failure on line 15 in c#/crawler/src/Tieba/Crawl/Saver/Related/ThreadLatestReplierSaver.cs GitHub Actions / runs-on (windows-latest) / build (crawler)
|
||
EntityEntry<LatestReplier> entityEntry, | ||
ThreadPost thread, | ||
LatestReplier newLatestReplier) | ||
{ | ||
entityEntry.State = EntityState.Detached; | ||
thread.LatestReplier = newLatestReplier; | ||
}; | ||
Check failure on line 22 in c#/crawler/src/Tieba/Crawl/Saver/Related/ThreadLatestReplierSaver.cs GitHub Actions / runs-on (ubuntu-latest) / build (crawler)
Check failure on line 22 in c#/crawler/src/Tieba/Crawl/Saver/Related/ThreadLatestReplierSaver.cs GitHub Actions / runs-on (ubuntu-latest) / build (crawler)
Check failure on line 22 in c#/crawler/src/Tieba/Crawl/Saver/Related/ThreadLatestReplierSaver.cs GitHub Actions / runs-on (ubuntu-latest) / build (crawler)
Check failure on line 22 in c#/crawler/src/Tieba/Crawl/Saver/Related/ThreadLatestReplierSaver.cs GitHub Actions / runs-on (ubuntu-latest) / build (crawler)
Check failure on line 22 in c#/crawler/src/Tieba/Crawl/Saver/Related/ThreadLatestReplierSaver.cs GitHub Actions / runs-on (ubuntu-latest) / build (crawler)
Check failure on line 22 in c#/crawler/src/Tieba/Crawl/Saver/Related/ThreadLatestReplierSaver.cs GitHub Actions / runs-on (ubuntu-latest) / build (crawler)
Check failure on line 22 in c#/crawler/src/Tieba/Crawl/Saver/Related/ThreadLatestReplierSaver.cs GitHub Actions / runs-on (ubuntu-latest) / build (crawler)
Check failure on line 22 in c#/crawler/src/Tieba/Crawl/Saver/Related/ThreadLatestReplierSaver.cs GitHub Actions / runs-on (ubuntu-latest) / build (crawler)
Check failure on line 22 in c#/crawler/src/Tieba/Crawl/Saver/Related/ThreadLatestReplierSaver.cs GitHub Actions / runs-on (macos-latest) / build (crawler)
Check failure on line 22 in c#/crawler/src/Tieba/Crawl/Saver/Related/ThreadLatestReplierSaver.cs GitHub Actions / runs-on (macos-latest) / build (crawler)
Check failure on line 22 in c#/crawler/src/Tieba/Crawl/Saver/Related/ThreadLatestReplierSaver.cs GitHub Actions / runs-on (macos-latest) / build (crawler)
Check failure on line 22 in c#/crawler/src/Tieba/Crawl/Saver/Related/ThreadLatestReplierSaver.cs GitHub Actions / runs-on (macos-latest) / build (crawler)
Check failure on line 22 in c#/crawler/src/Tieba/Crawl/Saver/Related/ThreadLatestReplierSaver.cs GitHub Actions / runs-on (macos-latest) / build (crawler)
Check failure on line 22 in c#/crawler/src/Tieba/Crawl/Saver/Related/ThreadLatestReplierSaver.cs GitHub Actions / runs-on (macos-latest) / build (crawler)
Check failure on line 22 in c#/crawler/src/Tieba/Crawl/Saver/Related/ThreadLatestReplierSaver.cs GitHub Actions / runs-on (macos-latest) / build (crawler)
Check failure on line 22 in c#/crawler/src/Tieba/Crawl/Saver/Related/ThreadLatestReplierSaver.cs GitHub Actions / runs-on (macos-latest) / build (crawler)
Check warning on line 22 in c#/crawler/src/Tieba/Crawl/Saver/Related/ThreadLatestReplierSaver.cs GitHub Actions / runs-on (macos-latest) / ReSharper
Check warning on line 22 in c#/crawler/src/Tieba/Crawl/Saver/Related/ThreadLatestReplierSaver.cs GitHub Actions / runs-on (ubuntu-latest) / ReSharper
Check failure on line 22 in c#/crawler/src/Tieba/Crawl/Saver/Related/ThreadLatestReplierSaver.cs GitHub Actions / runs-on (windows-latest) / build (crawler)
Check failure on line 22 in c#/crawler/src/Tieba/Crawl/Saver/Related/ThreadLatestReplierSaver.cs GitHub Actions / runs-on (windows-latest) / build (crawler)
Check failure on line 22 in c#/crawler/src/Tieba/Crawl/Saver/Related/ThreadLatestReplierSaver.cs GitHub Actions / runs-on (windows-latest) / build (crawler)
Check failure on line 22 in c#/crawler/src/Tieba/Crawl/Saver/Related/ThreadLatestReplierSaver.cs GitHub Actions / runs-on (windows-latest) / build (crawler)
Check failure on line 22 in c#/crawler/src/Tieba/Crawl/Saver/Related/ThreadLatestReplierSaver.cs GitHub Actions / runs-on (windows-latest) / build (crawler)
Check failure on line 22 in c#/crawler/src/Tieba/Crawl/Saver/Related/ThreadLatestReplierSaver.cs GitHub Actions / runs-on (windows-latest) / build (crawler)
Check failure on line 22 in c#/crawler/src/Tieba/Crawl/Saver/Related/ThreadLatestReplierSaver.cs GitHub Actions / runs-on (windows-latest) / build (crawler)
Check failure on line 22 in c#/crawler/src/Tieba/Crawl/Saver/Related/ThreadLatestReplierSaver.cs GitHub Actions / runs-on (windows-latest) / build (crawler)
Check warning on line 22 in c#/crawler/src/Tieba/Crawl/Saver/Related/ThreadLatestReplierSaver.cs GitHub Actions / runs-on (windows-latest) / ReSharper
|
||
|
||
var threadsGroupByUniqueLatestReplier = threads | ||
.Where(th => th.LatestReplier != null) | ||
.Select(UniqueLatestReplier.FromThread).ToList(); | ||
.GroupBy(UniqueLatestReplier.FromThread).ToList(); | ||
threadsGroupByUniqueLatestReplier.ForEach(g => | ||
(from thread in g.Skip(1) | ||
join entityEntry in db.ChangeTracker.Entries<LatestReplier>() | ||
on thread.LatestReplier equals entityEntry.Entity | ||
select (thread, entityEntry)) | ||
.ForEach(t => DetachAndReplace(t.entityEntry, t.thread, g.First().LatestReplier!))); | ||
|
||
var uniqueLatestRepliers = threadsGroupByUniqueLatestReplier.Select(g => g.Key).ToList(); | ||
var existingLatestRepliers = db.LatestRepliers.AsNoTracking().FilterByItems( | ||
uniqueLatestRepliers, (latestReplier, uniqueLatestReplier) => | ||
latestReplier.Name == uniqueLatestReplier.Name | ||
&& latestReplier.DisplayName == uniqueLatestReplier.DisplayName) | ||
uniqueLatestRepliers, (latestReplier, uniqueLatestReplier) => | ||
latestReplier.Name == uniqueLatestReplier.Name | ||
&& latestReplier.DisplayName == uniqueLatestReplier.DisplayName) | ||
.ToList(); | ||
(from existing in existingLatestRepliers | ||
join thread in threads | ||
on UniqueLatestReplier.FromLatestReplier(existing) equals UniqueLatestReplier.FromThread(thread) | ||
select (existing, thread)) | ||
.ForEach(t => t.thread.LatestReplier = t.existing); | ||
join entityEntry in db.ChangeTracker.Entries<LatestReplier>() | ||
on thread.LatestReplier equals entityEntry.Entity // Object.ReferenceEquals() | ||
select (existing, thread, entityEntry)) | ||
.ForEach(t => DetachAndReplace(t.entityEntry, t.thread, t.existing)); | ||
|
||
_ = _saverLocks.Value.Acquire(uniqueLatestRepliers | ||
.Except(existingLatestRepliers.Select(UniqueLatestReplier.FromLatestReplier)) | ||
|