VerifyPersonContainersDisplayDirectoryAllFiles,
SaveOne,
SaveParents,
GetRelations,
CleanDisplayDirectoryAllFilesAndWriteTicksGed
This commit is contained in:
2023-07-30 22:53:56 -07:00
parent 9071784255
commit 1594783c7d
15 changed files with 312 additions and 384 deletions

View File

@ -11,6 +11,13 @@ internal abstract class GenealogicalDataCommunication
// ...
private record Record(Models.PersonContainer PersonContainer,
string PersonKeyFormatted,
string File,
string RelationPersonKeyFormatted,
string MergeWithLineTwo,
string? RelationFullName);
private static string[] GetHeaderLines(string startsWith, string[] sourceLines)
{
List<string> results = new();
@ -23,39 +30,6 @@ internal abstract class GenealogicalDataCommunication
return results.ToArray();
}
private static List<GenealogicalDataCommunicationRelation> GetRelations(string personBirthdayFormat, ReadOnlyDictionary<string, string> personKeyFormattedToPersonFullName, Dictionary<string, string> idToNick, List<string[]> familyGroupLines)
{
List<GenealogicalDataCommunicationRelation> results = new();
string? nick;
long? personKey;
string relation;
string? fullName;
string[] segments;
string[] familyLines;
Models.PersonBirthday? personBirthday;
for (int i = 0; i < familyGroupLines.Count; i++)
{
familyLines = familyGroupLines[i];
for (int j = 0; j < familyLines.Length; j++)
{
segments = familyLines[j].Split('@');
if (segments.First().Length < 3 || segments.Length != 3)
continue;
if (!idToNick.TryGetValue(segments[1], out nick))
continue;
relation = segments.First()[2..].Trim();
personBirthday = IPersonBirthday.GetPersonBirthday(personBirthdayFormat, nick);
personKey = personBirthday?.Value.Ticks;
fullName = personKeyFormattedToPersonFullName.GetValueOrDefault(nick);
if (j + 1 >= familyLines.Length || familyLines[j + 1].Length < 3 || familyLines[j + 1][..3] != "2 _")
results.Add(new(i, relation, segments[1], nick, personKey, fullName, null));
else
results.Add(new(i, relation, segments[1], nick, personKey, fullName, familyLines[j + 1][2..]));
}
}
return results;
}
private static ReadOnlyDictionary<string, string[]> Convert(Dictionary<string, List<string>> keyValuePairs)
{
Dictionary<string, string[]> results = new();
@ -64,8 +38,9 @@ internal abstract class GenealogicalDataCommunication
return new(results);
}
internal static (string[], ReadOnlyDictionary<string, string[]>, List<string[]>, string[], List<GenealogicalDataCommunicationRelation> genealogicalDataCommunicationRelations) GetIndividuals(string personBirthdayFormat, string genealogicalDataCommunicationFile, ReadOnlyCollection<Models.PersonContainer> personContainers, bool requireNickName)
internal static GenealogicalDataCommunicationCollections GetIndividuals(string genealogicalDataCommunicationFile, bool requireNickName)
{
GenealogicalDataCommunicationCollections result;
ReadOnlyDictionary<string, string[]> results;
string? nick;
string[] segments;
@ -75,7 +50,6 @@ internal abstract class GenealogicalDataCommunication
List<string[]> familyGroupLines = new();
Dictionary<string, string> idToNick = new();
Dictionary<string, List<string>> keyValuePairs = new();
ReadOnlyDictionary<string, string> personKeyFormattedToPersonFullName = IPersonContainer.GetPersonKeyFormattedToPersonFullName(personBirthdayFormat, personContainers);
string[] sourceLines = string.IsNullOrEmpty(genealogicalDataCommunicationFile) || !File.Exists(genealogicalDataCommunicationFile) ? Array.Empty<string>() : File.ReadAllLines(genealogicalDataCommunicationFile);
string[] headerLines = GetHeaderLines(startsWith, sourceLines);
for (int i = headerLines.Length; i < sourceLines.Length; i++)
@ -135,18 +109,18 @@ internal abstract class GenealogicalDataCommunication
throw new NotSupportedException();
}
results = Convert(keyValuePairs);
List<GenealogicalDataCommunicationRelation> genealogicalDataCommunicationRelations = GetRelations(personBirthdayFormat, personKeyFormattedToPersonFullName, idToNick, familyGroupLines);
return (headerLines, results, familyGroupLines, footerLines.ToArray(), genealogicalDataCommunicationRelations);
result = new(headerLines, results, familyGroupLines, new(idToNick), footerLines.ToArray());
return result;
}
internal static List<string> GetMappedLines(string personBirthdayFormat, string genealogicalDataCommunicationFile, ReadOnlyCollection<Models.PersonContainer> personContainers, bool requireNickName)
internal static List<string> GetMappedLines(string genealogicalDataCommunicationFile, bool requireNickName)
{
List<string> results = new();
Models.PersonBirthday personBirthday = new(DateTime.Now);
GenealogicalDataCommunicationLines genealogicalDataCommunicationLines;
(string[] headerLines, ReadOnlyDictionary<string, string[]> individuals, List<string[]> familyGroupLines, string[] footerLines, _) = GetIndividuals(personBirthdayFormat, genealogicalDataCommunicationFile, personContainers, requireNickName);
results.AddRange(headerLines);
foreach (KeyValuePair<string, string[]> keyValuePair in individuals)
GenealogicalDataCommunicationCollections genealogicalDataCommunicationCollections = GetIndividuals(genealogicalDataCommunicationFile, requireNickName);
results.AddRange(genealogicalDataCommunicationCollections.HeaderLines);
foreach (KeyValuePair<string, string[]> keyValuePair in genealogicalDataCommunicationCollections.Individuals)
{
genealogicalDataCommunicationLines = GetGenealogicalDataCommunicationLines(personBirthday, keyValuePair.Value);
if (!string.IsNullOrEmpty(genealogicalDataCommunicationLines.Id))
@ -167,9 +141,9 @@ internal abstract class GenealogicalDataCommunication
results.AddRange(genealogicalDataCommunicationLines.Death);
results.AddRange(genealogicalDataCommunicationLines.Changed);
}
for (int i = 0; i < familyGroupLines.Count; i++)
results.AddRange(familyGroupLines[i]);
results.AddRange(footerLines);
for (int i = 0; i < genealogicalDataCommunicationCollections.FamilyGroupLines.Count; i++)
results.AddRange(genealogicalDataCommunicationCollections.FamilyGroupLines[i]);
results.AddRange(genealogicalDataCommunicationCollections.FooterLines);
return results;
}
@ -301,94 +275,45 @@ internal abstract class GenealogicalDataCommunication
return result;
}
internal static bool CleanDisplayDirectoryAllFilesAndWriteTicksGed(string mappingDefaultName, string personBirthdayFormat, ReadOnlyCollection<Models.PersonContainer> personContainers, string[] headerLines, List<string[]> familyGroupLines, string[] footerLines, long ticks, string a2PeopleContentDirectory)
private static List<GenealogicalDataCommunicationRelation> GetRelations(string personBirthdayFormat, ReadOnlyCollection<Models.PersonContainer> personContainers, GenealogicalDataCommunicationCollections genealogicalDataCommunicationCollections)
{
bool result = false;
string directory;
string[] mdFiles;
string[] txtFiles;
const int zero = 0;
string[] jsonFiles;
string[] pGedFiles;
string personKeyFormatted;
List<string> lines = new();
List<long> distinct = new();
List<string> individualsLines;
DateTime dateTime = new(ticks);
Models.PersonBirthday personBirthday;
Calendar calendar = new CultureInfo("en-US").Calendar;
string weekOfYear = calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00");
lines.AddRange(headerLines);
foreach (Models.PersonContainer personContainer in personContainers)
List<GenealogicalDataCommunicationRelation> results = new();
string? nick;
long? personKey;
string relation;
string? fullName;
string[] segments;
string[] familyLines;
Models.PersonBirthday? personBirthday;
ReadOnlyDictionary<string, string> personKeyFormattedToPersonFullName = IPersonContainer.GetPersonKeyFormattedToPersonFullName(personBirthdayFormat, personContainers);
for (int i = 0; i < genealogicalDataCommunicationCollections.FamilyGroupLines.Count; i++)
{
if (personContainer.Key is null || personContainer.Birthdays is null || personContainer.Person is null || !personContainer.Birthdays.Any())
continue;
if (IPerson.IsDefaultName(mappingDefaultName, personContainer.DisplayDirectoryName) || IPerson.IsDefaultName(mappingDefaultName, personContainer.Person))
continue;
if (distinct.Contains(personContainer.Key.Value))
continue;
distinct.Add(personContainer.Key.Value);
personBirthday = personContainer.Birthdays[zero];
personKeyFormatted = IPersonBirthday.GetFormatted(personBirthdayFormat, personBirthday);
mdFiles = (from l in personContainer.DisplayDirectoryAllFiles where l.EndsWith(".md") select l).ToArray();
txtFiles = (from l in personContainer.DisplayDirectoryAllFiles where l.EndsWith(".txt") select l).ToArray();
jsonFiles = (from l in personContainer.DisplayDirectoryAllFiles where l.EndsWith(".json") select l).ToArray();
pGedFiles = (from l in personContainer.DisplayDirectoryAllFiles where l.EndsWith(".pged") select l).ToArray();
foreach (string mdFile in mdFiles)
familyLines = genealogicalDataCommunicationCollections.FamilyGroupLines[i];
for (int j = 0; j < familyLines.Length; j++)
{
if (string.IsNullOrEmpty(personKeyFormatted))
segments = familyLines[j].Split('@');
if (segments.First().Length < 3 || segments.Length != 3)
continue;
if (!mdFile.Contains(personKeyFormatted))
{
if (!result)
result = true;
File.Delete(mdFile);
}
}
foreach (string pGedFile in pGedFiles)
{
if (string.IsNullOrEmpty(personKeyFormatted))
if (!genealogicalDataCommunicationCollections.IdToNick.TryGetValue(segments[1], out nick))
continue;
if (!pGedFile.Contains(personKeyFormatted))
{
if (!result)
result = true;
File.Delete(pGedFile);
continue;
}
individualsLines = File.ReadAllLines(pGedFile).ToList();
foreach (string jsonFile in jsonFiles)
{
if (!result)
result = true;
File.Delete(jsonFile);
}
foreach (string txtFile in txtFiles)
{
if (new FileInfo(txtFile).Length == 0)
{
if (!result)
result = true;
File.Delete(txtFile);
}
}
lines.AddRange(individualsLines);
relation = segments.First()[2..].Trim();
personBirthday = IPersonBirthday.GetPersonBirthday(personBirthdayFormat, nick);
personKey = personBirthday?.Value.Ticks;
fullName = personKeyFormattedToPersonFullName.GetValueOrDefault(nick);
if (j + 1 >= familyLines.Length || familyLines[j + 1].Length < 3 || familyLines[j + 1][..3] != "2 _")
results.Add(new(i, relation, segments[1], nick, personKey, fullName, null));
else
results.Add(new(i, relation, segments[1], nick, personKey, fullName, familyLines[j + 1][2..]));
}
}
for (int i = 0; i < familyGroupLines.Count; i++)
lines.AddRange(familyGroupLines[i]);
lines.AddRange(footerLines);
directory = Path.Combine(a2PeopleContentDirectory, $"{dateTime.Year}-GenealogicalDataCommunication", $"{dateTime.Year}-Week-{weekOfYear}");
if (!Directory.Exists(directory))
_ = Directory.CreateDirectory(directory);
File.WriteAllLines(Path.Combine(directory, $"{ticks}.ged"), lines);
return result;
return results;
}
internal static ReadOnlyDictionary<int, List<GenealogicalDataCommunicationRelation>> GetFamilyIndexToCollection(List<GenealogicalDataCommunicationRelation> genealogicalDataCommunicationRelations)
internal static ReadOnlyDictionary<int, List<GenealogicalDataCommunicationRelation>> GetFamilyIndexToCollection(string personBirthdayFormat, ReadOnlyCollection<Models.PersonContainer> personContainers, GenealogicalDataCommunicationCollections genealogicalDataCommunicationCollections)
{
Dictionary<int, List<GenealogicalDataCommunicationRelation>> results = new();
List<GenealogicalDataCommunicationRelation>? relations;
List<GenealogicalDataCommunicationRelation> genealogicalDataCommunicationRelations = GetRelations(personBirthdayFormat, personContainers, genealogicalDataCommunicationCollections);
foreach (GenealogicalDataCommunicationRelation genealogicalDataCommunicationRelation in genealogicalDataCommunicationRelations)
{
if (!results.TryGetValue(genealogicalDataCommunicationRelation.FamilyIndex, out relations))
@ -551,7 +476,7 @@ internal abstract class GenealogicalDataCommunication
ReadOnlyDictionary<string, string> personKeyFormattedToPersonFullName = IPersonContainer.GetPersonKeyFormattedToPersonFullName(personBirthdayFormat, personContainers);
foreach (Models.PersonContainer personContainer in personContainers.OrderByDescending(l => l.Key))
{
if (personContainer.Key is null || personContainer.Birthdays is null || personContainer.Person is null || personContainer.PersonDirectory is null || !personContainer.Birthdays.Any())
if (personContainer.Key is null || personContainer.Birthdays is null || personContainer.Person is null || personContainer.PersonDirectory is null || personContainer.Birthdays.Length == 0)
continue;
male = personContainer.PersonDirectory.Sex == 'U' ? null : personContainer.PersonDirectory.Sex == 'M' || (personContainer.PersonDirectory.Sex == 'F' ? false : throw new Exception());
first = personContainer.PersonDirectory.First == 'U' ? null : personContainer.PersonDirectory.First == 'Y' || (personContainer.PersonDirectory.First == 'N' ? false : throw new Exception());

View File

@ -11,10 +11,10 @@ public interface IGenealogicalDataCommunication
const string Child = "CHIL";
const string Husband = "HUSB";
List<string> TestStatic_GetMappedLines(string personBirthdayFormat, string genealogicalDataCommunicationFile, ReadOnlyCollection<Models.PersonContainer> personContainers, bool requireNickName) =>
GetMappedLines(personBirthdayFormat, genealogicalDataCommunicationFile, personContainers, requireNickName);
static List<string> GetMappedLines(string personBirthdayFormat, string genealogicalDataCommunicationFile, ReadOnlyCollection<Models.PersonContainer> personContainers, bool requireNickName) =>
GenealogicalDataCommunication.GetMappedLines(personBirthdayFormat, genealogicalDataCommunicationFile, personContainers, requireNickName);
List<string> TestStatic_GetMappedLines(string genealogicalDataCommunicationFile, bool requireNickName) =>
GetMappedLines(genealogicalDataCommunicationFile, requireNickName);
static List<string> GetMappedLines(string genealogicalDataCommunicationFile, bool requireNickName) =>
GenealogicalDataCommunication.GetMappedLines(genealogicalDataCommunicationFile, requireNickName);
GenealogicalDataCommunicationLines TestStatic_GetGenealogicalDataCommunicationLines(Models.PersonBirthday personBirthday, string[] individualsLines) =>
GetGenealogicalDataCommunicationLines(individualsLines);
@ -26,15 +26,10 @@ public interface IGenealogicalDataCommunication
static Models.GenealogicalDataCommunication GetGenealogicalDataCommunication(bool first, GenealogicalDataCommunicationLines genealogicalDataCommunicationLines) =>
GenealogicalDataCommunication.GetGenealogicalDataCommunication(first, genealogicalDataCommunicationLines);
(string[], ReadOnlyDictionary<string, string[]>, List<string[]>, string[], List<GenealogicalDataCommunicationRelation> genealogicalDataCommunicationRelations) TestStatic_GetIndividuals(string personBirthdayFormat, string genealogicalDataCommunicationFile, ReadOnlyCollection<Models.PersonContainer> personContainers, bool requireNickName) =>
GetIndividuals(personBirthdayFormat, genealogicalDataCommunicationFile, personContainers, requireNickName);
static (string[], ReadOnlyDictionary<string, string[]>, List<string[]>, string[], List<GenealogicalDataCommunicationRelation> genealogicalDataCommunicationRelations) GetIndividuals(string personBirthdayFormat, string genealogicalDataCommunicationFile, ReadOnlyCollection<Models.PersonContainer> personContainers, bool requireNickName) =>
GenealogicalDataCommunication.GetIndividuals(personBirthdayFormat, genealogicalDataCommunicationFile, personContainers, requireNickName);
bool TestStatic_CleanDisplayDirectoryAllFilesAndWriteTicksGed(string mappingDefaultName, string personBirthdayFormat, ReadOnlyCollection<Models.PersonContainer> personContainers, string[] headerLines, List<string[]> familyGroupLines, string[] footerLines, long ticks, string a2PeopleContentDirectory) =>
CleanDisplayDirectoryAllFilesAndWriteTicksGed(mappingDefaultName, personBirthdayFormat, personContainers, headerLines, familyGroupLines, footerLines, ticks, a2PeopleContentDirectory);
static bool CleanDisplayDirectoryAllFilesAndWriteTicksGed(string mappingDefaultName, string personBirthdayFormat, ReadOnlyCollection<Models.PersonContainer> personContainers, string[] headerLines, List<string[]> familyGroupLines, string[] footerLines, long ticks, string a2PeopleContentDirectory) =>
GenealogicalDataCommunication.CleanDisplayDirectoryAllFilesAndWriteTicksGed(mappingDefaultName, personBirthdayFormat, personContainers, headerLines, familyGroupLines, footerLines, ticks, a2PeopleContentDirectory);
GenealogicalDataCommunicationCollections TestStatic_GetIndividuals(string genealogicalDataCommunicationFile, bool requireNickName) =>
GetIndividuals(genealogicalDataCommunicationFile, requireNickName);
static GenealogicalDataCommunicationCollections GetIndividuals(string genealogicalDataCommunicationFile, bool requireNickName) =>
GenealogicalDataCommunication.GetIndividuals(genealogicalDataCommunicationFile, requireNickName);
ReadOnlyDictionary<long, List<GenealogicalDataCommunicationRelation>> TestStatic_GetCollection(string personBirthdayFormat, List<GenealogicalDataCommunicationRelation> genealogicalDataCommunicationRelations) =>
GetCollection(personBirthdayFormat, genealogicalDataCommunicationRelations);
@ -46,10 +41,10 @@ public interface IGenealogicalDataCommunication
static ReadOnlyDictionary<long, List<GenealogicalDataCommunicationRelation>> GetCollection(string personBirthdayFormat, ReadOnlyDictionary<int, List<GenealogicalDataCommunicationRelation>> familyIndexToCollection) =>
GenealogicalDataCommunication.GetCollection(personBirthdayFormat, familyIndexToCollection);
ReadOnlyDictionary<int, List<GenealogicalDataCommunicationRelation>> TestStatic_GetFamilyIndexToCollection(List<GenealogicalDataCommunicationRelation> genealogicalDataCommunicationRelations) =>
GetFamilyIndexToCollection(genealogicalDataCommunicationRelations);
static ReadOnlyDictionary<int, List<GenealogicalDataCommunicationRelation>> GetFamilyIndexToCollection(List<GenealogicalDataCommunicationRelation> genealogicalDataCommunicationRelations) =>
GenealogicalDataCommunication.GetFamilyIndexToCollection(genealogicalDataCommunicationRelations);
ReadOnlyDictionary<int, List<GenealogicalDataCommunicationRelation>> TestStatic_GetFamilyIndexToCollection(string personBirthdayFormat, ReadOnlyCollection<Models.PersonContainer> personContainers, GenealogicalDataCommunicationCollections genealogicalDataCommunicationCollections) =>
GetFamilyIndexToCollection(personBirthdayFormat, personContainers, genealogicalDataCommunicationCollections);
static ReadOnlyDictionary<int, List<GenealogicalDataCommunicationRelation>> GetFamilyIndexToCollection(string personBirthdayFormat, ReadOnlyCollection<Models.PersonContainer> personContainers, GenealogicalDataCommunicationCollections genealogicalDataCommunicationCollections) =>
GenealogicalDataCommunication.GetFamilyIndexToCollection(personBirthdayFormat, personContainers, genealogicalDataCommunicationCollections);
string? TestStatic_GetMergeWithLineTwo(GenealogicalDataCommunicationRelation genealogicalDataCommunicationRelation, GenealogicalDataCommunicationRelation relation) =>
GetMergeWithLineTwo(genealogicalDataCommunicationRelation, relation);

View File

@ -10,6 +10,38 @@ public interface IPerson
static Models.PersonName GetPersonName(string name) =>
PersonName.GetPersonName(name);
static (char, char, char) GetPersonHour(string personDisplayDirectoryName, int hour) =>
hour == 0 ? new('U', 'U', 'U') :
hour == 1 ? new('U', 'U', 'U') :
hour == 2 ? new('U', 'U', 'U') :
hour == 3 ? new('A', 'U', 'Y') :
hour == 4 ? new('A', 'F', 'Y') :
hour == 5 ? new('A', 'M', 'Y') :
hour == 6 ? new('A', 'F', 'N') :
hour == 7 ? new('A', 'M', 'N') :
hour == 13 ? new('D', 'U', 'Y') :
hour == 14 ? new('D', 'F', 'Y') :
hour == 15 ? new('D', 'M', 'Y') :
hour == 16 ? new('D', 'F', 'N') :
hour == 17 ? new('D', 'M', 'N') :
throw new NotImplementedException(personDisplayDirectoryName);
static string GetHourGroup(string personDisplayDirectoryName, int hour) =>
hour == 0 ? "Unknown-Unknown-Unknown" :
hour == 1 ? "Unknown-Unknown-Unknown" :
hour == 2 ? "Unknown-Unknown-Unknown" :
hour == 3 ? "Alive-Unknown-Yes" :
hour == 4 ? "Alive-Female-Yes" :
hour == 5 ? "Alive-Male-Yes" :
hour == 6 ? "Alive-Female-No" :
hour == 7 ? "Alive-Male-No" :
hour == 13 ? "Dead-Unknown-Yes" :
hour == 14 ? "Dead-Female-Yes" :
hour == 15 ? "Dead-Male-Yes" :
hour == 16 ? "Dead-Female-No" :
hour == 17 ? "Dead-Male-No" :
throw new NotImplementedException(personDisplayDirectoryName);
bool TestStatic_IsDefaultName(string mappingDefaultName, string value) =>
IsDefaultName(mappingDefaultName, value);
static bool IsDefaultName(string mappingDefaultName, string value) =>

View File

@ -110,7 +110,6 @@ internal abstract class PersonBirthday
internal static List<(string, Models.PersonBirthday)> GetPersonBirthdays(string personBirthdayFormat, string[] personKeyDirectories, string personDisplayDirectory, string personDisplayDirectoryName)
{
List<(string, Models.PersonBirthday)> results = new();
string[] files;
string personKeyFormatted;
Models.PersonBirthday? personBirthday;
foreach (string personKeyDirectory in personKeyDirectories)
@ -124,9 +123,6 @@ internal abstract class PersonBirthday
continue;
if (!IPersonBirthday.IsCounterPersonBirthday(personBirthday) && ((!personKeyDirectory.Contains('#') && (personDisplayDirectoryName.Contains('~') || personDisplayDirectoryName.Contains('#'))) || (personKeyDirectory.Contains('#') && !personDisplayDirectoryName.Contains('#'))))
throw new NotSupportedException();
files = Directory.GetFiles(personKeyDirectory, "*", SearchOption.TopDirectoryOnly);
if (!files.Any())
continue;
results.Add(new(personKeyFormatted, personBirthday));
}
return results;

View File

@ -5,7 +5,7 @@ namespace View_by_Distance.Shared.Models.Stateless.Methods;
internal abstract class PersonContainer
{
private static string[] GetFiles(string personDisplayDirectory, bool isDefaultName)
private static List<string> GetFiles(string personDisplayDirectory, bool isDefaultName)
{
List<string> results = new();
string[] files;
@ -58,12 +58,12 @@ internal abstract class PersonContainer
results.Add(file);
}
}
return results.ToArray();
return results;
}
private static string[] GetFiles(string facesFileNameExtension, string personDisplayDirectory, bool isDefaultName)
private static List<string> GetFiles(string facesFileNameExtension, string personDisplayDirectory, bool isDefaultName)
{
string[] results;
List<string> results;
int? id;
string checkFile;
int? wholePercentages;
@ -96,11 +96,13 @@ internal abstract class PersonContainer
{
List<Models.PersonContainer> results = new();
long personKey;
string[] files;
const int zero = 0;
Models.Person person;
string personKeyDirectory;
Models.PersonContainer personContainer;
Models.PersonBirthday[] orderedPersonBirthdays;
string[] personDisplayDirectoryAllFiles = GetFiles(facesFileNameExtension, personDisplayDirectory, isDefaultName);
List<string> personDisplayDirectoryAllFiles = GetFiles(facesFileNameExtension, personDisplayDirectory, isDefaultName);
foreach ((string personKeyFormatted, Models.PersonBirthday personBirthday) in collection)
{
orderedPersonBirthdays = (from l in collection where !l.PersonKeyFormatted.Contains(numberSign) orderby l.PersonBirthday.Value.Ticks descending select l.PersonBirthday).ToArray();
@ -112,8 +114,13 @@ internal abstract class PersonContainer
continue;
personKey = orderedPersonBirthdays[zero].Value.Ticks;
}
person = IPerson.GetPerson(mappingDefaultName, personCharacters, personDisplayDirectoryName, personDisplayDirectoryAllFiles, personKey);
personContainer = new(approximateYears, orderedPersonBirthdays, personDisplayDirectoryAllFiles, personDisplayDirectoryName, personKey, person, personDirectory);
personKeyDirectory = Path.Combine(personDisplayDirectory, personKeyFormatted);
files = Directory.GetFiles(personKeyDirectory, "*", SearchOption.AllDirectories);
if (!files.Any())
continue;
personDisplayDirectoryAllFiles.AddRange(files.Where(l => l.EndsWith(".rel")));
person = IPerson.GetPerson(mappingDefaultName, personCharacters, personDisplayDirectoryName, personDisplayDirectoryAllFiles.ToArray(), personKey);
personContainer = new(approximateYears, orderedPersonBirthdays, personDisplayDirectoryAllFiles.ToArray(), personDisplayDirectoryName, personKey, person, personDirectory);
results.Add(personContainer);
}
return results;
@ -161,7 +168,7 @@ internal abstract class PersonContainer
string[] personKeyDirectories;
string? personDisplayDirectoryName;
Models.PersonContainer personContainer;
string[] personDisplayDirectoryAllFiles;
List<string> personDisplayDirectoryAllFiles;
List<Models.PersonContainer> personContainers;
List<(string, Models.PersonBirthday)> collection;
foreach (string personDisplayDirectory in personDisplayDirectories)
@ -182,7 +189,7 @@ internal abstract class PersonContainer
}
if (changes.Any(l => l is not null))
continue;
if (collection.Any())
if (collection.Count > 0)
{
personContainers = GetPersonContainersCollections(mappingDefaultName, facesFileNameExtension, personCharacters, personDirectory, numberSign, personDisplayDirectory, personDisplayDirectoryName, isDefaultName, approximateYears, collection);
results.AddRange(personContainers);
@ -190,7 +197,7 @@ internal abstract class PersonContainer
else
{
personDisplayDirectoryAllFiles = GetFiles(facesFileNameExtension, personDisplayDirectory, isDefaultName);
personContainer = new(approximateYears, personDisplayDirectoryAllFiles, personDisplayDirectoryName, personDirectory);
personContainer = new(approximateYears, personDisplayDirectoryAllFiles.ToArray(), personDisplayDirectoryName, personDirectory);
results.Add(personContainer);
}
}
@ -247,20 +254,22 @@ internal abstract class PersonContainer
private static List<Models.PersonContainer> GetPersonContainersGroups(string mappingDefaultName, string personBirthdayFormat, string facesFileNameExtension, char[] personCharacters, string[] groupDirectories)
{
List<Models.PersonContainer> results;
const int zero = 0;
List<string?> changes;
string groupDirectoryName;
List<string?> allChanges = new();
List<Models.PersonContainer> collection;
List<Models.PersonContainer> personContainers = new();
foreach (string groupDirectory in groupDirectories)
for (int i = 0; i < personCharacters.Length; i++)
{
groupDirectoryName = Path.GetFileName(groupDirectory);
if (!personCharacters.Contains(groupDirectoryName[zero]))
continue;
(changes, collection) = GetPersonContainersInnerGroups(mappingDefaultName, personBirthdayFormat, facesFileNameExtension, personCharacters, groupDirectory, groupDirectoryName);
allChanges.AddRange(changes);
personContainers.AddRange(collection);
foreach (string groupDirectory in groupDirectories)
{
groupDirectoryName = Path.GetFileName(groupDirectory);
if (personCharacters[i] != groupDirectoryName.First())
continue;
(changes, collection) = GetPersonContainersInnerGroups(mappingDefaultName, personBirthdayFormat, facesFileNameExtension, personCharacters, groupDirectory, groupDirectoryName);
allChanges.AddRange(changes);
personContainers.AddRange(collection);
}
}
if (allChanges.Any(l => l is not null))
throw new NotImplementedException($"A directory was changed restart to look for more! {string.Join(Environment.NewLine, (from l in allChanges where l is not null select l).ToArray())}");
@ -313,7 +322,7 @@ internal abstract class PersonContainer
long personKey;
foreach (Models.PersonContainer personContainer in personContainers)
{
if (personContainer.Person is null || personContainer.Key is null || personContainer.Birthdays is null || !personContainer.Birthdays.Any())
if (personContainer.Person is null || personContainer.Key is null || personContainer.Birthdays is null || personContainer.Birthdays.Length == 0)
continue;
foreach (Models.PersonBirthday personBirthday in personContainer.Birthdays)
{
@ -332,7 +341,7 @@ internal abstract class PersonContainer
string personKeyFormatted;
foreach (Models.PersonContainer personContainer in personContainers)
{
if (personContainer.Key is null || personContainer.Birthdays is null || personContainer.Person is null || personContainer.PersonDirectory is null || !personContainer.Birthdays.Any())
if (personContainer.Key is null || personContainer.Birthdays is null || personContainer.Person is null || personContainer.PersonDirectory is null || personContainer.Birthdays.Length == 0)
continue;
personKeyFormatted = IPersonBirthday.GetFormatted(personBirthdayFormat, personContainer.Key.Value);
personFullName = PersonName.GetFullName(personContainer.Person.Name);