LookForAbandoned

This commit is contained in:
2023-04-25 20:29:26 -07:00
parent 931f33606d
commit 272ed90c56
14 changed files with 321 additions and 138 deletions

View File

@ -16,6 +16,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
protected readonly ReadOnlyDictionary<int, List<int>> _SkipCollection;
protected readonly ReadOnlyDictionary<int, List<int>> _SkipNotSkipCollection;
protected readonly ReadOnlyDictionary<long, PersonContainer> _PersonKeyToPersonContainer;
protected readonly List<LocationContainer<MetadataExtractor.Directory>> _LocationContainers;
protected readonly ReadOnlyDictionary<int, Dictionary<int, PersonContainer[]>> _IdThenNormalizedRectangleToPersonContainers;
public Dictionary<int, int[]> KeyValuePairs => throw new NotImplementedException();
@ -27,7 +28,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
private readonly string _EDistanceContentTicksDirectory;
private readonly Shared.Models.Properties.IPropertyConfiguration _PropertyConfiguration;
public MapLogic(int maxDegreeOfParallelism, Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration? configuration, PersonContainer[] personContainers, long ticks, string a2PeopleSingletonDirectory, string eDistanceContentDirectory, Dictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers)
public MapLogic(int maxDegreeOfParallelism, Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration? configuration, ReadOnlyCollection<PersonContainer> personContainers, long ticks, string a2PeopleSingletonDirectory, string eDistanceContentDirectory)
{
_Ticks = ticks;
_Configuration = configuration;
@ -35,8 +36,6 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
_PropertyConfiguration = propertyConfiguration;
if (_Log is null)
{ }
if (idToLocationContainers is null)
throw new NullReferenceException(nameof(idToLocationContainers));
if (propertyConfiguration.VerifyToSeason is null || !propertyConfiguration.VerifyToSeason.Any())
throw new NullReferenceException(nameof(propertyConfiguration.VerifyToSeason));
string json;
@ -46,30 +45,29 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
List<PersonContainer> notMappedPersonContainers = new();
Dictionary<int, List<int>> skipNotSkipCollection = new();
Dictionary<long, PersonContainer> personKeyToPersonContainer = new();
List<LocationContainer<MetadataExtractor.Directory>> locationContainers = new();
string? rootDirectoryParent = Path.GetDirectoryName(propertyConfiguration.RootDirectory);
string eDistanceContentTicksDirectory = Path.Combine(eDistanceContentDirectory, $"({ticks})");
Dictionary<int, Dictionary<int, PersonContainer[]>> idThenNormalizedRectangleToPersonContainers = new();
Dictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers = new();
if (string.IsNullOrEmpty(rootDirectoryParent))
throw new NullReferenceException(nameof(rootDirectoryParent));
if (!Directory.Exists(eDistanceContentDirectory))
_ = Directory.CreateDirectory(eDistanceContentDirectory);
if (configuration is not null)
{
List<PersonContainer> personContainerCollection = new(personContainers);
Stateless.MapLogic.Set(maxDegreeOfParallelism,
configuration,
ticks,
personContainerCollection,
personContainers,
a2PeopleSingletonDirectory,
eDistanceContentDirectory,
personKeyToPersonContainer,
notMappedPersonContainers,
skipCollection,
skipNotSkipCollection,
idToLocationContainers,
locationContainers,
idThenNormalizedRectangleToPersonContainers);
if (personContainerCollection.Count == personContainers.Length)
throw new NotSupportedException();
}
foreach (string propertyContentCollectionFile in propertyConfiguration.PropertyContentCollectionFiles)
{
@ -84,6 +82,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
throw new NullReferenceException(nameof(collection));
}
_SkipCollection = new(skipCollection);
_LocationContainers = locationContainers;
_SkipNotSkipCollection = new(skipNotSkipCollection);
_PersonKeyToPersonContainer = new(personKeyToPersonContainer);
_EDistanceContentTicksDirectory = eDistanceContentTicksDirectory;
@ -97,6 +96,19 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
return result;
}
public ReadOnlyDictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> GetIdToLocationContainers()
{
Dictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> results = new();
foreach (LocationContainer<MetadataExtractor.Directory> locationContainer in _LocationContainers)
{
if (!results.ContainsKey(locationContainer.Id))
results.Add(locationContainer.Id, new());
results[locationContainer.Id].Add(locationContainer);
}
_LocationContainers.Clear();
return new(results);
}
public Dictionary<long, List<int>> GetPersonKeyToIds()
{
Dictionary<long, List<int>> results = new();
@ -972,7 +984,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
return new(personKeyFormatted, personBirthday);
}
private List<string> GetPersonKeyFormattedCollection(string[] jLinks, string a2PeopleContentDirectory, PersonContainer[] personContainers, Dictionary<long, List<int>> personKeyToIds)
private List<string> GetPersonKeyFormattedCollection(string[] jLinks, string a2PeopleContentDirectory, List<PersonContainer> personContainers, Dictionary<long, List<int>> personKeyToIds)
{
if (_Configuration is null)
throw new NullReferenceException(nameof(_Configuration));
@ -1030,7 +1042,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
return results;
}
private (int, FileHolder, int, string, string, string, string)[] GetCollectionForSaveFilteredOriginalImagesFromJLinks(string[] jLinks, string a2PeopleContentDirectory, PersonContainer[] personContainers, Mapping[] mappingCollection, Dictionary<long, List<int>> personKeyToIds)
private (int, FileHolder, int, string, string, string, string)[] GetCollectionForSaveFilteredOriginalImagesFromJLinks(string[] jLinks, string a2PeopleContentDirectory, List<PersonContainer> personContainers, Mapping[] mappingCollection, Dictionary<long, List<int>> personKeyToIds)
{
if (_Configuration is null)
throw new NullReferenceException(nameof(_Configuration));
@ -1091,7 +1103,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
return results;
}
public void SaveFilteredOriginalImagesFromJLinks(string[] jLinks, PersonContainer[] personContainers, string a2PeopleContentDirectory, Dictionary<long, List<int>> personKeyToIds, Mapping[] mappingCollection, int totalNotMapped)
public void SaveFilteredOriginalImagesFromJLinks(string[] jLinks, List<PersonContainer> personContainers, string a2PeopleContentDirectory, Dictionary<long, List<int>> personKeyToIds, Mapping[] mappingCollection, int totalNotMapped)
{
if (_Configuration is null)
throw new NullReferenceException(nameof(_Configuration));
@ -1110,7 +1122,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
SaveContainers(saveIndividually, totalNotMapped, null, saveContainers);
}
private List<SaveShortcutsForOutputResolutions> GetCollectionForSaveShortcutsForOutputResolutionsPreMapLogic(string eDistanceContentDirectory, Dictionary<long, List<int>> personKeyToIds, Dictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers, Mapping[] mappingCollection)
private List<SaveShortcutsForOutputResolutions> GetCollectionForSaveShortcutsForOutputResolutionsPreMapLogic(string eDistanceContentDirectory, Dictionary<long, List<int>> personKeyToIds, ReadOnlyDictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers, Mapping[] mappingCollection)
{
List<SaveShortcutsForOutputResolutions> results = new();
if (_Configuration is null)
@ -1166,7 +1178,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
return results;
}
public void SaveShortcutsForOutputResolutionsPreMapLogic(string eDistanceContentDirectory, Dictionary<long, List<int>> personKeyToIds, Dictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers, Mapping[] mappingCollection)
public void SaveShortcutsForOutputResolutionsPreMapLogic(string eDistanceContentDirectory, Dictionary<long, List<int>> personKeyToIds, ReadOnlyDictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers, Mapping[] mappingCollection)
{
string hiddenFile;
WindowsShortcut windowsShortcut;

View File

@ -1,5 +1,6 @@
using Humanizer;
using ShellProgressBar;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Drawing;
using System.Text.Json;
@ -12,36 +13,9 @@ namespace View_by_Distance.Map.Models.Stateless;
internal abstract class MapLogic
{
private static List<PersonContainer> GetNonSpecificPeopleCollection(Configuration configuration, long ticks, List<long> personKeys)
{
List<PersonContainer> results = new();
Person person;
long personKey;
int? approximateYears = null;
PersonBirthday personBirthday;
PersonContainer personContainer;
string[] personDisplayDirectoryAllFiles = Array.Empty<string>();
DateTime incrementDate = new(configuration.PersonBirthdayFirstYear, 1, 1);
for (int i = 0; i < int.MaxValue; i++)
{
personKey = incrementDate.Ticks;
incrementDate = incrementDate.AddDays(1);
if (incrementDate.Ticks > ticks)
break;
if (personKeys.Contains(personKey))
continue;
personBirthday = IPersonBirthday.GetPersonBirthday(personKey);
person = IPerson.GetPerson(configuration.MappingDefaultName, configuration.PersonCharacters.ToArray(), configuration.MappingDefaultName, personKey, personBirthday);
personContainer = new(approximateYears, new PersonBirthday[] { personBirthday }, personDisplayDirectoryAllFiles, configuration.MappingDefaultName, personKey, person);
results.Add(personContainer);
}
return results;
}
private static void SetPersonCollections(Configuration configuration, List<PersonContainer> personContainers, string? a2PeopleSingletonDirectory, List<long> personKeys, Dictionary<string, string> personKeyFormattedToNewestPersonKeyFormatted, List<string> personKeyFormattedCollection, Dictionary<int, List<int>> skipCollection, Dictionary<int, List<int>> skipNotSkipCollection)
private static void SetPersonCollections(Configuration configuration, ReadOnlyCollection<PersonContainer> personContainers, string? a2PeopleSingletonDirectory, Dictionary<string, string> personKeyFormattedToNewestPersonKeyFormatted, List<string> personKeyFormattedCollection, Dictionary<int, List<int>> skipCollection, Dictionary<int, List<int>> skipNotSkipCollection)
{
int? id;
long personKey;
int? normalizedRectangle;
string personKeyFormatted;
string newestPersonKeyFormatted;
@ -72,11 +46,6 @@ internal abstract class MapLogic
if (personContainer.Person is null || personContainer.Key is null || personContainer.Birthdays is null || !personContainer.Birthdays.Any())
continue;
foreach (PersonBirthday personBirthday in personContainer.Birthdays)
{
personKey = personBirthday.Value.Ticks;
personKeys.Add(personKey);
}
foreach (PersonBirthday personBirthday in personContainer.Birthdays)
{
personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, personBirthday);
personKeyFormattedCollection.Add(personKeyFormatted);
@ -316,7 +285,7 @@ internal abstract class MapLogic
return results.ToArray();
}
private static void SetKeyValuePairs(Configuration configuration, List<PersonContainer> personContainers, Dictionary<long, List<PersonContainer>> personKeyToPersonContainerCollection, Dictionary<string, PersonContainer> personKeyFormattedToPersonContainer, List<(string, string[], int, int)> personKeyFormattedIdThenNormalizedRectangleCollection, Dictionary<long, PersonContainer> personKeyToPersonContainer, Dictionary<int, Dictionary<int, PersonContainer[]>> idThenNormalizedRectangleToPersonContainers, List<(string[], PersonContainer)> possiblyNewPersonDisplayDirectoryNamesAndPersonContainer)
private static void SetKeyValuePairs(Configuration configuration, ReadOnlyCollection<PersonContainer> personContainers, Dictionary<long, List<PersonContainer>> personKeyToPersonContainerCollection, Dictionary<string, PersonContainer> personKeyFormattedToPersonContainer, List<(string, string[], int, int)> personKeyFormattedIdThenNormalizedRectangleCollection, Dictionary<long, PersonContainer> personKeyToPersonContainer, Dictionary<int, Dictionary<int, PersonContainer[]>> idThenNormalizedRectangleToPersonContainers, List<(string[], PersonContainer)> possiblyNewPersonDisplayDirectoryNamesAndPersonContainer)
{
PersonBirthday? personBirthday;
PersonContainer[] distinctPersonContainers;
@ -394,16 +363,14 @@ internal abstract class MapLogic
return results;
}
private static (int, int) SetCollectionsAndGetUnableToConvertCount(Configuration configuration, long ticks, Dictionary<string, string> personKeyFormattedToNewestPersonKeyFormatted, List<(string, string[], int, int)> personKeyFormattedIdThenNormalizedRectangleCollection, List<(string, string[], string)> collection)
private static int SetCollectionsAndGetUnableToConvertCount(Configuration configuration, long ticks, Dictionary<string, string> personKeyFormattedToNewestPersonKeyFormatted, List<(string, string[], int, int)> personKeyFormattedIdThenNormalizedRectangleCollection, List<(string, string[], string)> collection)
{
int result = 0;
int? id;
string checkFile;
int? normalizedRectangle;
List<int> normalizedRectangles;
string? newestPersonKeyFormatted;
string personDisplayDirectoryName;
List<string> duplicateMappedFaceFiles = new();
Dictionary<int, List<int>> idToNormalizedRectangles = new();
int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
string message = $") {collection.Count:000} join from ticks Director(ies) - C - {totalSeconds} total second(s)";
@ -414,16 +381,9 @@ internal abstract class MapLogic
progressBar.Tick();
if (!personKeyFormattedToNewestPersonKeyFormatted.TryGetValue(personKeyFormatted, out newestPersonKeyFormatted))
{
if (!personDisplayDirectoryNames.Any() || IPerson.IsDefaultName(configuration.MappingDefaultName, personDisplayDirectoryNames[^1]))
newestPersonKeyFormatted = personKeyFormatted;
else
{
checkFile = $"{mappedFaceFile}.abd";
if (File.Exists(checkFile))
continue;
File.Move(mappedFaceFile, checkFile);
if (personDisplayDirectoryNames.Any() && !IPerson.IsDefaultName(configuration.MappingDefaultName, personDisplayDirectoryNames[^1]))
continue;
}
newestPersonKeyFormatted = personKeyFormatted;
}
(id, normalizedRectangle) = IMapping.GetConverted(configuration.FacesFileNameExtension, mappedFaceFile);
if (id is null || normalizedRectangle is null)
@ -441,20 +401,15 @@ internal abstract class MapLogic
continue;
personKeyFormattedIdThenNormalizedRectangleCollection.Add(new(newestPersonKeyFormatted, personDisplayDirectoryNames, id.Value, normalizedRectangle.Value));
}
if (duplicateMappedFaceFiles.Any())
{
duplicateMappedFaceFiles.Sort();
if (duplicateMappedFaceFiles.Any())
{ }
}
return new(result, duplicateMappedFaceFiles.Count);
return result;
}
private static List<PersonContainer> GetNotMappedPersonContainers(Configuration configuration, List<PersonContainer> personContainers, List<long> personKeys, long[] personKeyCollection)
private static List<PersonContainer> GetNotMappedPersonContainers(Configuration configuration, ReadOnlyCollection<PersonContainer> personContainers, long[] personKeyCollection)
{
List<PersonContainer> results = new();
List<PersonContainer> notMappedAndNotNamedPersonKeys = new();
List<PersonContainer> notMappedAndWithNamedPersonKeys = new();
List<long> personKeys = IPersonContainer.GetPersonKeys(personContainers);
foreach (PersonContainer personContainer in personContainers)
{
if (personContainer.Person is null || personContainer.Key is null || personContainer.Birthdays is null || !personContainer.Birthdays.Any())
@ -484,7 +439,7 @@ internal abstract class MapLogic
return result;
}
private static void SetPersonKeyToPersonContainer(Configuration configuration, List<PersonContainer> personContainers, long[] personKeyCollection, Dictionary<long, PersonContainer> personKeyToPersonContainer, Dictionary<long, List<PersonContainer>> personKeyToPersonContainerCollection)
private static void SetPersonKeyToPersonContainer(Configuration configuration, ReadOnlyCollection<PersonContainer> personContainers, long[] personKeyCollection, Dictionary<long, PersonContainer> personKeyToPersonContainer, Dictionary<long, List<PersonContainer>> personKeyToPersonContainerCollection)
{
string? displayDirectoryName;
foreach (PersonContainer personContainer in personContainers)
@ -601,7 +556,7 @@ internal abstract class MapLogic
return results;
}
private static List<(long, string)> GetDisplayDirectoryAllFiles(string fileNameExtension, List<PersonContainer> personContainers)
private static List<(long, string)> GetDisplayDirectoryAllFiles(string fileNameExtension, ReadOnlyCollection<PersonContainer> personContainers)
{
List<(long, string)> results = new();
List<string> distinct = new();
@ -622,7 +577,7 @@ internal abstract class MapLogic
return results;
}
private static List<(long PersonKey, string File)> GetCollection(Configuration configuration, List<PersonContainer> personContainers, List<(string, string[], string)> collection)
private static List<(long PersonKey, string File)> GetCollection(Configuration configuration, ReadOnlyCollection<PersonContainer> personContainers, List<(string, string[], string)> collection)
{
List<(long PersonKey, string File)> results = new();
string file;
@ -757,7 +712,7 @@ internal abstract class MapLogic
}
}
private static void SetLocationContainers(int maxDegreeOfParallelism, Configuration configuration, long ticks, List<PersonContainer> personContainers, string eDistanceContentDirectory, Dictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers, List<(string, string[], string)> sourceCollection)
private static List<LocationContainer<MetadataExtractor.Directory>> GetLocationContainers(int maxDegreeOfParallelism, Configuration configuration, long ticks, ReadOnlyCollection<PersonContainer> personContainers, string eDistanceContentDirectory, List<(string, string[], string)> sourceCollection)
{
List<LocationContainer<MetadataExtractor.Directory>> results = new();
List<(long PersonKey, string File)> collection = GetCollection(configuration, personContainers, sourceCollection);
@ -775,19 +730,13 @@ internal abstract class MapLogic
});
}
LookForPossibleDuplicates(configuration, results);
foreach (LocationContainer<MetadataExtractor.Directory> locationContainer in results)
{
if (!idToLocationContainers.ContainsKey(locationContainer.Id))
idToLocationContainers.Add(locationContainer.Id, new());
idToLocationContainers[locationContainer.Id].Add(locationContainer);
}
return results;
}
internal static void Set(int maxDegreeOfParallelism, Configuration configuration, long ticks, List<PersonContainer> personContainers, string? a2PeopleSingletonDirectory, string eDistanceContentDirectory, Dictionary<long, PersonContainer> personKeyToPersonContainer, List<PersonContainer> notMappedPersonContainers, Dictionary<int, List<int>> skipCollection, Dictionary<int, List<int>> skipNotSkipCollection, Dictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers, Dictionary<int, Dictionary<int, PersonContainer[]>> idThenNormalizedRectangleToPersonContainers)
internal static void Set(int maxDegreeOfParallelism, Configuration configuration, long ticks, ReadOnlyCollection<PersonContainer> personContainers, string? a2PeopleSingletonDirectory, string eDistanceContentDirectory, Dictionary<long, PersonContainer> personKeyToPersonContainer, List<PersonContainer> notMappedPersonContainers, Dictionary<int, List<int>> skipCollection, Dictionary<int, List<int>> skipNotSkipCollection, List<LocationContainer<MetadataExtractor.Directory>> locationContainers, Dictionary<int, Dictionary<int, PersonContainer[]>> idThenNormalizedRectangleToPersonContainers)
{
string message;
int totalSeconds;
List<long> personKeys = new();
List<long?> nullablePersonKeyCollection = new();
List<string> personKeyFormattedCollection = new();
Dictionary<string, string> personKeyFormattedToNewestPersonKeyFormatted = new();
@ -796,16 +745,16 @@ internal abstract class MapLogic
string[] ticksDirectories = UpdateDateVerifyAndGetTicksDirectories(eDistanceContentDirectory);
List<(string, string[], int, int)> personKeyFormattedIdThenNormalizedRectangleCollection = new();
List<(string[], PersonContainer)> possiblyNewPersonDisplayDirectoryNamesAndPersonContainer = new();
SetPersonCollections(configuration, personContainers, a2PeopleSingletonDirectory, personKeys, personKeyFormattedToNewestPersonKeyFormatted, personKeyFormattedCollection, skipCollection, skipNotSkipCollection);
personContainers.AddRange(GetNonSpecificPeopleCollection(configuration, ticks, personKeys));
SetPersonCollections(configuration, personContainers, a2PeopleSingletonDirectory, personKeyFormattedToNewestPersonKeyFormatted, personKeyFormattedCollection, skipCollection, skipNotSkipCollection);
// personContainers.AddRange(GetNonSpecificPeopleCollection(configuration, ticks, personKeys));
totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
message = $") {ticksDirectories.Length:000} compile from and clean ticks Director(ies) - B - {totalSeconds} total second(s)";
List<(string, string[], string)> collection = DeleteEmptyDirectoriesAndGetCollection(configuration, personKeyFormattedCollection, ticksDirectories, message);
SetLocationContainers(maxDegreeOfParallelism, configuration, ticks, personContainers, eDistanceContentDirectory, idToLocationContainers, collection);
(int unableToMatchCount, int duplicateCount) = SetCollectionsAndGetUnableToConvertCount(configuration, ticks, personKeyFormattedToNewestPersonKeyFormatted, personKeyFormattedIdThenNormalizedRectangleCollection, collection);
locationContainers.AddRange(GetLocationContainers(maxDegreeOfParallelism, configuration, ticks, personContainers, eDistanceContentDirectory, collection));
int unableToMatchCount = SetCollectionsAndGetUnableToConvertCount(configuration, ticks, personKeyFormattedToNewestPersonKeyFormatted, personKeyFormattedIdThenNormalizedRectangleCollection, collection);
SetKeyValuePairs(configuration, personContainers, personKeyToPersonContainerCollection, personKeyFormattedToPersonContainer, personKeyFormattedIdThenNormalizedRectangleCollection, personKeyToPersonContainer, idThenNormalizedRectangleToPersonContainers, possiblyNewPersonDisplayDirectoryNamesAndPersonContainer);
totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
message = $") {collection.Count:000} message from ticks Director(ies) - D - {duplicateCount} Duplicate Count {unableToMatchCount} Unable To Match Count / {collection.Count} Collection - {totalSeconds} total second(s)";
message = $") {collection.Count:000} message from ticks Director(ies) - D - {unableToMatchCount} Unable To Match Count / {collection.Count} Collection - {totalSeconds} total second(s)";
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
using (ProgressBar progressBar = new(collection.Count, message, options))
{
@ -818,7 +767,7 @@ internal abstract class MapLogic
}
long[] personKeyCollection = (from l in nullablePersonKeyCollection where l is not null select l.Value).Distinct().ToArray();
SetPersonKeyToPersonContainer(configuration, personContainers, personKeyCollection, personKeyToPersonContainer, personKeyToPersonContainerCollection);
notMappedPersonContainers.AddRange(GetNotMappedPersonContainers(configuration, personContainers, personKeys, personKeyCollection));
notMappedPersonContainers.AddRange(GetNotMappedPersonContainers(configuration, personContainers, personKeyCollection));
if (possiblyNewPersonDisplayDirectoryNamesAndPersonContainer.Any())
SavePossiblyNewPersonContainers(configuration.PersonBirthdayFormat, configuration.PersonCharacters.ToArray(), configuration.FacesFileNameExtension, a2PeopleSingletonDirectory, possiblyNewPersonDisplayDirectoryNamesAndPersonContainer);
}