summaryrefslogtreecommitdiff
path: root/Services/SearchService.cs
diff options
context:
space:
mode:
authorJake Mannens <jake@asger.xyz>2023-09-01 13:03:57 +1000
committerJake Mannens <jake@asger.xyz>2025-08-20 00:48:44 +1000
commitb286a0b0f1fcdb511d2dbb8886039cfb0182c89b (patch)
tree83d8d8ec7a575c36f22bfab01fa2708881c3f086 /Services/SearchService.cs
parent5b93706343484914370a87fddea29874c8156321 (diff)
Merged OCR functionality
Diffstat (limited to 'Services/SearchService.cs')
-rw-r--r--Services/SearchService.cs60
1 files changed, 52 insertions, 8 deletions
diff --git a/Services/SearchService.cs b/Services/SearchService.cs
index e8e497d..bb2963d 100644
--- a/Services/SearchService.cs
+++ b/Services/SearchService.cs
@@ -24,33 +24,77 @@ public class SearchService : ISearchService {
query = query.ToLower();
+ int[] descriptionResults = SearchDescription(query);
+ int[] ocrResults = SearchOcr(query);
+
var matchedTag = db.TagDefinitions
.FirstOrDefault(td => td.Name.ToLower() == query);
int[] tags;
-
if(matchedTag is not null) {
tags = tagService
.TagsThatImply(matchedTag)
.Select(td => td.ObjectId)
.ToArray();
} else {
- // TODO: expand scope to all tags that imply
+ // TODO: Expand scope to all tags that imply
tags = db.TagDefinitions
.Where(td => td.Name.ToLower().Contains(query))
.Select(td => td.ObjectId)
.ToArray();
}
+ int[] tagResults = SearchTags(tags);
+
+ int[] mediaIds = descriptionResults
+ .Union(ocrResults)
+ .Union(tagResults)
+ .OrderDescending()
+ .ToArray();
+
return db.Media
.Include(m => m.Tags)
- .AsEnumerable()
- .Where(m => m.Tags.IntersectBy(tags, t => t.TagDefinitionId).Any())
- .Concat(db.Media
+ .Where(m => mediaIds.Contains(m.ObjectId))
+ .ToArray();
+ }
+
+ // TODO: Make asynchronous
+ private int[] SearchTags(int[] tags) {
+ return Task.Run(() => {
+ using var db = dbFactory.CreateDbContext();
+ return db.Media
+ .Include(m => m.Tags)
+ .AsEnumerable()
+ .Where(m => m.Tags.IntersectBy(tags, t => t.TagDefinitionId).Any())
+ .Select(m => m.ObjectId)
+ .ToArray();
+ }).GetAwaiter().GetResult();
+ }
+
+ // TODO: Make asynchronous
+ private int[] SearchDescription(string query) {
+ return Task.Run(() => {
+ using var db = dbFactory.CreateDbContext();
+ query = query.ToLower();
+ return db.Media
.Where(m =>
(m.ShortDescription != null && m.ShortDescription.ToLower().Contains(query)) ||
- (m.LongDescription != null && m.LongDescription.ToLower().Contains(query))))
- .DistinctBy(m => m.ObjectId)
- .ToArray();
+ (m.LongDescription != null && m.LongDescription.ToLower().Contains(query)))
+ .Select(m => m.ObjectId)
+ .ToArray();
+ }).GetAwaiter().GetResult();
+ }
+
+ // TODO: Make asynchronous
+ private int[] SearchOcr(string query) {
+ return Task.Run(() => {
+ using var db = dbFactory.CreateDbContext();
+ query = query.ToLower();
+ return db.OcrData
+ .Include(o => o.Media)
+ .Where(o => o.SearchableText.Contains(query))
+ .Select(o => o.Media.ObjectId)
+ .ToArray();
+ }).GetAwaiter().GetResult();
}
}