Mostly Sorting
Video Merge as 4, 5, and 6
This commit is contained in:
@ -8,36 +8,48 @@ namespace View_by_Distance.Map.Models.Stateless;
|
||||
internal abstract class RelationLogic
|
||||
{
|
||||
|
||||
internal record Group(string Key, long PersonKey, ReadOnlyCollection<LocationContainer> RelationContainersCollection);
|
||||
internal record Group(string Key,
|
||||
long PersonKey,
|
||||
ReadOnlyCollection<LocationContainer> RelationContainersCollection);
|
||||
|
||||
private static Dictionary<long, Dictionary<int, List<LocationContainer>>> GetPersonKeyTo(Configuration configuration, List<LocationContainer> locationContainers)
|
||||
internal static void SaveMappedRelations(Configuration configuration, Shared.Models.Methods.IDistance distance, string a2PeopleContentDirectory, string eDistanceContentDirectory, long ticks, List<LocationContainer> locationContainers, ReadOnlyDictionary<string, PersonContainer> readOnlyPersonKeyFormattedToPersonContainer, ReadOnlyDictionary<long, List<PersonContainer>> readOnlyPersonKeyToPersonContainerCollection)
|
||||
{
|
||||
List<LocationContainer>? collection;
|
||||
Dictionary<int, List<LocationContainer>>? yearTo;
|
||||
Dictionary<long, Dictionary<int, List<LocationContainer>>> personKeyTo = [];
|
||||
foreach (LocationContainer locationContainer in locationContainers)
|
||||
int take;
|
||||
string directory;
|
||||
bool isCounterPersonYear;
|
||||
string personKeyFormatted;
|
||||
string? displayDirectoryName;
|
||||
Uri uri = new(eDistanceContentDirectory);
|
||||
ReadOnlyDictionary<string, string> movedFiles;
|
||||
ReadOnlyCollection<RelationContainer> relationContainers;
|
||||
ReadOnlyCollection<Group> groups = GetGroups(configuration, locationContainers);
|
||||
int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
|
||||
string message = $") Save Mapped Relations - {totalSeconds} total second(s)";
|
||||
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
|
||||
using ProgressBar progressBar = new(groups.Count, message, options);
|
||||
foreach (Group group in groups)
|
||||
{
|
||||
if (locationContainer.PersonKey is null)
|
||||
if (configuration.LocationContainerDistanceTolerance is null)
|
||||
break;
|
||||
progressBar.Tick();
|
||||
if (group.RelationContainersCollection.Count == 0)
|
||||
continue;
|
||||
if (!locationContainer.FromDistanceContent)
|
||||
continue;
|
||||
if (!locationContainer.FilePath.FullName.Contains(configuration.LocationContainerDirectoryPattern))
|
||||
continue;
|
||||
if (!personKeyTo.TryGetValue(locationContainer.PersonKey.Value, out yearTo))
|
||||
{
|
||||
personKeyTo.Add(locationContainer.PersonKey.Value, []);
|
||||
if (!personKeyTo.TryGetValue(locationContainer.PersonKey.Value, out yearTo))
|
||||
throw new Exception();
|
||||
}
|
||||
if (!yearTo.TryGetValue(locationContainer.CreationDateOnly.Year, out collection))
|
||||
{
|
||||
yearTo.Add(locationContainer.CreationDateOnly.Year, []);
|
||||
if (!yearTo.TryGetValue(locationContainer.CreationDateOnly.Year, out collection))
|
||||
throw new Exception();
|
||||
}
|
||||
collection.Add(locationContainer);
|
||||
take = GetTake(configuration.LocationContainerDistanceTake, group.RelationContainersCollection.Count);
|
||||
isCounterPersonYear = IPersonBirthday.IsCounterPersonYear(new DateTime(group.PersonKey).Year);
|
||||
personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, group.PersonKey);
|
||||
displayDirectoryName = GetDisplayDirectoryName(readOnlyPersonKeyToPersonContainerCollection, readOnlyPersonKeyFormattedToPersonContainer, group.PersonKey, personKeyFormatted);
|
||||
directory = Path.Combine(a2PeopleContentDirectory, $"{ticks}-{configuration.LocationContainerDistanceTolerance.Value}", personKeyFormatted, group.Key);
|
||||
if (!Directory.Exists(directory))
|
||||
_ = Directory.CreateDirectory(directory);
|
||||
WriteVsCodeFiles(eDistanceContentDirectory, displayDirectoryName, directory);
|
||||
relationContainers = distance.GetRelationContainers(configuration.DistanceLimits, configuration.FaceDistancePermyriad, configuration.LocationContainerDistanceTake, configuration.LocationContainerDistanceTolerance.Value, group.RelationContainersCollection);
|
||||
movedFiles = GetMoveFiles(configuration, group.Key, take, isCounterPersonYear, displayDirectoryName, relationContainers);
|
||||
WriteFile(take, group.PersonKey, isCounterPersonYear, personKeyFormatted, displayDirectoryName, directory, ticks, uri, relationContainers, movedFiles);
|
||||
}
|
||||
return personKeyTo;
|
||||
if (string.IsNullOrEmpty(configuration.LocationContainerDebugDirectory))
|
||||
_ = IPath.DeleteEmptyDirectories(eDistanceContentDirectory);
|
||||
else
|
||||
AddDisplayDirectoryNames(configuration, eDistanceContentDirectory, readOnlyPersonKeyFormattedToPersonContainer, readOnlyPersonKeyToPersonContainerCollection, groups);
|
||||
}
|
||||
|
||||
private static ReadOnlyCollection<Group> GetGroups(Configuration configuration, List<LocationContainer> locationContainers)
|
||||
@ -90,6 +102,121 @@ internal abstract class RelationLogic
|
||||
return results.AsReadOnly();
|
||||
}
|
||||
|
||||
private static Dictionary<long, Dictionary<int, List<LocationContainer>>> GetPersonKeyTo(Configuration configuration, List<LocationContainer> locationContainers)
|
||||
{
|
||||
List<LocationContainer>? collection;
|
||||
Dictionary<int, List<LocationContainer>>? yearTo;
|
||||
Dictionary<long, Dictionary<int, List<LocationContainer>>> personKeyTo = [];
|
||||
foreach (LocationContainer locationContainer in locationContainers)
|
||||
{
|
||||
if (locationContainer.PersonKey is null)
|
||||
continue;
|
||||
if (!locationContainer.FromDistanceContent)
|
||||
continue;
|
||||
if (!locationContainer.FilePath.FullName.Contains(configuration.LocationContainerDirectoryPattern))
|
||||
continue;
|
||||
if (!personKeyTo.TryGetValue(locationContainer.PersonKey.Value, out yearTo))
|
||||
{
|
||||
personKeyTo.Add(locationContainer.PersonKey.Value, []);
|
||||
if (!personKeyTo.TryGetValue(locationContainer.PersonKey.Value, out yearTo))
|
||||
throw new Exception();
|
||||
}
|
||||
if (!yearTo.TryGetValue(locationContainer.CreationDateOnly.Year, out collection))
|
||||
{
|
||||
yearTo.Add(locationContainer.CreationDateOnly.Year, []);
|
||||
if (!yearTo.TryGetValue(locationContainer.CreationDateOnly.Year, out collection))
|
||||
throw new Exception();
|
||||
}
|
||||
collection.Add(locationContainer);
|
||||
}
|
||||
return personKeyTo;
|
||||
}
|
||||
|
||||
private static int GetTake(int locationContainerDistanceTake, int count)
|
||||
{
|
||||
int result = locationContainerDistanceTake;
|
||||
int subtract = (int)(locationContainerDistanceTake * .05);
|
||||
if (subtract < 1)
|
||||
subtract = 1;
|
||||
if (count > 9000)
|
||||
result -= subtract;
|
||||
if (count > 8000)
|
||||
result -= subtract;
|
||||
if (count > 7000)
|
||||
result -= subtract;
|
||||
if (count > 6000)
|
||||
result -= subtract;
|
||||
if (count > 5000)
|
||||
result -= subtract;
|
||||
if (count > 4000)
|
||||
result -= subtract;
|
||||
if (count > 3000)
|
||||
result -= subtract;
|
||||
if (count > 2000)
|
||||
result -= subtract;
|
||||
if (count > 1000)
|
||||
result -= subtract;
|
||||
if (result < 3)
|
||||
result = 3;
|
||||
return result;
|
||||
}
|
||||
|
||||
private static string? GetDisplayDirectoryName(ReadOnlyDictionary<long, List<PersonContainer>> readOnlyPersonKeyToPersonContainerCollection, ReadOnlyDictionary<string, PersonContainer> readOnlyPersonKeyFormattedToPersonContainer, long personKey, string personKeyFormatted)
|
||||
{
|
||||
string? result;
|
||||
PersonContainer? personContainer;
|
||||
List<PersonContainer>? collection;
|
||||
_ = readOnlyPersonKeyToPersonContainerCollection.TryGetValue(personKey, out collection);
|
||||
if (collection is not null)
|
||||
result = collection[0].DisplayDirectoryName;
|
||||
else
|
||||
{
|
||||
if (!readOnlyPersonKeyFormattedToPersonContainer.TryGetValue(personKeyFormatted, out personContainer))
|
||||
result = null;
|
||||
else
|
||||
result = personContainer.DisplayDirectoryName;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private static void WriteVsCodeFiles(string eDistanceContentDirectory, string? displayDirectoryName, string directory)
|
||||
{
|
||||
string json;
|
||||
string vsCodeDirectory = Path.Combine(directory, ".vscode");
|
||||
if (!Directory.Exists(vsCodeDirectory))
|
||||
_ = Directory.CreateDirectory(vsCodeDirectory);
|
||||
if (displayDirectoryName is not null)
|
||||
File.WriteAllText(Path.Combine(directory, $"_ {displayDirectoryName}.txt"), string.Empty);
|
||||
json = /*lang=json*/ """{ "[markdown]": { "editor.wordWrap": "off" }, "foam.links.hover.enable": false, "foam.graph.style": { "background": "#202020", "node": { "note": "#f2cb1d", "distance": "green", "image": "orange", "placeholder": "white", } } }""";
|
||||
_ = IPath.WriteAllText(Path.Combine(vsCodeDirectory, "settings.json"), json, updateDateWhenMatches: false, compareBeforeWrite: true, updateToWhenMatches: null);
|
||||
json = string.Concat("{ \"version\": \"2.0.0\", \"tasks\": [ { \"label\": \"MKLink\", \"type\": \"shell\", \"command\": \"New-Item\", \"args\": [ \"-ItemType\", \"Junction\", \"-Path\", \"'", directory.Replace('\\', '/'), "/()'\", \"-Target\", \"'", eDistanceContentDirectory.Replace('\\', '/'), "'\" ], \"problemMatcher\": [] } ] }");
|
||||
_ = IPath.WriteAllText(Path.Combine(vsCodeDirectory, "tasks.json"), json, updateDateWhenMatches: false, compareBeforeWrite: true, updateToWhenMatches: null);
|
||||
}
|
||||
|
||||
private static ReadOnlyDictionary<string, string> GetMoveFiles(Configuration configuration, string key, int take, bool isCounterPersonYear, string? displayDirectoryName, ReadOnlyCollection<RelationContainer> relationContainers)
|
||||
{
|
||||
ReadOnlyDictionary<string, string> results;
|
||||
List<List<string>> linked = [];
|
||||
for (int i = 0; i < 25; i++)
|
||||
linked.Add([]);
|
||||
foreach ((FileHolder fileHolder, ReadOnlyCollection<Relation> relations) in relationContainers)
|
||||
{
|
||||
foreach (Relation relation in relations.Take(take))
|
||||
{
|
||||
for (int i = 0; i < 25; i++)
|
||||
{
|
||||
if (!linked[i].Contains(relation.File))
|
||||
{
|
||||
linked[i].Add(relation.File);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
results = MoveFiles(configuration, key, isCounterPersonYear, displayDirectoryName, relationContainers, linked);
|
||||
return results;
|
||||
}
|
||||
|
||||
private static ReadOnlyDictionary<string, string> MoveFiles(Configuration configuration, string key, bool isCounterPersonYear, string? displayDirectoryName, ReadOnlyCollection<RelationContainer> relationContainers, List<List<string>> linked)
|
||||
{
|
||||
Dictionary<string, string> results = [];
|
||||
@ -205,91 +332,6 @@ internal abstract class RelationLogic
|
||||
return results.AsReadOnly();
|
||||
}
|
||||
|
||||
private static string? GetDisplayDirectoryName(ReadOnlyDictionary<long, List<PersonContainer>> readOnlyPersonKeyToPersonContainerCollection, ReadOnlyDictionary<string, PersonContainer> readOnlyPersonKeyFormattedToPersonContainer, long personKey, string personKeyFormatted)
|
||||
{
|
||||
string? result;
|
||||
PersonContainer? personContainer;
|
||||
List<PersonContainer>? collection;
|
||||
_ = readOnlyPersonKeyToPersonContainerCollection.TryGetValue(personKey, out collection);
|
||||
if (collection is not null)
|
||||
result = collection[0].DisplayDirectoryName;
|
||||
else
|
||||
{
|
||||
if (!readOnlyPersonKeyFormattedToPersonContainer.TryGetValue(personKeyFormatted, out personContainer))
|
||||
result = null;
|
||||
else
|
||||
result = personContainer.DisplayDirectoryName;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int GetTake(int locationContainerDistanceTake, int count)
|
||||
{
|
||||
int result = locationContainerDistanceTake;
|
||||
int subtract = (int)(locationContainerDistanceTake * .05);
|
||||
if (subtract < 1)
|
||||
subtract = 1;
|
||||
if (count > 9000)
|
||||
result -= subtract;
|
||||
if (count > 8000)
|
||||
result -= subtract;
|
||||
if (count > 7000)
|
||||
result -= subtract;
|
||||
if (count > 6000)
|
||||
result -= subtract;
|
||||
if (count > 5000)
|
||||
result -= subtract;
|
||||
if (count > 4000)
|
||||
result -= subtract;
|
||||
if (count > 3000)
|
||||
result -= subtract;
|
||||
if (count > 2000)
|
||||
result -= subtract;
|
||||
if (count > 1000)
|
||||
result -= subtract;
|
||||
if (result < 3)
|
||||
result = 3;
|
||||
return result;
|
||||
}
|
||||
|
||||
private static void WriteVsCodeFiles(string eDistanceContentDirectory, string? displayDirectoryName, string directory)
|
||||
{
|
||||
string json;
|
||||
string vsCodeDirectory = Path.Combine(directory, ".vscode");
|
||||
if (!Directory.Exists(vsCodeDirectory))
|
||||
_ = Directory.CreateDirectory(vsCodeDirectory);
|
||||
if (displayDirectoryName is not null)
|
||||
File.WriteAllText(Path.Combine(directory, $"_ {displayDirectoryName}.txt"), string.Empty);
|
||||
json = /*lang=json*/ """{ "[markdown]": { "editor.wordWrap": "off" }, "foam.links.hover.enable": false, "foam.graph.style": { "background": "#202020", "node": { "note": "#f2cb1d", "distance": "green", "image": "orange", "placeholder": "white", } } }""";
|
||||
_ = IPath.WriteAllText(Path.Combine(vsCodeDirectory, "settings.json"), json, updateDateWhenMatches: false, compareBeforeWrite: true, updateToWhenMatches: null);
|
||||
json = string.Concat("{ \"version\": \"2.0.0\", \"tasks\": [ { \"label\": \"MKLink\", \"type\": \"shell\", \"command\": \"New-Item\", \"args\": [ \"-ItemType\", \"Junction\", \"-Path\", \"'", directory.Replace('\\', '/'), "/()'\", \"-Target\", \"'", eDistanceContentDirectory.Replace('\\', '/'), "'\" ], \"problemMatcher\": [] } ] }");
|
||||
_ = IPath.WriteAllText(Path.Combine(vsCodeDirectory, "tasks.json"), json, updateDateWhenMatches: false, compareBeforeWrite: true, updateToWhenMatches: null);
|
||||
}
|
||||
|
||||
private static ReadOnlyDictionary<string, string> GetMoveFiles(Configuration configuration, string key, int take, bool isCounterPersonYear, string? displayDirectoryName, ReadOnlyCollection<RelationContainer> relationContainers)
|
||||
{
|
||||
ReadOnlyDictionary<string, string> results;
|
||||
List<List<string>> linked = [];
|
||||
for (int i = 0; i < 25; i++)
|
||||
linked.Add([]);
|
||||
foreach ((FileHolder fileHolder, ReadOnlyCollection<Relation> relations) in relationContainers)
|
||||
{
|
||||
foreach (Relation relation in relations.Take(take))
|
||||
{
|
||||
for (int i = 0; i < 25; i++)
|
||||
{
|
||||
if (!linked[i].Contains(relation.File))
|
||||
{
|
||||
linked[i].Add(relation.File);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
results = MoveFiles(configuration, key, isCounterPersonYear, displayDirectoryName, relationContainers, linked);
|
||||
return results;
|
||||
}
|
||||
|
||||
private static void WriteFile(int take, long personKey, bool isCounterPersonYear, string personKeyFormatted, string? displayDirectoryName, string directory, long ticks, Uri uri, ReadOnlyCollection<RelationContainer> relationContainers, ReadOnlyDictionary<string, string> movedFiles)
|
||||
{
|
||||
string a;
|
||||
@ -398,44 +440,4 @@ internal abstract class RelationLogic
|
||||
}
|
||||
}
|
||||
|
||||
internal static void SaveMappedRelations(Configuration configuration, Shared.Models.Methods.IDistance distance, string a2PeopleContentDirectory, string eDistanceContentDirectory, long ticks, List<LocationContainer> locationContainers, ReadOnlyDictionary<string, PersonContainer> readOnlyPersonKeyFormattedToPersonContainer, ReadOnlyDictionary<long, List<PersonContainer>> readOnlyPersonKeyToPersonContainerCollection)
|
||||
{
|
||||
int take;
|
||||
string directory;
|
||||
bool isCounterPersonYear;
|
||||
string personKeyFormatted;
|
||||
string? displayDirectoryName;
|
||||
Uri uri = new(eDistanceContentDirectory);
|
||||
ReadOnlyDictionary<string, string> movedFiles;
|
||||
ReadOnlyCollection<RelationContainer> relationContainers;
|
||||
ReadOnlyCollection<Group> groups = GetGroups(configuration, locationContainers);
|
||||
int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
|
||||
string message = $") Save Mapped Relations - {totalSeconds} total second(s)";
|
||||
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
|
||||
using ProgressBar progressBar = new(groups.Count, message, options);
|
||||
foreach (Group group in groups)
|
||||
{
|
||||
if (configuration.LocationContainerDistanceTolerance is null)
|
||||
break;
|
||||
progressBar.Tick();
|
||||
if (group.RelationContainersCollection.Count == 0)
|
||||
continue;
|
||||
take = GetTake(configuration.LocationContainerDistanceTake, group.RelationContainersCollection.Count);
|
||||
isCounterPersonYear = IPersonBirthday.IsCounterPersonYear(new DateTime(group.PersonKey).Year);
|
||||
personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, group.PersonKey);
|
||||
displayDirectoryName = GetDisplayDirectoryName(readOnlyPersonKeyToPersonContainerCollection, readOnlyPersonKeyFormattedToPersonContainer, group.PersonKey, personKeyFormatted);
|
||||
directory = Path.Combine(a2PeopleContentDirectory, $"{ticks}-{configuration.LocationContainerDistanceTolerance.Value}", personKeyFormatted, group.Key);
|
||||
if (!Directory.Exists(directory))
|
||||
_ = Directory.CreateDirectory(directory);
|
||||
WriteVsCodeFiles(eDistanceContentDirectory, displayDirectoryName, directory);
|
||||
relationContainers = distance.GetRelationContainers(configuration.DistanceLimits, configuration.FaceDistancePermyriad, configuration.LocationContainerDistanceTake, configuration.LocationContainerDistanceTolerance.Value, group.RelationContainersCollection);
|
||||
movedFiles = GetMoveFiles(configuration, group.Key, take, isCounterPersonYear, displayDirectoryName, relationContainers);
|
||||
WriteFile(take, group.PersonKey, isCounterPersonYear, personKeyFormatted, displayDirectoryName, directory, ticks, uri, relationContainers, movedFiles);
|
||||
}
|
||||
if (string.IsNullOrEmpty(configuration.LocationContainerDebugDirectory))
|
||||
_ = IPath.DeleteEmptyDirectories(eDistanceContentDirectory);
|
||||
else
|
||||
AddDisplayDirectoryNames(configuration, eDistanceContentDirectory, readOnlyPersonKeyFormattedToPersonContainer, readOnlyPersonKeyToPersonContainerCollection, groups);
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user