301 lines
18 KiB
C#
301 lines
18 KiB
C#
using System.Globalization;
|
|
using System.Text.Json;
|
|
using View_by_Distance.Shared.Models;
|
|
|
|
namespace View_by_Distance.Map.Models.Stateless;
|
|
|
|
public class ByDeterministicHashCode
|
|
{
|
|
|
|
private static void SetOther(string resizeFilenameExtension, Person[] people, string deterministicHashCodePeopleDirectory, List<double> skipCollection, List<(string, int?, PersonBirthday[], long)> peopleCollection)
|
|
{
|
|
long ticks;
|
|
string json;
|
|
string personKey;
|
|
string[] segments;
|
|
int? approximateYears;
|
|
string groupDirectoryName;
|
|
PersonBirthday[] collection;
|
|
string personKeyJsonFileName;
|
|
List<long> personKeys = new();
|
|
string[] personKeyDirectories;
|
|
string personKeyJsonDirectory;
|
|
PersonBirthday? personBirthday;
|
|
string[] personDisplayDirectories;
|
|
string convertedPersonKeyDirectory;
|
|
string? personDisplayDirectoryName;
|
|
List<PersonBirthday> personBirthdays;
|
|
Dictionary<string, Person> personKeyValuePairs = new();
|
|
foreach (Person person in people)
|
|
{
|
|
personKey = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(person.Birthday);
|
|
if (personKeyValuePairs.ContainsKey(personKey))
|
|
break;
|
|
personKeyValuePairs.Add(personKey, person);
|
|
}
|
|
string[] groupDirectories = Directory.GetDirectories(deterministicHashCodePeopleDirectory, "*", SearchOption.TopDirectoryOnly);
|
|
foreach (string groupDirectory in groupDirectories)
|
|
{
|
|
groupDirectoryName = Path.GetFileName(groupDirectory);
|
|
if (groupDirectoryName[0] == '!')
|
|
{
|
|
skipCollection.AddRange(from l in Directory.GetFiles(groupDirectory, $"*{resizeFilenameExtension}", SearchOption.AllDirectories) select double.Parse(Path.GetFileNameWithoutExtension(l)));
|
|
continue;
|
|
}
|
|
else if (groupDirectoryName[0] is not '_' and not '~' and not '^')
|
|
continue;
|
|
skipCollection.AddRange(from l in Directory.GetFiles(groupDirectory, $"*{resizeFilenameExtension}", SearchOption.AllDirectories) select double.Parse(Path.GetFileNameWithoutExtension(l)));
|
|
personDisplayDirectories = Directory.GetDirectories(groupDirectory, "*", SearchOption.TopDirectoryOnly);
|
|
foreach (string personDisplayDirectory in personDisplayDirectories)
|
|
{
|
|
personBirthdays = new();
|
|
personDisplayDirectoryName = Path.GetFileName(personDisplayDirectory);
|
|
if (string.IsNullOrEmpty(personDisplayDirectoryName))
|
|
continue;
|
|
if (groupDirectoryName[0] != '~')
|
|
approximateYears = null;
|
|
else
|
|
{
|
|
segments = personDisplayDirectoryName.Split('~');
|
|
if (segments.Length == 1 || !int.TryParse(segments[1].Split('-')[0], out int years))
|
|
approximateYears = null;
|
|
else
|
|
approximateYears = years;
|
|
}
|
|
personKeyDirectories = Directory.GetDirectories(personDisplayDirectory, "*", SearchOption.TopDirectoryOnly);
|
|
foreach (string personKeyDirectory in personKeyDirectories)
|
|
{
|
|
personKey = Path.GetFileName(personKeyDirectory);
|
|
if (!DateTime.TryParseExact(personKey, "MM.dd.yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime birthday))
|
|
personBirthday = Shared.Models.Stateless.Methods.IPersonBirthday.GetPersonBirthday(personKey);
|
|
else
|
|
{
|
|
personBirthday = new PersonBirthday(birthday);
|
|
personKey = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(personBirthday);
|
|
convertedPersonKeyDirectory = Path.Combine(personDisplayDirectory, personKey);
|
|
if (!Directory.Exists(convertedPersonKeyDirectory))
|
|
Directory.Move(personKeyDirectory, convertedPersonKeyDirectory);
|
|
}
|
|
if (personBirthday is null)
|
|
continue;
|
|
personBirthdays.Add(personBirthday);
|
|
}
|
|
if (!personBirthdays.Any())
|
|
continue;
|
|
foreach (string personKeyDirectory in personKeyDirectories)
|
|
{
|
|
personKey = Path.GetFileName(personKeyDirectory);
|
|
personBirthday = Shared.Models.Stateless.Methods.IPersonBirthday.GetPersonBirthday(personKey);
|
|
if (personBirthday is null)
|
|
continue;
|
|
if (personKeyValuePairs.ContainsKey(personKey))
|
|
{
|
|
personKeyJsonDirectory = Path.Combine(personDisplayDirectory, personKey);
|
|
if (!Directory.Exists(personKeyJsonDirectory))
|
|
Directory.Move(personKeyDirectory, personKeyJsonDirectory);
|
|
personKeyJsonFileName = Path.Combine(personKeyJsonDirectory, $"{personKey}.json");
|
|
json = JsonSerializer.Serialize(personKeyValuePairs[personKey], new JsonSerializerOptions() { WriteIndented = true });
|
|
_ = Shared.Models.Stateless.Methods.IPath.WriteAllText(personKeyJsonFileName, json, updateDateWhenMatches: false, compareBeforeWrite: true, updateToWhenMatches: null);
|
|
}
|
|
collection = personBirthdays.OrderByDescending(l => l.Value).ToArray();
|
|
ticks = collection[0].Value.Ticks;
|
|
peopleCollection.Add(new(personDisplayDirectoryName, approximateYears, collection, ticks));
|
|
for (int i = 0; i < collection.Length; i++)
|
|
{
|
|
ticks = collection[i].Value.Ticks;
|
|
personKeys.Add(ticks);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
approximateYears = null;
|
|
const string displayDirectoryName = Property.Models.Stateless.IResult.AllInOne;
|
|
DateTime incrementDate = new(Shared.Models.Stateless.IPersonBirthday.FirstYear, 1, 1);
|
|
for (int i = 0; i < 500; i++)
|
|
{
|
|
ticks = incrementDate.Ticks;
|
|
personBirthday = new(incrementDate);
|
|
incrementDate = incrementDate.AddDays(1);
|
|
personKey = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(personBirthday);
|
|
if (personKeys.Contains(ticks))
|
|
continue;
|
|
personKeys.Add(ticks);
|
|
peopleCollection.Add(new(displayDirectoryName, approximateYears, new PersonBirthday[] { personBirthday }, ticks));
|
|
}
|
|
}
|
|
|
|
internal static void SetKeyValuePairs(string deterministicHashCodeContentDirectory, List<(PersonBirthday, double)> deterministicHashCodeCollection, List<(PersonBirthday, double)> incorrectDeterministicHashCodeCollection, Dictionary<int, List<Face>> keyValuePairs)
|
|
{
|
|
string[] files;
|
|
string personKey;
|
|
string[] yearDirectories;
|
|
string ticksDirectoryName;
|
|
string? personFirstInitial;
|
|
string[] personKeyDirectories;
|
|
string[] personNameDirectories;
|
|
PersonBirthday? personBirthday;
|
|
string[] personNameLinkDirectories;
|
|
string? personFirstInitialDirectory;
|
|
double? reversedDeterministicHashCodeKey;
|
|
bool keyValuePairsAny = keyValuePairs.Any();
|
|
string[] ticksDirectories = Directory.GetDirectories(deterministicHashCodeContentDirectory, "*", SearchOption.TopDirectoryOnly);
|
|
foreach (string ticksDirectory in ticksDirectories)
|
|
{
|
|
ticksDirectoryName = Path.GetFileName(ticksDirectory);
|
|
if (ticksDirectoryName.Length < 3 || ticksDirectoryName[0] != '(' || ticksDirectoryName[^1] != ')')
|
|
continue;
|
|
personKeyDirectories = Directory.GetDirectories(ticksDirectory, "*", SearchOption.TopDirectoryOnly);
|
|
foreach (string personKeyDirectory in personKeyDirectories)
|
|
{
|
|
personKey = Path.GetFileName(personKeyDirectory);
|
|
if (personKey == nameof(Closest))
|
|
throw new Exception($"Move personKey directories up one from {nameof(Closest)} and delete {nameof(Closest)} directory!");
|
|
personBirthday = Shared.Models.Stateless.Methods.IPersonBirthday.GetPersonBirthday(personKey);
|
|
if (personBirthday is null)
|
|
continue;
|
|
yearDirectories = Directory.GetDirectories(personKeyDirectory, "*", SearchOption.TopDirectoryOnly);
|
|
foreach (string yearDirectory in yearDirectories)
|
|
{
|
|
files = Directory.GetFiles(yearDirectory, "*", SearchOption.TopDirectoryOnly);
|
|
personNameDirectories = Directory.GetDirectories(yearDirectory, "*", SearchOption.TopDirectoryOnly);
|
|
foreach (string file in files)
|
|
File.Delete(file);
|
|
foreach (string personNameDirectory in personNameDirectories)
|
|
{
|
|
personFirstInitial = Path.GetFileName(personNameDirectory)[..1];
|
|
if (personFirstInitial is null)
|
|
continue;
|
|
personFirstInitialDirectory = Path.Combine(yearDirectory, personFirstInitial);
|
|
files = Directory.GetFiles(personNameDirectory, "*", SearchOption.TopDirectoryOnly);
|
|
foreach (string file in files)
|
|
{
|
|
if (file.EndsWith(".lnk") || file.EndsWith(".json"))
|
|
continue;
|
|
reversedDeterministicHashCodeKey = Shared.Models.Stateless.Methods.IMapping.GetReversedDeterministicHashCodeKey(keyValuePairsAny, keyValuePairs, file);
|
|
if (reversedDeterministicHashCodeKey is null)
|
|
continue;
|
|
deterministicHashCodeCollection.Add(new(personBirthday, reversedDeterministicHashCodeKey.Value));
|
|
}
|
|
personNameLinkDirectories = Directory.GetDirectories(personNameDirectory, "*", SearchOption.TopDirectoryOnly);
|
|
foreach (string personNameLinkDirectory in personNameLinkDirectories)
|
|
{
|
|
files = Directory.GetFiles(personNameLinkDirectory, "*", SearchOption.TopDirectoryOnly);
|
|
foreach (string file in files)
|
|
{
|
|
if (!file.EndsWith(".lnk"))
|
|
continue;
|
|
File.Delete(file);
|
|
}
|
|
_ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(personNameLinkDirectory);
|
|
}
|
|
if (personNameDirectory == personFirstInitialDirectory)
|
|
continue;
|
|
Directory.Move(personNameDirectory, personFirstInitialDirectory);
|
|
_ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(personNameDirectory);
|
|
}
|
|
_ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(yearDirectory);
|
|
}
|
|
_ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(personKeyDirectory);
|
|
}
|
|
_ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(ticksDirectory);
|
|
}
|
|
}
|
|
|
|
private static List<long> GetTicks(Dictionary<int, PersonBirthday[]> deterministicHashCodeUnknownFaceKeyValuePairs)
|
|
{
|
|
List<long> results = new();
|
|
long ticks;
|
|
foreach (KeyValuePair<int, PersonBirthday[]> keyValuePair in deterministicHashCodeUnknownFaceKeyValuePairs)
|
|
{
|
|
foreach (PersonBirthday personBirthday in keyValuePair.Value)
|
|
{
|
|
ticks = personBirthday.Value.Ticks;
|
|
results.Add(ticks);
|
|
}
|
|
}
|
|
results = results.Distinct().ToList();
|
|
return results;
|
|
}
|
|
|
|
private static void Set(List<(PersonBirthday PersonBirthday, double IdAndNormalizedPixelPercentage)> deterministicHashCodeCollection, List<long> deterministicHashCodePersonKeys, Dictionary<double, List<PersonBirthday>> deterministicHashCodeScope)
|
|
{
|
|
long ticks;
|
|
deterministicHashCodeCollection = (from l in deterministicHashCodeCollection orderby l.IdAndNormalizedPixelPercentage select l).ToList();
|
|
foreach ((PersonBirthday personBirthday, double idAndNormalizedPixelPercentage) in deterministicHashCodeCollection)
|
|
{
|
|
if (!deterministicHashCodeScope.ContainsKey(idAndNormalizedPixelPercentage))
|
|
deterministicHashCodeScope.Add(idAndNormalizedPixelPercentage, new());
|
|
deterministicHashCodeScope[idAndNormalizedPixelPercentage].Add(personBirthday);
|
|
ticks = personBirthday.Value.Ticks;
|
|
deterministicHashCodePersonKeys.Add(ticks);
|
|
}
|
|
}
|
|
|
|
internal static void SetByRef(string resizeFilenameExtension, Person[] people, List<double> skipCollection, Dictionary<long, (string, int?, PersonBirthday[], long)> peopleKeyValuePairs, List<long> notMappedPersonKeys, Dictionary<int, PersonBirthday[]> deterministicHashCodeUnknownFaceKeyValuePairs, Dictionary<double, PersonBirthday[]> deterministicHashCodeKeyValuePairs, Dictionary<double, PersonBirthday[]> incorrectDeterministicHashCodeKeyValuePairs, string deterministicHashCodeRootDirectory, string deterministicHashCodeContentDirectory)
|
|
{
|
|
Dictionary<int, List<Face>> keyValuePairs = new();
|
|
List<long> deterministicHashCodePersonKeys = new();
|
|
List<(string, int?, PersonBirthday[], long)> peopleCollection = new();
|
|
Dictionary<double, List<PersonBirthday>> deterministicHashCodeScope = new();
|
|
Dictionary<double, List<PersonBirthday>> incorrectDeterministicHashCodeScope = new();
|
|
string deterministicHashCodePeopleDirectory = Path.Combine(deterministicHashCodeRootDirectory, "People");
|
|
List<long> deterministicHashCodeUnknownFacePersonKeys = GetTicks(deterministicHashCodeUnknownFaceKeyValuePairs);
|
|
List<(PersonBirthday PersonBirthday, double IdAndNormalizedPixelPercentage)> incorrectDeterministicHashCodeCollection = new();
|
|
List<(PersonBirthday PersonBirthday, double IdAndNormalizedPixelPercentage)> deterministicHashCodeCollection = new();
|
|
if (!Directory.Exists(deterministicHashCodePeopleDirectory))
|
|
_ = Directory.CreateDirectory(deterministicHashCodePeopleDirectory);
|
|
else
|
|
SetOther(resizeFilenameExtension, people, deterministicHashCodePeopleDirectory, skipCollection, peopleCollection);
|
|
if (!Directory.Exists(deterministicHashCodeContentDirectory))
|
|
_ = Directory.CreateDirectory(deterministicHashCodeContentDirectory);
|
|
SetKeyValuePairs(deterministicHashCodeContentDirectory, deterministicHashCodeCollection, incorrectDeterministicHashCodeCollection, keyValuePairs);
|
|
Set(deterministicHashCodeCollection, deterministicHashCodePersonKeys, deterministicHashCodeScope);
|
|
incorrectDeterministicHashCodeCollection = (from l in incorrectDeterministicHashCodeCollection orderby l.IdAndNormalizedPixelPercentage select l).ToList();
|
|
deterministicHashCodePersonKeys = deterministicHashCodePersonKeys.Distinct().ToList();
|
|
foreach ((PersonBirthday personBirthday, double idAndNormalizedPixelPercentage) in incorrectDeterministicHashCodeCollection)
|
|
{
|
|
if (!incorrectDeterministicHashCodeScope.ContainsKey(idAndNormalizedPixelPercentage))
|
|
incorrectDeterministicHashCodeScope.Add(idAndNormalizedPixelPercentage, new());
|
|
incorrectDeterministicHashCodeScope[idAndNormalizedPixelPercentage].Add(personBirthday);
|
|
}
|
|
foreach (KeyValuePair<double, List<PersonBirthday>> keyValuePair in deterministicHashCodeScope)
|
|
deterministicHashCodeKeyValuePairs.Add(keyValuePair.Key, keyValuePair.Value.Distinct().ToArray());
|
|
foreach (KeyValuePair<double, List<PersonBirthday>> keyValuePair in incorrectDeterministicHashCodeScope)
|
|
incorrectDeterministicHashCodeKeyValuePairs.Add(keyValuePair.Key, keyValuePair.Value.Distinct().ToArray());
|
|
if (peopleCollection.Any())
|
|
{
|
|
foreach ((string displayDirectoryName, int? approximateYears, PersonBirthday[] personBirthdays, long ticks) in peopleCollection)
|
|
{
|
|
if (peopleKeyValuePairs.ContainsKey(ticks) && peopleKeyValuePairs[ticks].Item1 != displayDirectoryName)
|
|
throw new NotImplementedException();
|
|
if (deterministicHashCodeUnknownFacePersonKeys.Contains(ticks) || deterministicHashCodePersonKeys.Contains(ticks))
|
|
peopleKeyValuePairs.Add(ticks, new(displayDirectoryName, approximateYears, personBirthdays, ticks));
|
|
else
|
|
notMappedPersonKeys.Add(ticks);
|
|
}
|
|
}
|
|
if (deterministicHashCodeUnknownFacePersonKeys.Any() || deterministicHashCodePersonKeys.Any())
|
|
{
|
|
int? approximateYears = null;
|
|
PersonBirthday? personBirthday;
|
|
const string displayDirectoryName = Property.Models.Stateless.IResult.AllInOne;
|
|
foreach (long ticks in deterministicHashCodeUnknownFacePersonKeys)
|
|
{
|
|
if (!peopleKeyValuePairs.ContainsKey(ticks))
|
|
{
|
|
personBirthday = Shared.Models.Stateless.Methods.IPersonBirthday.GetPersonBirthday(ticks);
|
|
peopleKeyValuePairs.Add(ticks, new(displayDirectoryName, approximateYears, new PersonBirthday[] { personBirthday }, ticks));
|
|
}
|
|
}
|
|
foreach (long ticks in deterministicHashCodePersonKeys)
|
|
{
|
|
if (!peopleKeyValuePairs.ContainsKey(ticks))
|
|
{
|
|
personBirthday = Shared.Models.Stateless.Methods.IPersonBirthday.GetPersonBirthday(ticks);
|
|
peopleKeyValuePairs.Add(ticks, new(displayDirectoryName, approximateYears, new PersonBirthday[] { personBirthday }, ticks));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
} |