Filter same id
RelationLogic LookForAbandoned
This commit is contained in:
400
Map/Models/Stateless/RelationLogic.cs
Normal file
400
Map/Models/Stateless/RelationLogic.cs
Normal file
@ -0,0 +1,400 @@
|
||||
using ShellProgressBar;
|
||||
using System.Collections.ObjectModel;
|
||||
using View_by_Distance.Shared.Models;
|
||||
using View_by_Distance.Shared.Models.Stateless.Methods;
|
||||
|
||||
namespace View_by_Distance.Map.Models.Stateless;
|
||||
|
||||
internal abstract class RelationLogic
|
||||
{
|
||||
|
||||
internal record RelationCollection(ReadOnlyCollection<RelationContainer> RelationContainers,
|
||||
ReadOnlyCollection<string> Linked1,
|
||||
ReadOnlyCollection<string> Linked2,
|
||||
ReadOnlyCollection<string> Linked3,
|
||||
ReadOnlyCollection<string> Linked4,
|
||||
ReadOnlyCollection<string> Linked5,
|
||||
ReadOnlyCollection<string> Linked6,
|
||||
ReadOnlyCollection<string> Linked7,
|
||||
ReadOnlyCollection<string> Linked8,
|
||||
ReadOnlyCollection<string> Linked9,
|
||||
ReadOnlyDictionary<string, string> MovedFiles);
|
||||
|
||||
private static ReadOnlyCollection<ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>>> GetCollections(List<LocationContainer<MetadataExtractor.Directory>> locationContainers)
|
||||
{
|
||||
List<ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>>> results = new();
|
||||
List<LocationContainer<MetadataExtractor.Directory>>? collection;
|
||||
Dictionary<long, List<LocationContainer<MetadataExtractor.Directory>>> keyValuePairs = new();
|
||||
foreach (LocationContainer<MetadataExtractor.Directory> locationContainer in locationContainers)
|
||||
{
|
||||
if (!locationContainer.FromDistanceContent)
|
||||
continue;
|
||||
if (!keyValuePairs.TryGetValue(locationContainer.PersonKey, out collection))
|
||||
{
|
||||
keyValuePairs.Add(locationContainer.PersonKey, new());
|
||||
if (!keyValuePairs.TryGetValue(locationContainer.PersonKey, out collection))
|
||||
throw new Exception();
|
||||
}
|
||||
collection.Add(locationContainer);
|
||||
}
|
||||
foreach (KeyValuePair<long, List<LocationContainer<MetadataExtractor.Directory>>> keyValuePair in keyValuePairs)
|
||||
results.Add(new(keyValuePair.Value));
|
||||
return new(results);
|
||||
}
|
||||
|
||||
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 AddDisplayDirectoryNames(Configuration configuration, string eDistanceContentDirectory, ReadOnlyDictionary<string, PersonContainer> readOnlyPersonKeyFormattedToPersonContainer, ReadOnlyDictionary<long, List<PersonContainer>> readOnlyPersonKeyToPersonContainerCollection, ReadOnlyCollection<ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>>> collections)
|
||||
{
|
||||
bool isCounterPersonYear;
|
||||
string personKeyFormatted;
|
||||
string? displayDirectoryName;
|
||||
string? checkDirectory = Path.Combine(eDistanceContentDirectory, configuration.LocationContainerDebugDirectory);
|
||||
_ = IPath.DeleteEmptyDirectories(checkDirectory);
|
||||
foreach (ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>> collection in collections)
|
||||
{
|
||||
if (configuration.LocationContainerDistanceTolerance is null)
|
||||
break;
|
||||
isCounterPersonYear = IPersonBirthday.IsCounterPersonYear(new DateTime(collection[0].PersonKey).Year);
|
||||
if (isCounterPersonYear)
|
||||
continue;
|
||||
personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, collection[0].PersonKey);
|
||||
checkDirectory = Path.Combine(eDistanceContentDirectory, configuration.LocationContainerDebugDirectory, personKeyFormatted);
|
||||
if (!Directory.Exists(checkDirectory))
|
||||
continue;
|
||||
displayDirectoryName = GetDisplayDirectoryName(readOnlyPersonKeyToPersonContainerCollection, readOnlyPersonKeyFormattedToPersonContainer, collection[0].PersonKey, personKeyFormatted);
|
||||
if (string.IsNullOrEmpty(displayDirectoryName))
|
||||
continue;
|
||||
foreach (string yearDirectory in Directory.GetDirectories(checkDirectory, "*", SearchOption.TopDirectoryOnly))
|
||||
{
|
||||
checkDirectory = Path.Combine(yearDirectory, displayDirectoryName);
|
||||
if (!Directory.Exists(checkDirectory))
|
||||
_ = Directory.CreateDirectory(checkDirectory);
|
||||
}
|
||||
checkDirectory = Path.Combine(eDistanceContentDirectory, configuration.LocationContainerDebugDirectory, personKeyFormatted, displayDirectoryName);
|
||||
if (!Directory.Exists(checkDirectory))
|
||||
_ = Directory.CreateDirectory(checkDirectory);
|
||||
}
|
||||
}
|
||||
|
||||
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 = "{ \"[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> MoveFiles(string locationContainerDebugDirectory, bool isCounterPersonYear, string? displayDirectoryName, List<string> linked1, List<string> linked2, List<string> linked3, List<string> linked4, List<string> linked5, List<string> linked6, List<string> linked7, List<string> linked8, List<string> linked9)
|
||||
{
|
||||
Dictionary<string, string> results = new();
|
||||
char c;
|
||||
string checkFile;
|
||||
string debugFile;
|
||||
string checkDirectory;
|
||||
string? yearDirectory;
|
||||
string? personNameDirectory;
|
||||
string? maybeTicksDirectoryName;
|
||||
string? personNameDirectoryName;
|
||||
string? personKeyFormattedDirectory;
|
||||
Dictionary<string, int> fullNameToCount = new();
|
||||
foreach (string file in linked1)
|
||||
fullNameToCount.Add(file, 1);
|
||||
foreach (string file in linked2)
|
||||
fullNameToCount[file] += 1;
|
||||
foreach (string file in linked3)
|
||||
fullNameToCount[file] += 1;
|
||||
foreach (string file in linked4)
|
||||
fullNameToCount[file] += 1;
|
||||
foreach (string file in linked5)
|
||||
fullNameToCount[file] += 1;
|
||||
foreach (string file in linked6)
|
||||
fullNameToCount[file] += 1;
|
||||
foreach (string file in linked7)
|
||||
fullNameToCount[file] += 1;
|
||||
foreach (string file in linked8)
|
||||
fullNameToCount[file] += 1;
|
||||
foreach (string file in linked9)
|
||||
fullNameToCount[file] += 1;
|
||||
foreach (KeyValuePair<string, int> keyValuePair in fullNameToCount)
|
||||
{
|
||||
personNameDirectory = Path.GetDirectoryName(keyValuePair.Key);
|
||||
yearDirectory = Path.GetDirectoryName(personNameDirectory);
|
||||
personNameDirectoryName = Path.GetFileName(personNameDirectory);
|
||||
personKeyFormattedDirectory = Path.GetDirectoryName(yearDirectory);
|
||||
maybeTicksDirectoryName = Path.GetFileName(personKeyFormattedDirectory);
|
||||
if (string.IsNullOrEmpty(personNameDirectory) || string.IsNullOrEmpty(yearDirectory) || string.IsNullOrEmpty(personKeyFormattedDirectory) || string.IsNullOrEmpty(personNameDirectoryName))
|
||||
continue;
|
||||
c = Convert.ToChar(48 + keyValuePair.Value);
|
||||
if (c is ':' or ';' or '<' or '=' or '>' or '?')
|
||||
c = '_';
|
||||
if (maybeTicksDirectoryName == locationContainerDebugDirectory)
|
||||
checkDirectory = Path.Combine(yearDirectory, $"{keyValuePair.Value}{new string(c, 7)}");
|
||||
else
|
||||
{
|
||||
if (!string.IsNullOrEmpty(locationContainerDebugDirectory))
|
||||
continue;
|
||||
checkDirectory = Path.Combine(personKeyFormattedDirectory, $"{keyValuePair.Value}{new string(c, 7)}");
|
||||
}
|
||||
if (maybeTicksDirectoryName != locationContainerDebugDirectory)
|
||||
{
|
||||
if (isCounterPersonYear || string.IsNullOrEmpty(displayDirectoryName))
|
||||
checkDirectory = Path.Combine(checkDirectory, personNameDirectoryName);
|
||||
else
|
||||
checkDirectory = Path.Combine(checkDirectory, displayDirectoryName[0].ToString());
|
||||
}
|
||||
if (checkDirectory == personNameDirectory)
|
||||
continue;
|
||||
if (!Directory.Exists(checkDirectory))
|
||||
_ = Directory.CreateDirectory(checkDirectory);
|
||||
checkFile = Path.Combine(checkDirectory, Path.GetFileName(keyValuePair.Key));
|
||||
if (File.Exists(checkFile))
|
||||
continue;
|
||||
results.Add(keyValuePair.Key, checkFile);
|
||||
File.Move(keyValuePair.Key, checkFile);
|
||||
debugFile = $"{keyValuePair.Key[..^4]}.gif";
|
||||
if (File.Exists(debugFile))
|
||||
{
|
||||
checkFile = Path.Combine(checkDirectory, $"{Path.GetFileName(keyValuePair.Key)[..^4]}.gif");
|
||||
if (File.Exists(checkFile))
|
||||
continue;
|
||||
File.Move(debugFile, checkFile);
|
||||
}
|
||||
if (maybeTicksDirectoryName == locationContainerDebugDirectory && !string.IsNullOrEmpty(displayDirectoryName))
|
||||
{
|
||||
checkDirectory = Path.Combine(checkDirectory, displayDirectoryName);
|
||||
if (!Directory.Exists(checkDirectory))
|
||||
_ = Directory.CreateDirectory(checkDirectory);
|
||||
}
|
||||
}
|
||||
return new(results);
|
||||
}
|
||||
|
||||
private static RelationCollection GetMappedRelationCollection(string locationContainerDebugDirectory, int take, bool isCounterPersonYear, string? displayDirectoryName, ReadOnlyCollection<RelationContainer> relationContainers)
|
||||
{
|
||||
RelationCollection result;
|
||||
List<string> linked1 = new();
|
||||
List<string> linked2 = new();
|
||||
List<string> linked3 = new();
|
||||
List<string> linked4 = new();
|
||||
List<string> linked5 = new();
|
||||
List<string> linked6 = new();
|
||||
List<string> linked7 = new();
|
||||
List<string> linked8 = new();
|
||||
List<string> linked9 = new();
|
||||
foreach ((FileHolder fileHolder, ReadOnlyCollection<Relation> relations) in relationContainers)
|
||||
{
|
||||
foreach (Relation relation in relations.Take(take))
|
||||
{
|
||||
if (!linked1.Contains(relation.File))
|
||||
{
|
||||
linked1.Add(relation.File);
|
||||
continue;
|
||||
}
|
||||
if (!linked2.Contains(relation.File))
|
||||
{
|
||||
linked2.Add(relation.File);
|
||||
continue;
|
||||
}
|
||||
if (!linked3.Contains(relation.File))
|
||||
{
|
||||
linked3.Add(relation.File);
|
||||
continue;
|
||||
}
|
||||
if (!linked4.Contains(relation.File))
|
||||
{
|
||||
linked4.Add(relation.File);
|
||||
continue;
|
||||
}
|
||||
if (!linked5.Contains(relation.File))
|
||||
{
|
||||
linked5.Add(relation.File);
|
||||
continue;
|
||||
}
|
||||
if (!linked6.Contains(relation.File))
|
||||
{
|
||||
linked6.Add(relation.File);
|
||||
continue;
|
||||
}
|
||||
if (!linked7.Contains(relation.File))
|
||||
{
|
||||
linked7.Add(relation.File);
|
||||
continue;
|
||||
}
|
||||
if (!linked8.Contains(relation.File))
|
||||
{
|
||||
linked8.Add(relation.File);
|
||||
continue;
|
||||
}
|
||||
if (!linked9.Contains(relation.File))
|
||||
{
|
||||
linked9.Add(relation.File);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
ReadOnlyDictionary<string, string> movedFiles = MoveFiles(locationContainerDebugDirectory, isCounterPersonYear, displayDirectoryName, linked1, linked2, linked3, linked4, linked5, linked6, linked7, linked8, linked9);
|
||||
result = new(relationContainers, new(linked1), new(linked2), new(linked3), new(linked4), new(linked5), new(linked6), new(linked7), new(linked8), new(linked9), movedFiles);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static void WriteFile(int take, long personKey, bool isCounterPersonYear, string personKeyFormatted, string? displayDirectoryName, string directory, long ticks, Uri uri, RelationCollection relationCollection)
|
||||
{
|
||||
string a;
|
||||
string b;
|
||||
int years;
|
||||
string text;
|
||||
string? file;
|
||||
Relation relation;
|
||||
string markDownFile;
|
||||
FileHolder fileHolder;
|
||||
string originalString;
|
||||
List<string> lines = new();
|
||||
string fileNameWithoutExtension;
|
||||
foreach ((FileHolder relationFileHolder, ReadOnlyCollection<Relation> relations) in relationCollection.RelationContainers)
|
||||
{
|
||||
lines.Clear();
|
||||
if (relationCollection.MovedFiles.TryGetValue(relationFileHolder.FullName, out file))
|
||||
fileHolder = new(file);
|
||||
else
|
||||
fileHolder = new(relationFileHolder.FullName);
|
||||
if (!relationFileHolder.Exists || relationFileHolder.CreationTime is null)
|
||||
continue;
|
||||
if (isCounterPersonYear)
|
||||
(years, _) = IAge.GetAge(ticks, relationFileHolder.CreationTime.Value.Ticks);
|
||||
else
|
||||
(years, _) = IAge.GetAge(relationFileHolder.CreationTime.Value.Ticks, personKey);
|
||||
fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileHolder.NameWithoutExtension);
|
||||
markDownFile = $"{fileNameWithoutExtension}.md";
|
||||
lines.Add("---");
|
||||
lines.Add("type: \"distance\"");
|
||||
lines.Add("---");
|
||||
lines.Add(string.Empty);
|
||||
if (displayDirectoryName is null)
|
||||
lines.Add($"## {personKeyFormatted}");
|
||||
else
|
||||
lines.Add($"## {displayDirectoryName}");
|
||||
lines.Add(string.Empty);
|
||||
lines.Add($").OriginalString})");
|
||||
lines.Add($"__{fileNameWithoutExtension}__");
|
||||
if (isCounterPersonYear)
|
||||
lines.Add($"#{years}yrs-ago");
|
||||
else
|
||||
lines.Add($"#{years}yrs-old");
|
||||
lines.Add($"~~{relations.Count}~~");
|
||||
lines.Add(string.Empty);
|
||||
for (int i = 0; i < relations.Count; i++)
|
||||
{
|
||||
relation = relations[i];
|
||||
if (relationCollection.MovedFiles.TryGetValue(relation.File, out file))
|
||||
fileHolder = new(file);
|
||||
else
|
||||
fileHolder = new(relation.File);
|
||||
if (!fileHolder.Exists || fileHolder.CreationTime is null)
|
||||
continue;
|
||||
fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileHolder.NameWithoutExtension);
|
||||
originalString = uri.MakeRelativeUri(new(fileHolder.FullName)).OriginalString;
|
||||
if (i < take)
|
||||
(a, b) = ("[[", "]]");
|
||||
else
|
||||
(a, b) = ("~~", "~~");
|
||||
lines.Add($"{Environment.NewLine}{a}{fileNameWithoutExtension}{b}");
|
||||
lines.Add(string.Empty);
|
||||
}
|
||||
text = string.Join(Environment.NewLine, lines);
|
||||
File.WriteAllText(Path.Combine(directory, markDownFile), text);
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
internal static void SaveMappedRelations(Configuration configuration, Shared.Models.Methods.IDistance<MetadataExtractor.Directory> distance, string a2PeopleContentDirectory, string eDistanceContentDirectory, long ticks, List<LocationContainer<MetadataExtractor.Directory>> locationContainers, ReadOnlyDictionary<string, PersonContainer> readOnlyPersonKeyFormattedToPersonContainer, ReadOnlyDictionary<long, List<PersonContainer>> readOnlyPersonKeyToPersonContainerCollection)
|
||||
{
|
||||
int take;
|
||||
string directory;
|
||||
bool isCounterPersonYear;
|
||||
string personKeyFormatted;
|
||||
string? displayDirectoryName;
|
||||
Uri uri = new(eDistanceContentDirectory);
|
||||
RelationCollection relationCollection;
|
||||
ReadOnlyCollection<RelationContainer> relationContainers;
|
||||
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 };
|
||||
ReadOnlyCollection<ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>>> collections = GetCollections(locationContainers);
|
||||
using ProgressBar progressBar = new(collections.Count, message, options);
|
||||
foreach (ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>> collection in collections)
|
||||
{
|
||||
if (configuration.LocationContainerDistanceTolerance is null)
|
||||
break;
|
||||
progressBar.Tick();
|
||||
if (collection.Count == 0)
|
||||
continue;
|
||||
take = GetTake(configuration.LocationContainerDistanceTake, collection.Count);
|
||||
isCounterPersonYear = IPersonBirthday.IsCounterPersonYear(new DateTime(collection[0].PersonKey).Year);
|
||||
personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, collection[0].PersonKey);
|
||||
displayDirectoryName = GetDisplayDirectoryName(readOnlyPersonKeyToPersonContainerCollection, readOnlyPersonKeyFormattedToPersonContainer, collection[0].PersonKey, personKeyFormatted);
|
||||
directory = Path.Combine(a2PeopleContentDirectory, $"{ticks}-{configuration.LocationContainerDistanceTolerance.Value}", personKeyFormatted);
|
||||
if (!Directory.Exists(directory))
|
||||
_ = Directory.CreateDirectory(directory);
|
||||
WriteVsCodeFiles(eDistanceContentDirectory, displayDirectoryName, directory);
|
||||
relationContainers = distance.GetRelationContainers(configuration.FaceDistancePermyriad, configuration.LocationContainerDistanceTake, configuration.LocationContainerDistanceTolerance.Value, collection);
|
||||
relationCollection = GetMappedRelationCollection(configuration.LocationContainerDebugDirectory, take, isCounterPersonYear, displayDirectoryName, relationContainers);
|
||||
WriteFile(take, collection[0].PersonKey, isCounterPersonYear, personKeyFormatted, displayDirectoryName, directory, ticks, uri, relationCollection);
|
||||
}
|
||||
if (string.IsNullOrEmpty(configuration.LocationContainerDebugDirectory))
|
||||
_ = IPath.DeleteEmptyDirectories(eDistanceContentDirectory);
|
||||
else
|
||||
AddDisplayDirectoryNames(configuration, eDistanceContentDirectory, readOnlyPersonKeyFormattedToPersonContainer, readOnlyPersonKeyToPersonContainerCollection, collections);
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user