From f540cac46226758fbb3e39229b712750fe5d560f Mon Sep 17 00:00:00 2001 From: Mike Phares Date: Thu, 21 Sep 2023 20:43:28 -0700 Subject: [PATCH] LocationContainerDistanceGroupMinimum --- Face/Models/_D_Face.cs | 12 +- Instance/DlibDotNet.cs | 1 + Instance/Models/Binder/Configuration.cs | 3 + Instance/Models/Configuration.cs | 1 + Map/Models/Configuration.cs | 1 + Map/Models/Stateless/DecadeLogic.cs | 21 ++- Map/Models/Stateless/MapLogic.cs | 16 +- Map/Models/Stateless/Methods/IMapLogic.cs | 2 +- Map/Models/Stateless/RelationLogic.cs | 214 +++++++++++++--------- Shared/.vscode/tasks.json | 6 + Shared/Models/LocationContainer.cs | 17 +- 11 files changed, 190 insertions(+), 104 deletions(-) diff --git a/Face/Models/_D_Face.cs b/Face/Models/_D_Face.cs index 95f5b1c..c37d623 100644 --- a/Face/Models/_D_Face.cs +++ b/Face/Models/_D_Face.cs @@ -307,7 +307,17 @@ public class D_Face if (location is null) continue; if (!results.Any(l => l.WholePercentages == locationContainer.WholePercentages)) - results.Add(new(locationContainer.FromDistanceContent, locationContainer.DirectoryNumber, locationContainer.File, locationContainer.PersonKey, locationContainer.DisplayDirectoryName, locationContainer.Id, locationContainer.WholePercentages, locationContainer.Directories, rectangle.Value, location)); + results.Add(new(locationContainer.CreationDateOnly, + locationContainer.Directories, + locationContainer.DirectoryNumber, + locationContainer.DisplayDirectoryName, + locationContainer.File, + locationContainer.FromDistanceContent, + locationContainer.Id, + location, + locationContainer.PersonKey, + rectangle.Value, + locationContainer.WholePercentages)); } } if (results.Count > 0) diff --git a/Instance/DlibDotNet.cs b/Instance/DlibDotNet.cs index 13e04ee..6bd28dd 100644 --- a/Instance/DlibDotNet.cs +++ b/Instance/DlibDotNet.cs @@ -844,6 +844,7 @@ public partial class DlibDotNet configuration.FaceDistancePermyriad, configuration.LocationContainerDebugDirectory, configuration.LocationContainerDirectoryPattern, + configuration.LocationContainerDistanceGroupMinimum, configuration.LocationContainerDistanceTake, configuration.LocationContainerDistanceTolerance, configuration.LocationDigits, diff --git a/Instance/Models/Binder/Configuration.cs b/Instance/Models/Binder/Configuration.cs index ba36a42..0f6df18 100644 --- a/Instance/Models/Binder/Configuration.cs +++ b/Instance/Models/Binder/Configuration.cs @@ -34,6 +34,7 @@ public class Configuration public bool? LoadPhotoPrismLocations { get; set; } public string? LocationContainerDebugDirectory { get; set; } public string? LocationContainerDirectoryPattern { get; set; } + public int? LocationContainerDistanceGroupMinimum { get; set; } public int? LocationContainerDistanceTake { get; set; } public float? LocationContainerDistanceTolerance { get; set; } public int? LocationDigits { get; set; } @@ -135,6 +136,7 @@ public class Configuration if (configuration?.LoadPhotoPrismLocations is null) throw new NullReferenceException(nameof(configuration.LoadPhotoPrismLocations)); if (configuration?.LocationContainerDebugDirectory is null) throw new NullReferenceException(nameof(configuration.LocationContainerDebugDirectory)); if (configuration?.LocationContainerDirectoryPattern is null) throw new NullReferenceException(nameof(configuration.LocationContainerDirectoryPattern)); + if (configuration?.LocationContainerDistanceGroupMinimum is null) throw new NullReferenceException(nameof(configuration.LocationContainerDistanceGroupMinimum)); if (configuration?.LocationContainerDistanceTake is null) throw new NullReferenceException(nameof(configuration.LocationContainerDistanceTake)); // if (configuration?.LocationContainerDistanceTolerance is null) throw new NullReferenceException(nameof(configuration.LocationContainerDistanceTolerance)); if (configuration?.LocationDigits is null) throw new NullReferenceException(nameof(configuration.LocationDigits)); @@ -223,6 +225,7 @@ public class Configuration configuration.LoadPhotoPrismLocations.Value, configuration.LocationContainerDebugDirectory, configuration.LocationContainerDirectoryPattern, + configuration.LocationContainerDistanceGroupMinimum.Value, configuration.LocationContainerDistanceTake.Value, configuration.LocationContainerDistanceTolerance, configuration.LocationDigits.Value, diff --git a/Instance/Models/Configuration.cs b/Instance/Models/Configuration.cs index 2303204..2e43b18 100644 --- a/Instance/Models/Configuration.cs +++ b/Instance/Models/Configuration.cs @@ -28,6 +28,7 @@ public record Configuration(Property.Models.Configuration PropertyConfiguration, bool LoadPhotoPrismLocations, string LocationContainerDebugDirectory, string LocationContainerDirectoryPattern, + int LocationContainerDistanceGroupMinimum, int LocationContainerDistanceTake, float? LocationContainerDistanceTolerance, int LocationDigits, diff --git a/Map/Models/Configuration.cs b/Map/Models/Configuration.cs index 550da0a..afbf9af 100644 --- a/Map/Models/Configuration.cs +++ b/Map/Models/Configuration.cs @@ -7,6 +7,7 @@ public record Configuration(bool DeletePossibleDuplicates, int FaceDistancePermyriad, string LocationContainerDebugDirectory, string LocationContainerDirectoryPattern, + int LocationContainerDistanceGroupMinimum, int LocationContainerDistanceTake, float? LocationContainerDistanceTolerance, int LocationDigits, diff --git a/Map/Models/Stateless/DecadeLogic.cs b/Map/Models/Stateless/DecadeLogic.cs index 786ef8e..4d9578a 100644 --- a/Map/Models/Stateless/DecadeLogic.cs +++ b/Map/Models/Stateless/DecadeLogic.cs @@ -6,11 +6,20 @@ namespace View_by_Distance.Map.Models.Stateless; internal abstract class DecadeLogic { - internal static string GetDecade(MappingFromItem mappingFromItem) + internal static string GetDecade(MappingFromItem? mappingFromItem, DateOnly? dateOnly) { string result; string year; - if (mappingFromItem.DateTimeOriginal is null) + if (mappingFromItem is null && dateOnly is null) + throw new NotSupportedException(); + if (dateOnly is not null) + { + year = dateOnly.Value.Year.ToString(); + result = year[3] > '4' ? $"#{year[..3]}+" : $"#{year[..3]}-"; + } + else if (mappingFromItem is null) + throw new NotSupportedException(); + else if (mappingFromItem.DateTimeOriginal is null) { year = mappingFromItem.MinimumDateTime.Year.ToString(); result = year[3] > '4' ? $"#{year[..3]}+" : $"#{year[..3]}-"; @@ -26,7 +35,6 @@ internal abstract class DecadeLogic internal static void SetCreationTimeMaybeMoveToDecade(Property.Models.Configuration propertyConfiguration, bool moveToDecade, MappingFromItem mappingFromItem, ReadOnlyCollection> locationContainers) { DateTime dateTime; - FileInfo fileInfo; string halfDecade; string checkDirectory; string? yearDirectory; @@ -37,11 +45,10 @@ internal abstract class DecadeLogic string? personKeyFormattedDirectoryName; foreach (LocationContainer locationContainer in locationContainers) { - fileInfo = new(locationContainer.File); - if (!fileInfo.Exists) + if (!File.Exists(locationContainer.File)) continue; dateTime = mappingFromItem.DateTimeOriginal is null ? mappingFromItem.MinimumDateTime : mappingFromItem.DateTimeOriginal.Value; - if (fileInfo.CreationTime != dateTime) + if (locationContainer.CreationDateOnly.Year != dateTime.Year || locationContainer.CreationDateOnly.Month != dateTime.Month || locationContainer.CreationDateOnly.Day != dateTime.Day) File.SetCreationTime(locationContainer.File, dateTime); if (!moveToDecade) continue; @@ -59,7 +66,7 @@ internal abstract class DecadeLogic personKeyFormattedDirectoryName = Path.GetFileName(personKeyFormattedDirectory); if (personKeyFormattedDirectoryName.Length != propertyConfiguration.PersonBirthdayFormat.Length) break; - halfDecade = GetDecade(mappingFromItem); + halfDecade = GetDecade(mappingFromItem, null); if (halfDecade == yearDirectoryName) continue; checkDirectory = Path.Combine(personKeyFormattedDirectory, halfDecade, personNameDirectoryName); diff --git a/Map/Models/Stateless/MapLogic.cs b/Map/Models/Stateless/MapLogic.cs index aba8235..8ed3bee 100644 --- a/Map/Models/Stateless/MapLogic.cs +++ b/Map/Models/Stateless/MapLogic.cs @@ -1,4 +1,4 @@ -using ShellProgressBar; +using ShellProgressBar; using System.Collections.ObjectModel; using System.Diagnostics; using System.Drawing; @@ -475,6 +475,7 @@ internal abstract class MapLogic private static void ParallelFor(Configuration configuration, Dictionary> skipCollection, List> locationContainers, MappedFile mappedFile) { string checkFile; + DateOnly dateOnly; string[] fileMatches; const string lnk = ".lnk"; int? id, wholePercentages; @@ -502,6 +503,7 @@ internal abstract class MapLogic continue; } } + dateOnly = DateOnly.FromDateTime(new FileInfo(mappedFile.File).CreationTime); if (mappedFile.File.EndsWith(lnk) || (!configuration.DistanceMoveUnableToMatch && !configuration.DistanceRenameToMatch) || !File.Exists(mappedFile.File)) directories = new List(); else @@ -509,7 +511,17 @@ internal abstract class MapLogic RectangleF? rectangle = ILocation.GetPercentagesRectangle(configuration.LocationDigits, wholePercentages.Value); personDisplayDirectoryName = mappedFile.PersonDisplayDirectoryName is null ? configuration.MappingDefaultName : mappedFile.PersonDisplayDirectoryName; lock (locationContainers) - locationContainers.Add(new(fromDistanceContent, mappedFile.DirectoryNumber, mappedFile.File, mappedFile.PersonKey, personDisplayDirectoryName, id.Value, wholePercentages.Value, directories, rectangle, null)); + locationContainers.Add(new(dateOnly, + directories, + mappedFile.DirectoryNumber, + personDisplayDirectoryName, + mappedFile.File, + fromDistanceContent, + id.Value, + null, + mappedFile.PersonKey, + rectangle, + wholePercentages.Value)); } private static void LookForPossibleDuplicates(Configuration configuration, ReadOnlyCollection> locationContainers) diff --git a/Map/Models/Stateless/Methods/IMapLogic.cs b/Map/Models/Stateless/Methods/IMapLogic.cs index 4b6fcf8..e8fd965 100644 --- a/Map/Models/Stateless/Methods/IMapLogic.cs +++ b/Map/Models/Stateless/Methods/IMapLogic.cs @@ -48,6 +48,6 @@ public interface IMapLogic string TestStatic_GetDecade(Shared.Models.MappingFromItem mappingFromItem) => GetDecade(mappingFromItem); static string GetDecade(Shared.Models.MappingFromItem mappingFromItem) => - DecadeLogic.GetDecade(mappingFromItem); + DecadeLogic.GetDecade(mappingFromItem, null); } \ No newline at end of file diff --git a/Map/Models/Stateless/RelationLogic.cs b/Map/Models/Stateless/RelationLogic.cs index 491eadf..5c517aa 100644 --- a/Map/Models/Stateless/RelationLogic.cs +++ b/Map/Models/Stateless/RelationLogic.cs @@ -8,46 +8,86 @@ namespace View_by_Distance.Map.Models.Stateless; internal abstract class RelationLogic { - internal record RelationCollection(ReadOnlyCollection RelationContainers, - ReadOnlyCollection Linked1, - ReadOnlyCollection Linked2, - ReadOnlyCollection Linked3, - ReadOnlyCollection Linked4, - ReadOnlyCollection Linked5, - ReadOnlyCollection Linked6, - ReadOnlyCollection Linked7, - ReadOnlyCollection Linked8, - ReadOnlyCollection Linked9, - ReadOnlyDictionary MovedFiles); + internal record Group(string Key, long PersonKey, ReadOnlyCollection> RelationContainersCollection); - private static ReadOnlyCollection>> GetCollections(Configuration configuration, List> locationContainers) + private static Dictionary>>> GetPersonKeyTo(Configuration configuration, List> locationContainers) { - List>> results = new(); List>? collection; - Dictionary>> keyValuePairs = new(); + Dictionary>>? yearTo; + Dictionary>>> personKeyTo = new(); foreach (LocationContainer locationContainer in locationContainers) { if (!locationContainer.FromDistanceContent) continue; if (!locationContainer.File.Contains(configuration.LocationContainerDirectoryPattern)) continue; - if (!keyValuePairs.TryGetValue(locationContainer.PersonKey, out collection)) + if (!personKeyTo.TryGetValue(locationContainer.PersonKey, out yearTo)) { - keyValuePairs.Add(locationContainer.PersonKey, new()); - if (!keyValuePairs.TryGetValue(locationContainer.PersonKey, out collection)) + personKeyTo.Add(locationContainer.PersonKey, new()); + if (!personKeyTo.TryGetValue(locationContainer.PersonKey, out yearTo)) + throw new Exception(); + } + if (!yearTo.TryGetValue(locationContainer.CreationDateOnly.Year, out collection)) + { + yearTo.Add(locationContainer.CreationDateOnly.Year, new()); + if (!yearTo.TryGetValue(locationContainer.CreationDateOnly.Year, out collection)) throw new Exception(); } collection.Add(locationContainer); } - foreach (KeyValuePair>> keyValuePair in keyValuePairs) - results.Add(new(keyValuePair.Value)); + return personKeyTo; + } + + private static ReadOnlyCollection GetGroups(Configuration configuration, List> locationContainers) + { + List results = new(); + string key; + int lastIndex; + List years = new(); + List indices = new(); + List<(int Index, int Year)> sort = new(); + List> collection = new(); + KeyValuePair>> keyValue; + Dictionary>>> personKeyTo = GetPersonKeyTo(configuration, locationContainers); + foreach (KeyValuePair>>> keyValuePair in personKeyTo) + { + sort.Clear(); + years.Clear(); + indices.Clear(); + for (int i = 0; i < keyValuePair.Value.Count; i++) + sort.Add(new(i, keyValuePair.Value.ElementAt(i).Key)); + if (sort.Count == 0) + continue; + foreach ((int index, int _) in sort.OrderBy(l => l.Year)) + indices.Add(index); + lastIndex = indices[^1]; + foreach (int index in indices) + { + keyValue = keyValuePair.Value.ElementAt(index); + if (keyValue.Value.Count == 0) + continue; + years.Add(keyValue.Key); + collection.AddRange(keyValue.Value); + if (index != lastIndex && years.Count < 6 && years.Sum() > configuration.LocationContainerDistanceGroupMinimum) + continue; + if (years.Count == 1) + key = keyValue.Key.ToString(); + else + key = $"{years.Min()}-{keyValue.Key}"; + if (collection.Count == 0) + continue; + results.Add(new(key, collection[0].PersonKey, new(collection))); + collection = new(); + years.Clear(); + } + } return new(results); } - private static ReadOnlyDictionary MoveFiles(Configuration configuration, bool isCounterPersonYear, string? displayDirectoryName, List linked1, List linked2, List linked3, List linked4, List linked5, List linked6, List linked7, List linked8, List linked9) + private static ReadOnlyDictionary MoveFiles(Configuration configuration, string key, bool isCounterPersonYear, string? displayDirectoryName, ReadOnlyCollection relationContainers, List linked1, List linked2, List linked3, List linked4, List linked5, List linked6, List linked7, List linked8, List linked9) { Dictionary results = new(); - char c; + string value; string checkFile; string debugFile; string checkDirectory; @@ -56,44 +96,42 @@ internal abstract class RelationLogic string? maybeTicksDirectoryName; string? personNameDirectoryName; string? personKeyFormattedDirectory; - Dictionary 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 keyValuePair in fullNameToCount) + foreach ((FileHolder fileHolder, _) in relationContainers) { - personNameDirectory = Path.GetDirectoryName(keyValuePair.Key); + personNameDirectory = fileHolder.DirectoryName; 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 (linked9.Contains(fileHolder.FullName)) + value = "JJJ"; + else if (linked8.Contains(fileHolder.FullName)) + value = "III"; + else if (linked7.Contains(fileHolder.FullName)) + value = "HHH"; + else if (linked6.Contains(fileHolder.FullName)) + value = "GGG"; + else if (linked5.Contains(fileHolder.FullName)) + value = "FFF"; + else if (linked4.Contains(fileHolder.FullName)) + value = "EEE"; + else if (linked3.Contains(fileHolder.FullName)) + value = "DDD"; + else if (linked2.Contains(fileHolder.FullName)) + value = "CCC"; + else if (linked1.Contains(fileHolder.FullName)) + value = "BBB"; + else + value = "AAA"; if (maybeTicksDirectoryName == configuration.LocationContainerDebugDirectory) - checkDirectory = Path.Combine(yearDirectory, $"{keyValuePair.Value}{new string(c, 7)}"); + checkDirectory = Path.Combine(yearDirectory, $"{key}-{value}"); else { if (!string.IsNullOrEmpty(configuration.LocationContainerDebugDirectory)) continue; - checkDirectory = Path.Combine(personKeyFormattedDirectory, $"{keyValuePair.Value}{new string(c, 7)}"); + checkDirectory = Path.Combine(personKeyFormattedDirectory, $"{key}-{value}"); } if (maybeTicksDirectoryName != configuration.LocationContainerDebugDirectory) { @@ -106,15 +144,15 @@ internal abstract class RelationLogic continue; if (!Directory.Exists(checkDirectory)) _ = Directory.CreateDirectory(checkDirectory); - checkFile = Path.Combine(checkDirectory, Path.GetFileName(keyValuePair.Key)); + checkFile = Path.Combine(checkDirectory, fileHolder.Name); if (File.Exists(checkFile)) continue; - results.Add(keyValuePair.Key, checkFile); - File.Move(keyValuePair.Key, checkFile); - debugFile = $"{keyValuePair.Key[..^4]}.gif"; + results.Add(fileHolder.FullName, checkFile); + File.Move(fileHolder.FullName, checkFile); + debugFile = $"{fileHolder.FullName[..^4]}.gif"; if (File.Exists(debugFile)) { - checkFile = Path.Combine(checkDirectory, $"{Path.GetFileName(keyValuePair.Key)[..^4]}.gif"); + checkFile = Path.Combine(checkDirectory, $"{Path.GetFileName(fileHolder.FullName)[..^4]}.gif"); if (File.Exists(checkFile)) continue; File.Move(debugFile, checkFile); @@ -190,9 +228,9 @@ internal abstract class RelationLogic _ = IPath.WriteAllText(Path.Combine(vsCodeDirectory, "tasks.json"), json, updateDateWhenMatches: false, compareBeforeWrite: true, updateToWhenMatches: null); } - private static RelationCollection GetMappedRelationCollection(Configuration configuration, int take, bool isCounterPersonYear, string? displayDirectoryName, ReadOnlyCollection relationContainers) + private static ReadOnlyDictionary GetMoveFiles(Configuration configuration, string key, int take, bool isCounterPersonYear, string? displayDirectoryName, ReadOnlyCollection relationContainers) { - RelationCollection result; + ReadOnlyDictionary results; List linked1 = new(); List linked2 = new(); List linked3 = new(); @@ -253,12 +291,11 @@ internal abstract class RelationLogic } } } - ReadOnlyDictionary movedFiles = MoveFiles(configuration, 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; + results = MoveFiles(configuration, key, isCounterPersonYear, displayDirectoryName, relationContainers, linked1, linked2, linked3, linked4, linked5, linked6, linked7, linked8, linked9); + return results; } - private static void WriteFile(int take, long personKey, bool isCounterPersonYear, string personKeyFormatted, string? displayDirectoryName, string directory, long ticks, Uri uri, RelationCollection relationCollection) + private static void WriteFile(int take, long personKey, bool isCounterPersonYear, string personKeyFormatted, string? displayDirectoryName, string directory, long ticks, Uri uri, ReadOnlyCollection relationContainers, ReadOnlyDictionary movedFiles) { string a; string b; @@ -271,10 +308,10 @@ internal abstract class RelationLogic string originalString; List lines = new(); string fileNameWithoutExtension; - foreach ((FileHolder relationFileHolder, ReadOnlyCollection relations) in relationCollection.RelationContainers) + foreach ((FileHolder relationFileHolder, ReadOnlyCollection relations) in relationContainers) { lines.Clear(); - if (relationCollection.MovedFiles.TryGetValue(relationFileHolder.FullName, out file)) + if (movedFiles.TryGetValue(relationFileHolder.FullName, out file)) fileHolder = new(file); else fileHolder = new(relationFileHolder.FullName); @@ -295,18 +332,18 @@ internal abstract class RelationLogic else lines.Add($"## {displayDirectoryName}"); lines.Add(string.Empty); - lines.Add($"![0]({uri.MakeRelativeUri(new(relationFileHolder.FullName)).OriginalString})"); - lines.Add($"__{fileNameWithoutExtension}__"); + lines.Add($"![0]({uri.MakeRelativeUri(new(fileHolder.FullName)).OriginalString})"); + lines.Add($"- __{fileNameWithoutExtension}__"); if (isCounterPersonYear) - lines.Add($"#{years}yrs-ago"); + lines.Add($"- #{years}yrs-ago"); else - lines.Add($"#{years}yrs-old"); - lines.Add($"~~{relations.Count}~~"); + 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)) + if (movedFiles.TryGetValue(relation.File, out file)) fileHolder = new(file); else fileHolder = new(relation.File); @@ -321,30 +358,37 @@ internal abstract class RelationLogic lines.Add($"![{relation.DistancePermyriad}]({originalString}){Environment.NewLine}{a}{fileNameWithoutExtension}{b}"); lines.Add(string.Empty); } + lines.Add(""); text = string.Join(Environment.NewLine, lines); File.WriteAllText(Path.Combine(directory, markDownFile), text); } } - private static void AddDisplayDirectoryNames(Configuration configuration, string eDistanceContentDirectory, ReadOnlyDictionary readOnlyPersonKeyFormattedToPersonContainer, ReadOnlyDictionary> readOnlyPersonKeyToPersonContainerCollection, ReadOnlyCollection>> collections) + private static void AddDisplayDirectoryNames(Configuration configuration, string eDistanceContentDirectory, ReadOnlyDictionary readOnlyPersonKeyFormattedToPersonContainer, ReadOnlyDictionary> readOnlyPersonKeyToPersonContainerCollection, ReadOnlyCollection groups) { bool isCounterPersonYear; string personKeyFormatted; string? displayDirectoryName; string? checkDirectory = Path.Combine(eDistanceContentDirectory, configuration.LocationContainerDebugDirectory); _ = IPath.DeleteEmptyDirectories(checkDirectory); - foreach (ReadOnlyCollection> collection in collections) + foreach (Group group in groups) { if (configuration.LocationContainerDistanceTolerance is null) break; - isCounterPersonYear = IPersonBirthday.IsCounterPersonYear(new DateTime(collection[0].PersonKey).Year); + isCounterPersonYear = IPersonBirthday.IsCounterPersonYear(new DateTime(group.PersonKey).Year); if (isCounterPersonYear) continue; - personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, collection[0].PersonKey); + personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, group.PersonKey); checkDirectory = Path.Combine(eDistanceContentDirectory, configuration.LocationContainerDebugDirectory, personKeyFormatted); if (!Directory.Exists(checkDirectory)) continue; - displayDirectoryName = GetDisplayDirectoryName(readOnlyPersonKeyToPersonContainerCollection, readOnlyPersonKeyFormattedToPersonContainer, collection[0].PersonKey, personKeyFormatted); + displayDirectoryName = GetDisplayDirectoryName(readOnlyPersonKeyToPersonContainerCollection, readOnlyPersonKeyFormattedToPersonContainer, group.PersonKey, personKeyFormatted); if (string.IsNullOrEmpty(displayDirectoryName)) continue; foreach (string yearDirectory in Directory.GetDirectories(checkDirectory, "*", SearchOption.TopDirectoryOnly)) @@ -367,36 +411,36 @@ internal abstract class RelationLogic string personKeyFormatted; string? displayDirectoryName; Uri uri = new(eDistanceContentDirectory); - RelationCollection relationCollection; + ReadOnlyDictionary movedFiles; ReadOnlyCollection relationContainers; + ReadOnlyCollection 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 }; - ReadOnlyCollection>> collections = GetCollections(configuration, locationContainers); - using ProgressBar progressBar = new(collections.Count, message, options); - foreach (ReadOnlyCollection> collection in collections) + using ProgressBar progressBar = new(groups.Count, message, options); + foreach (Group group in groups) { if (configuration.LocationContainerDistanceTolerance is null) break; progressBar.Tick(); - if (collection.Count == 0) + if (group.RelationContainersCollection.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); + 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.FaceDistancePermyriad, configuration.LocationContainerDistanceTake, configuration.LocationContainerDistanceTolerance.Value, collection); - relationCollection = GetMappedRelationCollection(configuration, take, isCounterPersonYear, displayDirectoryName, relationContainers); - WriteFile(take, collection[0].PersonKey, isCounterPersonYear, personKeyFormatted, displayDirectoryName, directory, ticks, uri, relationCollection); + relationContainers = distance.GetRelationContainers(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, collections); + AddDisplayDirectoryNames(configuration, eDistanceContentDirectory, readOnlyPersonKeyFormattedToPersonContainer, readOnlyPersonKeyToPersonContainerCollection, groups); } } \ No newline at end of file diff --git a/Shared/.vscode/tasks.json b/Shared/.vscode/tasks.json index 45e4a9a..dd6bd2b 100644 --- a/Shared/.vscode/tasks.json +++ b/Shared/.vscode/tasks.json @@ -42,6 +42,12 @@ "type": "shell", "command": "& L:/DevOps/Mesa_FI/File-Folder-Helper/bin/Release/net7.0/win-x64/publish/File-Folder-Helper.exe s V L:/Git/View-by-Distance-MKLink-Console/Map/Models/Stateless", "problemMatcher": [] + }, + { + "label": "File-Folder-Helper AOT s Ticks", + "type": "shell", + "command": "& L:/DevOps/Mesa_FI/File-Folder-Helper/bin/Release/net7.0/win-x64/publish/File-Folder-Helper.exe s T 'D:/1-Images-A/Images-dd514b88-Results/E)Distance/dd514b88/('", + "problemMatcher": [] } ] } \ No newline at end of file diff --git a/Shared/Models/LocationContainer.cs b/Shared/Models/LocationContainer.cs index 67a7fec..6000c2a 100644 --- a/Shared/Models/LocationContainer.cs +++ b/Shared/Models/LocationContainer.cs @@ -2,13 +2,14 @@ using System.Drawing; namespace View_by_Distance.Shared.Models; -public record LocationContainer(bool FromDistanceContent, - int? DirectoryNumber, - string File, - long PersonKey, - string DisplayDirectoryName, - int Id, - int WholePercentages, +public record LocationContainer(DateOnly CreationDateOnly, IReadOnlyList Directories, + int? DirectoryNumber, + string DisplayDirectoryName, + string File, + bool FromDistanceContent, + int Id, + Location? Location, + long PersonKey, RectangleF? Rectangle, - Location? Location); \ No newline at end of file + int WholePercentages); \ No newline at end of file