summaryrefslogtreecommitdiff
path: root/Services
diff options
context:
space:
mode:
authorJake Mannens <jake@asger.xyz>2023-08-24 14:23:34 +1000
committerJake Mannens <jake@asger.xyz>2025-08-19 23:33:18 +1000
commit9a99c6859c2e740e1b6afe3c8c1020343a848197 (patch)
treef1525538a4b0f89eca4d463deeea53743eedc98d /Services
parente861c6731ac3c7ebb8fcf565e28669e0341f5265 (diff)
Removed EFCore lazy-loading proxies
Diffstat (limited to 'Services')
-rw-r--r--Services/MediaService.cs15
-rw-r--r--Services/TagService.cs117
2 files changed, 101 insertions, 31 deletions
diff --git a/Services/MediaService.cs b/Services/MediaService.cs
index a7049e1..2f84b27 100644
--- a/Services/MediaService.cs
+++ b/Services/MediaService.cs
@@ -19,14 +19,19 @@ public class MediaService : IMediaService {
public void SetIngest(Media media, bool ingest) {
using var db = dbFactory.CreateDbContext();
- media = db.Media.First(m => m.Guid == media.Guid);
+ media = db.Media
+ .Include(m => m.Tags)
+ .ThenInclude(t => t.TagDefinition)
+ .First(m => m.Guid == media.Guid);
var ingestTag = db.TagDefinitions
.First(td => td.Guid == HBContext.IngestTag);
- if(ingest)
- media.Tags.Add(new(ingestTag));
- else
- media.Tags.RemoveAll(t => t.TagDefinition.Guid == ingestTag.Guid);
+ if(ingest) {
+ if(!media.Tags.Select(t => t.TagDefinition.Guid).Contains(HBContext.IngestTag))
+ media.Tags.Add(new(ingestTag));
+ } else {
+ media.Tags.RemoveAll(t => t.TagDefinition.Guid == HBContext.IngestTag);
+ }
db.SaveChanges();
}
diff --git a/Services/TagService.cs b/Services/TagService.cs
index 860103b..a0fd19e 100644
--- a/Services/TagService.cs
+++ b/Services/TagService.cs
@@ -26,6 +26,8 @@ public interface ITagService {
public (TagDefinition tagDefinition, bool isImplicit)[] GetAllTags(Guid obj);
public (TagDefinition tagDefinition, bool isImplicit)[] GetAllTags(HBObject obj);
public (TagDefinition tagDefinition, bool isImplicit)[] GetAllTags(TagDefinition tagDef);
+ public TagDefinition[] TagsThatImply(Guid tagDef);
+ public TagDefinition[] TagsThatImply(TagDefinition tagDef);
}
public class TagService : ITagService {
@@ -40,6 +42,8 @@ public class TagService : ITagService {
var tag = db.TagDefinitions.First(td => td.Guid == tagDef);
db.Objects
+ .Include(o => o.Tags)
+ .ThenInclude(t => t.TagDefinition)
.Where(o => !o.Tags.Select(t => t.TagDefinition.Guid).Contains(tagDef))
.FirstOrDefault(o => o.Guid == obj)?
.Tags
@@ -54,7 +58,11 @@ public class TagService : ITagService {
public void RemoveTag(Guid obj, Guid tagDef) {
using var db = dbFactory.CreateDbContext();
- db.Objects.First(o => o.Guid == obj).Tags
+ db.Objects
+ .Include(o => o.Tags)
+ .ThenInclude(t => t.TagDefinition)
+ .First(o => o.Guid == obj)
+ .Tags
.RemoveAll(t => t.TagDefinition.Guid == tagDef);
db.SaveChanges();
@@ -67,7 +75,9 @@ public class TagService : ITagService {
using var db = dbFactory.CreateDbContext();
using var transaction = db.Database.BeginTransaction();
- var tag = db.TagDefinitions.First(td => td.Guid == tagDef);
+ var tag = db.TagDefinitions
+ .Include(td => td.ImplicitTags)
+ .First(td => td.Guid == tagDef);
tag.ImplicitTags.RemoveAll(td => !implicitTagDefs.Contains(td.Guid));
tag.ImplicitTags.AddRange(
@@ -87,7 +97,9 @@ public class TagService : ITagService {
public void AddImplicitTag(Guid tagDef, Guid implicitTagDef) {
using var db = dbFactory.CreateDbContext();
- var tag = db.TagDefinitions.First(td => td.Guid == tagDef);
+ var tag = db.TagDefinitions
+ .Include(td => td.ImplicitTags)
+ .First(td => td.Guid == tagDef);
var implicitTag = db.TagDefinitions.First(td => td.Guid == implicitTagDef);
tag.ImplicitTags.Add(implicitTag);
@@ -100,7 +112,9 @@ public class TagService : ITagService {
public void RemoveImplicitTag(Guid tagDef, Guid implicitTagDef) {
using var db = dbFactory.CreateDbContext();
- var tag = db.TagDefinitions.First(td => td.Guid == tagDef);
+ var tag = db.TagDefinitions
+ .Include(td => td.ImplicitTags)
+ .First(td => td.Guid == tagDef);
tag.ImplicitTags.RemoveAll(td => td.Guid == implicitTagDef);
db.SaveChanges();
@@ -130,7 +144,9 @@ public class TagService : ITagService {
using var transaction = db.Database.BeginTransaction();
db.Tags.RemoveRange(
- db.Tags.Where(t => t.TagDefinition.Guid == tagDef));
+ db.Tags
+ .Include(t => t.TagDefinition)
+ .Where(t => t.TagDefinition.Guid == tagDef));
db.TagDefinitions.Remove(tag);
db.SaveChanges();
@@ -156,48 +172,97 @@ public class TagService : ITagService {
public void UpdateTagDefinition(TagDefinition tagDef, string name, string? @namespace) =>
UpdateTagDefinition(tagDef.Guid, name, @namespace);
- public (TagDefinition tagDefinition, bool isImplicit)[] GetAllTags(Guid obj) {
+ private (TagDefinition tagDefinition, bool isImplicit)[] GetAllTags(IEnumerable<TagDefinition> tagDefs) {
using var db = dbFactory.CreateDbContext();
- var @object = db.Objects.First(o => o.Guid == obj);
- var guids = @object.Tags.Select(t => t.TagDefinition.Guid);
+ var tagGuids = tagDefs
+ .Select(td => td.Guid)
+ .ToArray();
+
+ // Query all tag definitions
+ var allTags = db.TagDefinitions
+ .Include(td => td.ImplicitTags)
+ .ToArray();
+
+ var tags = new List<TagDefinition>(
+ allTags.IntersectBy(
+ tagGuids,
+ td => td.Guid));
+
+ while(true) {
+ var toAdd = tags
+ .SelectMany(td => td.ImplicitTags)
+ .ExceptBy(tags.Select(td => td.Guid), td => td.Guid)
+ .ToArray();
+
+ if(toAdd.Count() == 0)
+ break;
+
+ tags.AddRange(toAdd);
+ }
+
+ return tags
+ .Select(td => new ValueTuple<TagDefinition, bool>(td, !tagGuids.Contains(td.Guid)))
+ .ToArray();
+ }
+
+ public (TagDefinition tagDefinition, bool isImplicit)[] GetAllTags(Guid obj) {
+ using var db = dbFactory.CreateDbContext();
- return GetTagRecursive(@object.Tags.Select(t => t.TagDefinition))
- .Select(td => new ValueTuple<TagDefinition, bool>(td, !guids.Contains(td.Guid)))
+ // Query a list of tag GUIDs for this object
+ var tags = db.Objects
+ .Include(o => o.Tags)
+ .ThenInclude(t => t.TagDefinition)
+ .First(o => o.Guid == obj)
+ .Tags
+ .Select(t => t.TagDefinition)
.ToArray();
+
+ return GetAllTags(tags);
}
+
public (TagDefinition tagDefinition, bool isImplicit)[] GetAllTags(HBObject obj) =>
GetAllTags(obj.Guid);
public (TagDefinition tagDefinition, bool isImplicit)[] GetAllTags(TagDefinition tagDef) {
using var db = dbFactory.CreateDbContext();
- var tag = db.TagDefinitions.First(td => td.Guid == tagDef.Guid);
-
- return GetTagRecursive(tag.ImplicitTags)
- .Select(td => new ValueTuple<TagDefinition, bool>(td, !tag.ImplicitTags.Select(it => it.Guid).Contains(td.Guid)))
+ var tags = db.TagDefinitions
+ .Include(td => td.ImplicitTags)
+ .First(td => td.Guid == tagDef.Guid)
+ .ImplicitTags
.ToArray();
+
+ return GetAllTags(tags);
}
- private List<TagDefinition> GetTagRecursive(IEnumerable<TagDefinition> tagDefs) {
- var tags = new List<TagDefinition>(tagDefs);
+ public TagDefinition[] TagsThatImply(Guid tagDef) {
+ using var db = dbFactory.CreateDbContext();
- List<TagDefinition>? toProcessNext = null;
+ var tagDefs = db.TagDefinitions
+ .Include(td => td.ImplicitTags)
+ .ToArray();
- while(true) {
- toProcessNext = (toProcessNext ?? tags)
- .SelectMany(td => td.ImplicitTags)
- .Where(td => !tags.Select(td => td.Guid).Contains(td.Guid))
- .DistinctBy(td => td.Guid)
- .ToList();
+ var tags = new List<TagDefinition>() {
+ db.TagDefinitions.First(td => td.Guid == tagDef)
+ };
- tags.AddRange(toProcessNext);
+ while(true) {
+ var toAdd = tagDefs
+ .Where(td => td.ImplicitTags.Select(it => it.Guid).Intersect(tags.Select(td => td.Guid)).Any())
+ .ExceptBy(tags.Select(td => td.Guid), td => td.Guid)
+ .ToArray();
- if(toProcessNext.Count() == 0)
+ if(toAdd.Count() == 0)
break;
+
+ tags.AddRange(toAdd);
}
- return tags;
+ return tags.ToArray();
}
+
+ public TagDefinition[] TagsThatImply(TagDefinition tagDef) =>
+ TagsThatImply(tagDef.Guid);
}