diff --git a/c#/crawler/src/Db/CrawlerDbContext.cs b/c#/crawler/src/Db/CrawlerDbContext.cs index 9d64fbe1..4942f0ce 100644 --- a/c#/crawler/src/Db/CrawlerDbContext.cs +++ b/c#/crawler/src/Db/CrawlerDbContext.cs @@ -80,27 +80,27 @@ protected override void OnModelCreating(ModelBuilder b) _ = new RevisionWithSplitting .ModelBuilder(b, "tbmcr_thread", e => new {e.Tid, e.TakenAt, e.DuplicateIndex}) .HasBaseTable() - .SplitToTable("viewCount"); + .HasSplitTable("viewCount"); _ = new RevisionWithSplitting .ModelBuilder(b, "tbmcr_reply", e => new {e.Pid, e.TakenAt, e.DuplicateIndex}) .HasBaseTable() - .SplitToTable("agreeCount") - .SplitToTable("subReplyCount") - .SplitToTable("floor"); + .HasSplitTable("agreeCount") + .HasSplitTable("subReplyCount") + .HasSplitTable("floor"); _ = new RevisionWithSplitting .ModelBuilder(b, "tbmcr_subReply", e => new {e.Spid, e.TakenAt, e.DuplicateIndex}) .HasBaseTable() - .SplitToTable("agreeCount") - .SplitToTable("disagreeCount"); + .HasSplitTable("agreeCount") + .HasSplitTable("disagreeCount"); _ = new RevisionWithSplitting .ModelBuilder(b, "tbmcr_user", e => new {e.Uid, e.TakenAt, e.DuplicateIndex}) .HasBaseTable() - .SplitToTable("ipGeolocation") - .SplitToTable("portraitUpdatedAt") - .SplitToTable("displayName"); + .HasSplitTable("ipGeolocation") + .HasSplitTable("portraitUpdatedAt") + .HasSplitTable("displayName"); b.Entity().Property(e => e.DisplayName).HasConversion(); b.Entity().Property(e => e.DisplayName).HasConversion(); diff --git a/c#/crawler/src/Db/Revision/Splitting/RevisionWithSplitting.cs b/c#/crawler/src/Db/Revision/Splitting/RevisionWithSplitting.cs index 158553f4..315447e9 100644 --- a/c#/crawler/src/Db/Revision/Splitting/RevisionWithSplitting.cs +++ b/c#/crawler/src/Db/Revision/Splitting/RevisionWithSplitting.cs @@ -36,7 +36,7 @@ public ModelBuilder HasBaseTable() where TRevision : TBaseRevision return this; } - public ModelBuilder SplitToTable(string tableNameSuffix) + public ModelBuilder HasSplitTable(string tableNameSuffix) where TRevisionWithSplitting : RevisionWithSplitting { var visitor = new ReplaceParameterTypeVisitor(); diff --git a/c#/crawler/src/Tieba/Crawl/Saver/Post/PostSaver.cs b/c#/crawler/src/Tieba/Crawl/Saver/Post/PostSaver.cs index 1e4d59d2..39c72a8e 100644 --- a/c#/crawler/src/Tieba/Crawl/Saver/Post/PostSaver.cs +++ b/c#/crawler/src/Tieba/Crawl/Saver/Post/PostSaver.cs @@ -29,7 +29,7 @@ protected SaverChangeSet Save( Func postIdSelector, Func revisionFactory, ExpressionStarter existingPostPredicate) - where TRevision : BaseRevisionWithSplitting + where TRevision : TBaseRevision { var existingPostsKeyById = db.Set().AsTracking() .Where(existingPostPredicate).ToDictionary(postIdSelector); diff --git a/c#/crawler/src/Tieba/Crawl/Saver/Post/ReplySaver.cs b/c#/crawler/src/Tieba/Crawl/Saver/Post/ReplySaver.cs index 0e1e636d..64898e08 100644 --- a/c#/crawler/src/Tieba/Crawl/Saver/Post/ReplySaver.cs +++ b/c#/crawler/src/Tieba/Crawl/Saver/Post/ReplySaver.cs @@ -17,9 +17,9 @@ protected override Lazy> AddSplitRevisionsDelegatesKeyByEntityType => _addSplitRevisionsDelegatesKeyByEntityType ??= new(() => new() { - {typeof(ReplyRevision.SplitFloor), AddSplitRevisions}, - {typeof(ReplyRevision.SplitSubReplyCount), AddSplitRevisions}, - {typeof(ReplyRevision.SplitAgreeCount), AddSplitRevisions} + {typeof(ReplyRevision.SplitFloor), AddRevisionsWithDuplicateIndex}, + {typeof(ReplyRevision.SplitSubReplyCount), AddRevisionsWithDuplicateIndex}, + {typeof(ReplyRevision.SplitAgreeCount), AddRevisionsWithDuplicateIndex} }); public override bool UserFieldUpdateIgnorance(string propName, object? oldValue, object? newValue) => propName switch diff --git a/c#/crawler/src/Tieba/Crawl/Saver/Post/SubReplySaver.cs b/c#/crawler/src/Tieba/Crawl/Saver/Post/SubReplySaver.cs index ad237e9b..9cb59fb3 100644 --- a/c#/crawler/src/Tieba/Crawl/Saver/Post/SubReplySaver.cs +++ b/c#/crawler/src/Tieba/Crawl/Saver/Post/SubReplySaver.cs @@ -15,8 +15,8 @@ protected override Lazy> AddSplitRevisionsDelegatesKeyByEntityType => _addSplitRevisionsDelegatesKeyByEntityType ??= new(() => new() { - {typeof(SubReplyRevision.SplitAgreeCount), AddSplitRevisions}, - {typeof(SubReplyRevision.SplitDisagreeCount), AddSplitRevisions}, + {typeof(SubReplyRevision.SplitAgreeCount), AddRevisionsWithDuplicateIndex}, + {typeof(SubReplyRevision.SplitDisagreeCount), AddRevisionsWithDuplicateIndex}, }); public override bool UserFieldUpdateIgnorance diff --git a/c#/crawler/src/Tieba/Crawl/Saver/Post/ThreadSaver.cs b/c#/crawler/src/Tieba/Crawl/Saver/Post/ThreadSaver.cs index c6773cb6..4079b26e 100644 --- a/c#/crawler/src/Tieba/Crawl/Saver/Post/ThreadSaver.cs +++ b/c#/crawler/src/Tieba/Crawl/Saver/Post/ThreadSaver.cs @@ -17,7 +17,7 @@ protected override Lazy> AddSplitRevisionsDelegatesKeyByEntityType => _addSplitRevisionsDelegatesKeyByEntityType ??= new(() => new() { - {typeof(ThreadRevision.SplitViewCount), AddSplitRevisions} + {typeof(ThreadRevision.SplitViewCount), AddRevisionsWithDuplicateIndex} }); public override bool UserFieldUpdateIgnorance diff --git a/c#/crawler/src/Tieba/Crawl/Saver/SaverWithRevision.cs b/c#/crawler/src/Tieba/Crawl/Saver/SaverWithRevision.cs index 2086010b..d517d29d 100644 --- a/c#/crawler/src/Tieba/Crawl/Saver/SaverWithRevision.cs +++ b/c#/crawler/src/Tieba/Crawl/Saver/SaverWithRevision.cs @@ -11,7 +11,7 @@ public abstract partial class SaverWithRevision( protected abstract Lazy> AddSplitRevisionsDelegatesKeyByEntityType { get; } - protected void AddSplitRevisions(CrawlerDbContext db, IEnumerable revisions) + protected void AddRevisionsWithDuplicateIndex(CrawlerDbContext db, IEnumerable revisions) where TRevision : TBaseRevision { var newRevisions = revisions.OfType().ToList(); @@ -20,7 +20,7 @@ protected void AddSplitRevisions(CrawlerDbContext db, IEnumerable(), (predicate, newRevision) => predicate.Or(LinqKit.PredicateBuilder @@ -62,7 +62,7 @@ protected void SaveEntitiesWithRevision( UserSaver.FieldChangeIgnorance? userFieldUpdateIgnorance = null, UserSaver.FieldChangeIgnorance? userFieldRevisionIgnorance = null) where TEntity : RowVersionedEntity - where TRevision : BaseRevisionWithSplitting + where TRevision : class, TBaseRevision { db.Set().AddRange(isExistingEntityLookup[false]); // newly added var newRevisions = isExistingEntityLookup[true].Select(newEntity => @@ -147,7 +147,7 @@ bool IsTimestampingFieldName(string name) => name is nameof(BasePost.LastSeenAt) }).OfType().ToList(); if (newRevisions.Count == 0) return; // quick exit to prevent execute sql with WHERE FALSE clause - db.Set().AddRange( + AddRevisionsWithDuplicateIndex(db, newRevisions.Where(rev => !rev.IsAllFieldsIsNullExceptSplit())); newRevisions.OfType>() .SelectMany(rev => rev.SplitEntities) diff --git a/c#/crawler/src/Tieba/Crawl/Saver/UserSaver.cs b/c#/crawler/src/Tieba/Crawl/Saver/UserSaver.cs index 0b48c5cb..cf8b3f1f 100644 --- a/c#/crawler/src/Tieba/Crawl/Saver/UserSaver.cs +++ b/c#/crawler/src/Tieba/Crawl/Saver/UserSaver.cs @@ -9,9 +9,9 @@ protected override Lazy> AddSplitRevisionsDelegatesKeyByEntityType => _addSplitRevisionsDelegatesKeyByEntityType ??= new(() => new() { - {typeof(UserRevision.SplitDisplayName), AddSplitRevisions}, - {typeof(UserRevision.SplitPortraitUpdatedAt), AddSplitRevisions}, - {typeof(UserRevision.SplitIpGeolocation), AddSplitRevisions} + {typeof(UserRevision.SplitDisplayName), AddRevisionsWithDuplicateIndex}, + {typeof(UserRevision.SplitPortraitUpdatedAt), AddRevisionsWithDuplicateIndex}, + {typeof(UserRevision.SplitIpGeolocation), AddRevisionsWithDuplicateIndex} }); protected override Uid RevisionEntityIdSelector(BaseUserRevision entity) => entity.Uid;