mirror of
https://github.com/Theodor-Springmann-Stiftung/hamann-ausgabe-core.git
synced 2025-10-29 09:15:33 +00:00
Implemented Fulltext search across tags and linebreaks for letters
This commit is contained in:
@@ -4,16 +4,19 @@ using HaWeb.Models;
|
||||
using HaWeb.FileHelpers;
|
||||
using HaDocument.Interfaces;
|
||||
using HaDocument.Models;
|
||||
using HaXMLReader.Interfaces;
|
||||
using System.Collections.Specialized;
|
||||
|
||||
namespace HaWeb.Controllers;
|
||||
|
||||
public class SucheController : Controller {
|
||||
private IHaDocumentWrappper _lib;
|
||||
private IReaderService _readerService;
|
||||
private int _lettersForPage;
|
||||
|
||||
public SucheController(IHaDocumentWrappper lib, IConfiguration config) {
|
||||
public SucheController(IHaDocumentWrappper lib, IReaderService readerService, IConfiguration config) {
|
||||
_lib = lib;
|
||||
_readerService = readerService;
|
||||
_lettersForPage = config.GetValue<int>("LettersOnPage");
|
||||
}
|
||||
|
||||
@@ -48,21 +51,45 @@ public class SucheController : Controller {
|
||||
[Route("Suche")]
|
||||
// Order of actions:
|
||||
// Filter, sort by year, paginate, sort by Meta.Sort & .Order, parse
|
||||
public IActionResult Index(string? person, int page = 0) {
|
||||
public IActionResult Index(string? search, int page = 0) {
|
||||
var lib = _lib.GetLibrary();
|
||||
List<IGrouping<int, Meta>>? metasbyyear = null;
|
||||
if (person != null) {
|
||||
var letters = lib.Metas
|
||||
.Where(x => x.Value.Senders.Contains(person) || x.Value.Receivers.Contains(person))
|
||||
.Select(x => x.Value);
|
||||
if (letters == null) return _error404();
|
||||
metasbyyear = letters.ToLookup(x => x.Sort.Year).OrderBy(x => x.Key).ToList();
|
||||
} else {
|
||||
metasbyyear = lib.MetasByYear.OrderBy(x => x.Key).ToList();
|
||||
if (search != null) {
|
||||
var sw = new System.Diagnostics.Stopwatch();
|
||||
sw.Start();
|
||||
var res = _lib.SearchLetters(search, _readerService);
|
||||
if (res == null || !res.Any()) return _error404();
|
||||
var ret = res.ToDictionary(
|
||||
x => x.Index,
|
||||
x => x.Results
|
||||
.Select(y => new SearchResult(search, x.Index) { Page = y.Page, Line = y.Line, Preview = y.Preview})
|
||||
.ToList()
|
||||
);
|
||||
var keys = res.Select(x => x.Index).Where(x => lib.Metas.ContainsKey(x)).Select(x => lib.Metas[x]);
|
||||
var letters = keys.ToLookup(x => x.Sort.Year).OrderBy(x => x.Key).ToList();
|
||||
sw.Stop();
|
||||
Console.WriteLine(sw.ElapsedMilliseconds);
|
||||
return _paginateSend(lib, page, letters, null, null, null, search, ret);
|
||||
|
||||
}
|
||||
metasbyyear = lib.MetasByYear.OrderBy(x => x.Key).ToList();
|
||||
return _paginateSend(lib, page, metasbyyear);
|
||||
}
|
||||
|
||||
[Route("Suche/Person/{person}")]
|
||||
public IActionResult Person(string person, int page = 0) {
|
||||
if (String.IsNullOrWhiteSpace(person)) return _error404();
|
||||
var lib = _lib.GetLibrary();
|
||||
List<IGrouping<int, Meta>>? metasbyyear = null;
|
||||
var letters = lib.Metas
|
||||
.Where(x => x.Value.Senders.Contains(person) || x.Value.Receivers.Contains(person))
|
||||
.Select(x => x.Value);
|
||||
if (letters == null) return _error404();
|
||||
metasbyyear = letters.ToLookup(x => x.Sort.Year).OrderBy(x => x.Key).ToList();
|
||||
return _paginateSend(lib, page, metasbyyear, person);
|
||||
}
|
||||
|
||||
|
||||
private List<(string Key, string Person)> _getAvailablePersons(ILibrary lib) {
|
||||
return lib.Persons
|
||||
.OrderBy(x => x.Value.Surname)
|
||||
@@ -106,7 +133,15 @@ public class SucheController : Controller {
|
||||
return res;
|
||||
}
|
||||
|
||||
private IActionResult _paginateSend(ILibrary lib, int page, List<IGrouping<int, Meta>>? metasbyyear, string? person = null, string? zhvolume = null, string? zhpage = null) {
|
||||
private IActionResult _paginateSend(
|
||||
ILibrary lib,
|
||||
int page,
|
||||
List<IGrouping<int, Meta>> metasbyyear,
|
||||
string? person = null,
|
||||
string? zhvolume = null,
|
||||
string? zhpage = null,
|
||||
string? activeSearch = null,
|
||||
Dictionary<string, List<SearchResult>>? searchResults = null) {
|
||||
var pages = _paginate(metasbyyear);
|
||||
if (pages != null && page >= pages.Count) return _error404();
|
||||
if (pages == null && page > 0) return _error404();
|
||||
@@ -123,7 +158,7 @@ public class SucheController : Controller {
|
||||
List<(string Volume, List<string> Pages)>? availablePages = null;
|
||||
availablePages = lib.Structure.Select(x => (x.Key, x.Value.Select(x => x.Key).ToList())).ToList();
|
||||
zhvolume = zhvolume == null ? "1" : zhvolume;
|
||||
var model = new SucheViewModel(letters, page, pages, _getAvailablePersons(lib), availablePages.OrderBy(x => x.Volume).ToList(), zhvolume, zhpage);
|
||||
var model = new SucheViewModel(letters, page, pages, _getAvailablePersons(lib), availablePages.OrderBy(x => x.Volume).ToList(), zhvolume, zhpage, activeSearch, searchResults);
|
||||
if (person != null) model.ActivePerson = person;
|
||||
return View("Index", model);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user