From 931f33606dd131f5d139cc2ab6112e5a568bdb62 Mon Sep 17 00:00:00 2001 From: Mike Phares Date: Mon, 24 Apr 2023 17:12:50 -0700 Subject: [PATCH] PersonDirectory --- Map/Models/MapLogic.cs | 8 +- Map/Models/Stateless/MapLogic.cs | 4 +- Shared/Models/PersonContainer.cs | 26 +-- Shared/Models/PersonDirectory.cs | 14 ++ Shared/Models/Properties/IPersonContainer.cs | 3 +- .../Methods/GenealogicalDataCommunication.cs | 2 +- .../Stateless/Methods/PersonContainer.cs | 149 +++++++++--------- 7 files changed, 110 insertions(+), 96 deletions(-) create mode 100644 Shared/Models/PersonDirectory.cs diff --git a/Map/Models/MapLogic.cs b/Map/Models/MapLogic.cs index c026b3a..f29da65 100644 --- a/Map/Models/MapLogic.cs +++ b/Map/Models/MapLogic.cs @@ -834,7 +834,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic throw new NotSupportedException(); if (!_PersonKeyToPersonContainer.TryGetValue(personKey, out personContainer)) continue; - if (personContainer.Char is null || !_Configuration.PersonCharacters.Contains(personContainer.Char.Value)) + if (personContainer.PersonDirectory is null || !_Configuration.PersonCharacters.Contains(personContainer.PersonDirectory.Char)) continue; if (i == 1) { @@ -844,7 +844,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic } else if (i == 2) { - directory = Path.Combine(a2PeopleSingletonDirectory, personContainer.Char.Value.ToString(), personContainer.DisplayDirectoryName, personKeyToCount[personKey].ToString("0000")); + directory = Path.Combine(a2PeopleSingletonDirectory, personContainer.PersonDirectory.Char.ToString(), personContainer.DisplayDirectoryName, personKeyToCount[personKey].ToString("0000")); if (results.Contains(directory)) continue; results.Add(directory); @@ -917,13 +917,13 @@ public class MapLogic : Shared.Models.Methods.IMapLogic continue; if (!_PersonKeyToPersonContainer.TryGetValue(personKey, out personContainer)) continue; - if (personContainer.Char is null || !_Configuration.PersonCharacters.Contains(personContainer.Char.Value)) + if (personContainer.PersonDirectory is null || !_Configuration.PersonCharacters.Contains(personContainer.PersonDirectory.Char)) continue; if (personContainer.DisplayDirectoryAllFiles.Any(l => l.EndsWith(faceFileName))) continue; if (!File.Exists(faceFile)) continue; - directory = Path.Combine(a2PeopleSingletonDirectory, personContainer.Char.Value.ToString(), personContainer.DisplayDirectoryName); + directory = Path.Combine(a2PeopleSingletonDirectory, personContainer.PersonDirectory.Char.ToString(), personContainer.DisplayDirectoryName); if (!Directory.Exists(directory)) continue; fileName = Path.Combine(directory, faceFileName); diff --git a/Map/Models/Stateless/MapLogic.cs b/Map/Models/Stateless/MapLogic.cs index 9c399cb..1881545 100644 --- a/Map/Models/Stateless/MapLogic.cs +++ b/Map/Models/Stateless/MapLogic.cs @@ -32,7 +32,7 @@ internal abstract class MapLogic continue; personBirthday = IPersonBirthday.GetPersonBirthday(personKey); person = IPerson.GetPerson(configuration.MappingDefaultName, configuration.PersonCharacters.ToArray(), configuration.MappingDefaultName, personKey, personBirthday); - personContainer = new(approximateYears, person, new PersonBirthday[] { personBirthday }, personDisplayDirectoryAllFiles, configuration.MappingDefaultName, personKey); + personContainer = new(approximateYears, new PersonBirthday[] { personBirthday }, personDisplayDirectoryAllFiles, configuration.MappingDefaultName, personKey, person); results.Add(personContainer); } return results; @@ -511,7 +511,7 @@ internal abstract class MapLogic if (!personKeyToPersonContainerCollection.ContainsKey(personKey)) personContainer = new(approximateYears, personBirthday, displayDirectoryName, personKey); else - personContainer = new(approximateYears, personBirthday, personKeyToPersonContainerCollection[personKey][zero].Char, displayDirectoryName, personKey); + personContainer = new(approximateYears, personBirthday, personKeyToPersonContainerCollection[personKey][zero].PersonDirectory, displayDirectoryName, personKey); personKeyToPersonContainer.Add(personKey, personContainer); } } diff --git a/Shared/Models/PersonContainer.cs b/Shared/Models/PersonContainer.cs index 8758aa8..94da408 100644 --- a/Shared/Models/PersonContainer.cs +++ b/Shared/Models/PersonContainer.cs @@ -7,45 +7,45 @@ public class PersonContainer : Properties.IPersonContainer { public int? ApproximateYears { init; get; } - public Person? Person { init; get; } public PersonBirthday[]? Birthdays { init; get; } public string[] DisplayDirectoryAllFiles { init; get; } public string DisplayDirectoryName { init; get; } public long? Key { init; get; } public bool? KeyIsMaxBirthday { init; get; } - public char? Char { init; get; } + public Person? Person { init; get; } + public PersonDirectory? PersonDirectory { init; get; } [JsonConstructor] - public PersonContainer(int? approximateYears, char? @char, Person? person, PersonBirthday[]? birthdays, string[] displayDirectoryAllFiles, string displayDirectoryName, long? key) + public PersonContainer(int? approximateYears, PersonBirthday[]? birthdays, string[] displayDirectoryAllFiles, string displayDirectoryName, long? key, Person? person, PersonDirectory? personDirectory) { ApproximateYears = approximateYears; - Char = @char; - Person = person; Birthdays = birthdays; DisplayDirectoryAllFiles = displayDirectoryAllFiles; DisplayDirectoryName = displayDirectoryName; Key = key; + Person = person; + PersonDirectory = personDirectory; KeyIsMaxBirthday = birthdays is null || key is null ? null : key.Value == birthdays.First().Value.Ticks; } public PersonContainer(string mappingDefaultName, char[] personCharacters, PersonBirthday birthday, string displayDirectoryName) : - this(Stateless.Methods.IAge.GetApproximateYears(personCharacters, displayDirectoryName), null, Stateless.Methods.IPerson.GetPerson(mappingDefaultName, personCharacters, displayDirectoryName, birthday.Value.Ticks, birthday), new PersonBirthday[] { birthday }, Array.Empty(), displayDirectoryName, birthday.Value.Ticks) + this(Stateless.Methods.IAge.GetApproximateYears(personCharacters, displayDirectoryName), new PersonBirthday[] { birthday }, Array.Empty(), displayDirectoryName, birthday.Value.Ticks, Stateless.Methods.IPerson.GetPerson(mappingDefaultName, personCharacters, displayDirectoryName, birthday.Value.Ticks, birthday), null) { } public PersonContainer(int? approximateYears, PersonBirthday birthdays, string displayDirectoryName, long key) : - this(approximateYears, null, null, new PersonBirthday[] { birthdays }, Array.Empty(), displayDirectoryName, key) + this(approximateYears, new PersonBirthday[] { birthdays }, Array.Empty(), displayDirectoryName, key, null, null) { } - public PersonContainer(int? approximateYears, PersonBirthday birthdays, char? @char, string displayDirectoryName, long key) : - this(approximateYears, @char, null, new PersonBirthday[] { birthdays }, Array.Empty(), displayDirectoryName, key) + public PersonContainer(int? approximateYears, PersonBirthday birthdays, PersonDirectory? personDirectory, string displayDirectoryName, long key) : + this(approximateYears, new PersonBirthday[] { birthdays }, Array.Empty(), displayDirectoryName, key, null, personDirectory) { } - public PersonContainer(int? approximateYears, char @char, string[] displayDirectoryAllFiles, string displayDirectoryName) : - this(approximateYears, @char, null, null, displayDirectoryAllFiles, displayDirectoryName, null) + public PersonContainer(int? approximateYears, string[] displayDirectoryAllFiles, string displayDirectoryName, PersonDirectory? personDirectory) : + this(approximateYears, null, displayDirectoryAllFiles, displayDirectoryName, null, null, personDirectory) { } - public PersonContainer(int? approximateYears, Person? person, PersonBirthday[]? birthdays, string[] displayDirectoryAllFiles, string displayDirectoryName, long? key) : - this(approximateYears, null, person, birthdays, displayDirectoryAllFiles, displayDirectoryName, key) + public PersonContainer(int? approximateYears, PersonBirthday[]? birthdays, string[] displayDirectoryAllFiles, string displayDirectoryName, long? key, Person? person) : + this(approximateYears, birthdays, displayDirectoryAllFiles, displayDirectoryName, key, person, null) { } public override string ToString() diff --git a/Shared/Models/PersonDirectory.cs b/Shared/Models/PersonDirectory.cs new file mode 100644 index 0000000..849b7e5 --- /dev/null +++ b/Shared/Models/PersonDirectory.cs @@ -0,0 +1,14 @@ +using System.Text.Json; + +namespace View_by_Distance.Shared.Models; + +public record PersonDirectory(char Char, string Name, char Status, char Sex, char First) +{ + + public override string ToString() + { + string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true }); + return result; + } + +} \ No newline at end of file diff --git a/Shared/Models/Properties/IPersonContainer.cs b/Shared/Models/Properties/IPersonContainer.cs index 9548163..b90183d 100644 --- a/Shared/Models/Properties/IPersonContainer.cs +++ b/Shared/Models/Properties/IPersonContainer.cs @@ -4,11 +4,12 @@ public interface IPersonContainer { public int? ApproximateYears { init; get; } - public Person? Person { init; get; } public PersonBirthday[]? Birthdays { init; get; } public string[] DisplayDirectoryAllFiles { init; get; } public string DisplayDirectoryName { init; get; } public long? Key { init; get; } public bool? KeyIsMaxBirthday { init; get; } + public Person? Person { init; get; } + public PersonDirectory? PersonDirectory { init; get; } } \ No newline at end of file diff --git a/Shared/Models/Stateless/Methods/GenealogicalDataCommunication.cs b/Shared/Models/Stateless/Methods/GenealogicalDataCommunication.cs index f050bfc..a600f22 100644 --- a/Shared/Models/Stateless/Methods/GenealogicalDataCommunication.cs +++ b/Shared/Models/Stateless/Methods/GenealogicalDataCommunication.cs @@ -251,7 +251,7 @@ internal abstract class GenealogicalDataCommunication birth = birth.Value.AddHours(hours); if (age < 1) birth = null; - if (death is null && (!alive || (age > 110 && !IPersonBirthday.IsCounterPersonBirthday(new(birth.Value))))) + if (birth is not null && death is null && (!alive || (age > 110 && !IPersonBirthday.IsCounterPersonBirthday(new(birth.Value))))) death = birth; } death ??= !genealogicalDataCommunicationLines.Death.Any(l => l == "1 DEAT Y") ? null : birth; diff --git a/Shared/Models/Stateless/Methods/PersonContainer.cs b/Shared/Models/Stateless/Methods/PersonContainer.cs index d05286d..5c9c4d7 100644 --- a/Shared/Models/Stateless/Methods/PersonContainer.cs +++ b/Shared/Models/Stateless/Methods/PersonContainer.cs @@ -90,27 +90,14 @@ internal abstract class PersonContainer return results; } - private static List GetPersonContainersCollections(string mappingDefaultName, string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, Dictionary> individuals, char @char, string innerGroupDirectory, char numberSign, string personDisplayDirectory, string personDisplayDirectoryName, bool isDefaultName, int? approximateYears, List<(string PersonKeyFormatted, Models.PersonBirthday PersonBirthday)> collection) + private static List GetPersonContainersCollections(string mappingDefaultName, string facesFileNameExtension, char[] personCharacters, PersonDirectory personDirectory, char numberSign, string personDisplayDirectory, string personDisplayDirectoryName, bool isDefaultName, int? approximateYears, List<(string PersonKeyFormatted, Models.PersonBirthday PersonBirthday)> collection) { List results = new(); - char sex; - bool first; - bool? male; - bool? alive; long personKey; - string[] matches; - string? directory; - string[] segments; - bool verify = true; const int zero = 0; Models.Person person; - string innerGroupDirectoryName; - const char exclamationPoint = '!'; - List? individualsLines = null; Models.PersonContainer personContainer; Models.PersonBirthday[] orderedPersonBirthdays; - Models.GenealogicalDataCommunication genealogicalDataCommunication; - GenealogicalDataCommunicationLines? genealogicalDataCommunicationLines; string[] personDisplayDirectoryAllFiles = GetFiles(facesFileNameExtension, personDisplayDirectory, isDefaultName); foreach ((string personKeyFormatted, Models.PersonBirthday personBirthday) in collection) { @@ -124,64 +111,8 @@ internal abstract class PersonContainer personKey = orderedPersonBirthdays[zero].Value.Ticks; } person = IPerson.GetPerson(mappingDefaultName, personCharacters, personDisplayDirectoryName, personDisplayDirectoryAllFiles, personKey); - personContainer = new(approximateYears, @char, person, orderedPersonBirthdays, personDisplayDirectoryAllFiles, personDisplayDirectoryName, personKey); + personContainer = new(approximateYears, orderedPersonBirthdays, personDisplayDirectoryAllFiles, personDisplayDirectoryName, personKey, person, personDirectory); results.Add(personContainer); - if (personKeyFormatted != IPersonBirthday.GetFormatted(personBirthdayFormat, personKey)) - continue; - _ = individuals.TryGetValue(personKeyFormatted, out individualsLines); - isDefaultName = IPerson.IsDefaultName(mappingDefaultName, personDisplayDirectoryName); - matches = (from l in personDisplayDirectoryAllFiles where l.Contains(personKeyFormatted) select l).ToArray(); - if (!matches.Any()) - continue; - directory = Path.GetDirectoryName(matches[zero]); - if (directory is null) - continue; - if (@char == exclamationPoint) - (sex, alive, male, first) = ('U', null, null, true); - else - { - innerGroupDirectoryName = Path.GetFileName(innerGroupDirectory); - segments = innerGroupDirectoryName.Split('-'); - if (segments.Length != 3) - continue; - alive = segments[zero] switch - { - "Alive" => true, - "Dead" => false, - "Unknown" => null, - _ => throw new NotImplementedException() - }; - sex = segments[1] switch - { - "Male" => 'M', - "Female" => 'F', - "Unknown" => 'U', - _ => throw new NotImplementedException() - }; - male = segments[1] switch - { - "Male" => true, - "Female" => false, - "Unknown" => null, - _ => throw new NotImplementedException() - }; - first = segments[2] switch - { - "Yes" => true, - "No" => false, - "Unknown" => true, - _ => throw new NotImplementedException() - }; - } - if (alive is null) - continue; - genealogicalDataCommunicationLines = individualsLines is null ? null : GenealogicalDataCommunication.GetGenealogicalDataCommunicationLines(personBirthday, individualsLines); - if (genealogicalDataCommunicationLines is null) - continue; - genealogicalDataCommunication = GenealogicalDataCommunication.GetGenealogicalDataCommunication(genealogicalDataCommunicationLines); - if (genealogicalDataCommunication.Sex != sex) - continue; - GenealogicalDataCommunication.WriteFile(personKeyFormatted, person.Name, individualsLines, isDefaultName, directory, genealogicalDataCommunication, verify, first); } return results; } @@ -217,7 +148,48 @@ internal abstract class PersonContainer return result; } - private static List GetPersonContainersGroup(string mappingDefaultName, string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, Dictionary> individuals, char @char, string innerGroupDirectory, string[] personDisplayDirectories) + private static void MaybeGenealogicalDataCommunicationWriteFile(string mappingDefaultName, string personBirthdayFormat, Dictionary> individuals, PersonDirectory personDirectory, string personDisplayDirectoryName, bool isDefaultName, List personContainers) + { + bool? first; + bool? male; + string[] matches; + string? directory; + bool verify = true; + const int zero = 0; + string personKeyFormatted; + List? individualsLines = null; + Models.GenealogicalDataCommunication genealogicalDataCommunication; + GenealogicalDataCommunicationLines? genealogicalDataCommunicationLines; + foreach (Models.PersonContainer personContainer in personContainers) + { + if (personContainer.Key is null || personContainer.Birthdays is null || personContainer.Person is null || !personContainer.Birthdays.Any()) + continue; + male = personDirectory.Sex == 'U' ? null : personDirectory.Sex == 'M' || (personDirectory.Sex == 'F' ? false : throw new Exception()); + first = personDirectory.First == 'U' ? null : personDirectory.First == 'Y' || (personDirectory.First == 'N' ? false : throw new Exception()); + if (first is null) + continue; + isDefaultName = IPerson.IsDefaultName(mappingDefaultName, personDisplayDirectoryName); + personKeyFormatted = IPersonBirthday.GetFormatted(personBirthdayFormat, personContainer.Key.Value); + _ = individuals.TryGetValue(personKeyFormatted, out individualsLines); + matches = (from l in personContainer.DisplayDirectoryAllFiles where l.Contains(personKeyFormatted) select l).ToArray(); + if (!matches.Any()) + continue; + directory = Path.GetDirectoryName(matches[zero]); + if (directory is null) + continue; + genealogicalDataCommunicationLines = individualsLines is null ? null : GenealogicalDataCommunication.GetGenealogicalDataCommunicationLines(personContainer.Birthdays[0], individualsLines); + if (genealogicalDataCommunicationLines is null) + continue; + genealogicalDataCommunication = GenealogicalDataCommunication.GetGenealogicalDataCommunication(genealogicalDataCommunicationLines); + if (genealogicalDataCommunication.Sex != personDirectory.Sex) + continue; + if (genealogicalDataCommunication.Death is null && personDirectory.Status == 'D' || genealogicalDataCommunication.Death is not null && personDirectory.Status == 'A') + continue; + GenealogicalDataCommunication.WriteFile(personKeyFormatted, personContainer.Person.Name, individualsLines, isDefaultName, directory, genealogicalDataCommunication, verify, first.Value); + } + } + + private static List GetPersonContainersGroup(string mappingDefaultName, string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, Dictionary> individuals, PersonDirectory personDirectory, string[] personDisplayDirectories) { List results = new(); string? minusOne; @@ -229,6 +201,7 @@ internal abstract class PersonContainer string? personDisplayDirectoryName; Models.PersonContainer personContainer; string[] personDisplayDirectoryAllFiles; + List personContainers; List<(string, Models.PersonBirthday)> collection; foreach (string personDisplayDirectory in personDisplayDirectories) { @@ -249,11 +222,15 @@ internal abstract class PersonContainer if (changes.Any(l => l is not null)) continue; if (collection.Any()) - results.AddRange(GetPersonContainersCollections(mappingDefaultName, personBirthdayFormat, facesFileNameExtension, personCharacters, individuals, @char, innerGroupDirectory, numberSign, personDisplayDirectory, personDisplayDirectoryName, isDefaultName, approximateYears, collection)); + { + personContainers = GetPersonContainersCollections(mappingDefaultName, facesFileNameExtension, personCharacters, personDirectory, numberSign, personDisplayDirectory, personDisplayDirectoryName, isDefaultName, approximateYears, collection); + MaybeGenealogicalDataCommunicationWriteFile(mappingDefaultName, personBirthdayFormat, individuals, personDirectory, personDisplayDirectoryName, isDefaultName, personContainers); + results.AddRange(personContainers); + } else { personDisplayDirectoryAllFiles = GetFiles(facesFileNameExtension, personDisplayDirectory, isDefaultName); - personContainer = new(approximateYears, @char, personDisplayDirectoryAllFiles, personDisplayDirectoryName); + personContainer = new(approximateYears, personDisplayDirectoryAllFiles, personDisplayDirectoryName, personDirectory); results.Add(personContainer); } } @@ -265,14 +242,36 @@ internal abstract class PersonContainer private static List GetPersonContainersInnerGroups(string mappingDefaultName, string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, Dictionary> individuals, string groupDirectory, string groupDirectoryName) { List results = new(); + char @char; + string[] segments; const int zero = 0; + string innerGroupDirectoryName; + PersonDirectory personDirectory; string[] personDisplayDirectories; + const char exclamationPoint = '!'; List collection; string[] innerGroupDirectories = Directory.GetDirectories(groupDirectory, "*", SearchOption.TopDirectoryOnly); foreach (string innerGroupDirectory in innerGroupDirectories) { + @char = groupDirectoryName[zero]; + innerGroupDirectoryName = Path.GetFileName(innerGroupDirectory); + if (@char == exclamationPoint) + personDirectory = new(@char, innerGroupDirectoryName, 'U', 'U', 'U'); + else + { + segments = innerGroupDirectoryName.Split('-'); + if (segments.Length != 3) + continue; + if (segments[zero] is not "Alive" and not "Dead" and not "Unknown") + continue; + if (segments[1] is not "Male" and not "Female" and not "Unknown") + continue; + if (segments[2] is not "Yes" and not "No" and not "Unknown") + continue; + personDirectory = new(@char, innerGroupDirectoryName, segments[zero][zero], segments[1][zero], segments[2][zero]); + } personDisplayDirectories = Directory.GetDirectories(innerGroupDirectory, "*", SearchOption.TopDirectoryOnly); - collection = GetPersonContainersGroup(mappingDefaultName, personBirthdayFormat, facesFileNameExtension, personCharacters, individuals, groupDirectoryName[zero], innerGroupDirectory, personDisplayDirectories); + collection = GetPersonContainersGroup(mappingDefaultName, personBirthdayFormat, facesFileNameExtension, personCharacters, individuals, personDirectory, personDisplayDirectories); results.AddRange(collection); } return results;