using System; using HaDocument.Interfaces; using System.Collections.Immutable; using System.Collections.Generic; using HaDocument.Models; using HaDocument.Comparers; using System.Linq; namespace HaDocument.Models { public class Library : ILibrary { public IHaDocumentOptions Options { get; } public ImmutableDictionary Traditions { get; } public ImmutableDictionary Persons { get; } public ImmutableDictionary Metas { get; } public ImmutableDictionary Marginals { get; } public ImmutableDictionary Locations { get; } public ImmutableDictionary Letters { get; } public ImmutableDictionary HandPersons { get; } public ImmutableDictionary Editreasons { get; } public ImmutableDictionary Comments { get; } public ImmutableDictionary> Backlinks { get; } public ImmutableDictionary> Hands { get; } // Structure for lookups from ZH: public ImmutableDictionary>> Structure { get; } // Lookups: // Auswählen von Kommentaren nach (1) Kategorie, (2) Anfangsbuchstaben vom Lemma. // So: _ = CommentsByCategoryLetter['neuzeit']['A'] public ImmutableDictionary> CommentsByCategoryLetter { get; } public Lookup CommentsByCategory { get; } // Auswählen von Subkommentaren nach ID public ImmutableDictionary SubCommentsByID { get; } // Auswählen von Marginalien nach Briefen public Lookup MarginalsByLetter { get; } // Ausw?hlen von Edits nach Briefen public Lookup EditreasonsByLetter { get; } // Auswählen von Briefen nach autoptischer Numemr und in zeitlich sortierter Reihenfolge. public ImmutableSortedSet MetasByDate { get; } // Auswählen von Briefen nach dem Jahr, sortiert nach Datum public ILookup MetasByYear { get; } public Library( Dictionary traditions, Dictionary persons, Dictionary meta, Dictionary marginals, Dictionary locations, Dictionary letters, Dictionary handPersons, Dictionary editReasons, Dictionary comments, Dictionary> backlinks, Dictionary> hands, Dictionary>> Structure, IHaDocumentOptions options ) { // Dictionaries Traditions = ImmutableDictionary.ToImmutableDictionary(traditions); Persons = ImmutableDictionary.ToImmutableDictionary(persons); Metas = ImmutableDictionary.ToImmutableDictionary(meta); Marginals = ImmutableDictionary.ToImmutableDictionary(marginals); Locations = ImmutableDictionary.ToImmutableDictionary(locations); Letters = ImmutableDictionary.ToImmutableDictionary(letters); HandPersons = ImmutableDictionary.ToImmutableDictionary(handPersons); Editreasons = ImmutableDictionary.ToImmutableDictionary(editReasons); Comments = ImmutableDictionary.ToImmutableDictionary(comments); var backbuilder = ImmutableDictionary.CreateBuilder>(); foreach (var entry in backlinks) backbuilder.Add(entry.Key, ImmutableList.ToImmutableList(entry.Value)); Backlinks = backbuilder.ToImmutableDictionary(); var handbuilder = ImmutableDictionary.CreateBuilder>(); foreach (var entry in hands) handbuilder.Add(entry.Key, ImmutableList.ToImmutableList(entry.Value)); Hands = handbuilder.ToImmutableDictionary(); // Lookups CommentsByCategory = (Lookup)Comments.Values.ToLookup(x => x.Type); var CommentsByLetter_builder = ImmutableDictionary.CreateBuilder>(); foreach (var ts in CommentsByCategory) { CommentsByLetter_builder.Add(ts.Key, (Lookup)ts.ToLookup(x => x.Index.Substring(0, 1).ToUpper())); } CommentsByCategoryLetter = CommentsByLetter_builder.ToImmutableDictionary(); MarginalsByLetter = (Lookup)Marginals.Values.ToLookup(x => x.Letter); EditreasonsByLetter = (Lookup)Editreasons.Values.ToLookup(x => x.Letter); MetasByDate = Metas.Values.ToImmutableSortedSet(new DefaultComparer()); MetasByYear = Metas.Values.ToLookup(x => x.Sort.Year.ToString()); var tempbuilder = ImmutableDictionary.CreateBuilder(); foreach (var comm in Comments) if (comm.Value.Kommentare != null) foreach (var subcomm in comm.Value.Kommentare) if (!tempbuilder.ContainsKey(subcomm.Key)) tempbuilder.Add(subcomm.Key, subcomm.Value); SubCommentsByID = tempbuilder.ToImmutableDictionary(); var tempstructurebuilder = ImmutableDictionary.CreateBuilder>>(); foreach (var volume in Structure) { if (volume.Value != null) { var tempvolbuilder = ImmutableDictionary.CreateBuilder>(); foreach (var page in volume.Value) { if (page.Value != null) { tempvolbuilder.Add(page.Key, page.Value.ToImmutableDictionary()); } } if (tempvolbuilder.Any()) { tempstructurebuilder.Add(volume.Key, tempvolbuilder.ToImmutableDictionary()); } } } this.Structure = tempstructurebuilder.ToImmutableDictionary(); Options = options; } // public List MetasByDate() { // var ret = Metas.OrderBy(x => x.Value, new DefaultComparer()).ToLookup(x => x.Value.Autopsic, x => x.Value); // ret.Sort(new DefaultComparer()); // return ret; // } public ImmutableList MetasByZH() { return Metas.Values.ToImmutableList().Sort(new Comparers.ZHComparer()); } public List PersonByAlphabet() { var ret = Persons.Values.ToList(); ret.Sort(new PersonComparer()); return ret; } } }