diff --git a/Compare/Compare.cs b/Compare/Compare.cs index a9891d6..b406860 100644 --- a/Compare/Compare.cs +++ b/Compare/Compare.cs @@ -162,7 +162,7 @@ public class Compare } if (_IsEnvironment.Development && propertyConfiguration.PopulatePropertyId && !mapLogic.KeyValuePairs.Any()) throw new Exception("Copy keyValuePairs-####.json file"); - List containers = A_Property.Get(propertyConfiguration, propertyLogic); + Shared.Models.Container[] containers = A_Property.Get(propertyConfiguration, propertyLogic); if (!isSilent) { _Log.Information("First pass completed"); @@ -743,7 +743,7 @@ public class Compare } } - private void ThirdPassToMove(Property.Models.Configuration configuration, Model? model, PredictorModel? predictorModel, Map.Models.MapLogic mapLogic, A_Property propertyLogic, List containers, string aPropertyContentCollectionDirectory) + private void ThirdPassToMove(Property.Models.Configuration configuration, Model? model, PredictorModel? predictorModel, Map.Models.MapLogic mapLogic, A_Property propertyLogic, Shared.Models.Container[] containers, string aPropertyContentCollectionDirectory) { if (_Log is null) throw new NullReferenceException(nameof(_Log)); @@ -821,7 +821,7 @@ public class Compare } } - private void FourthPassCreateWindowsShortcuts(Property.Models.Configuration configuration, Model? model, PredictorModel? predictorModel, Map.Models.MapLogic mapLogic, A_Property propertyLogic, List containers, bool saveToCollection, bool keepAll) + private void FourthPassCreateWindowsShortcuts(Property.Models.Configuration configuration, Model? model, PredictorModel? predictorModel, Map.Models.MapLogic mapLogic, A_Property propertyLogic, Shared.Models.Container[] containers, bool saveToCollection, bool keepAll) { if (_Log is null) throw new NullReferenceException(nameof(_Log)); diff --git a/Date-Group/DateGroup.cs b/Date-Group/DateGroup.cs index 24d07ba..d58341d 100644 --- a/Date-Group/DateGroup.cs +++ b/Date-Group/DateGroup.cs @@ -61,7 +61,7 @@ public class DateGroup _ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(propertyConfiguration.RootDirectory); if (true || appSettings.MaxDegreeOfParallelism < 2) ticks = LogDelta(ticks, nameof(Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories)); - List containers = A_Property.Get(propertyConfiguration, propertyLogic); + Shared.Models.Container[] containers = A_Property.Get(propertyConfiguration, propertyLogic); if (configuration.ByCreateDateShortcut.HasValue && configuration.ByCreateDateShortcut.Value) CreateDateShortcut(propertyConfiguration, containers); else @@ -429,7 +429,7 @@ public class DateGroup _ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(_Configuration.PropertyConfiguration.RootDirectory); } - private static void CreateDateShortcut(Property.Models.Configuration configuration, List containers) + private static void CreateDateShortcut(Property.Models.Configuration configuration, Shared.Models.Container[] containers) { string path; string fileName; diff --git a/Instance/DlibDotNet.cs b/Instance/DlibDotNet.cs index 7f5acef..7d3ef08 100644 --- a/Instance/DlibDotNet.cs +++ b/Instance/DlibDotNet.cs @@ -18,6 +18,7 @@ public class DlibDotNet { private readonly D_Face _Faces; + private readonly bool _FirstRun; private readonly G_Index _Index; private readonly C_Resize _Resize; private readonly F_Random _Random; @@ -67,7 +68,15 @@ public class DlibDotNet _ArgZeroIsConfigurationRootDirectory = propertyConfiguration.RootDirectory == argZero; _Log.Information(configuration.ModelDirectory); (Model model, PredictorModel predictorModel, ModelParameter modelParameter) = GetModel(configuration); - if (!_ArgZeroIsConfigurationRootDirectory) + string propertyRoot = Property.Models.Stateless.IResult.GetResultsGroupDirectory(propertyConfiguration, nameof(A_Property), create: false); + if (Directory.Exists(propertyRoot)) + _FirstRun = false; + else + { + _FirstRun = true; + _ = Directory.CreateDirectory(propertyRoot); + } + if (_FirstRun || !_ArgZeroIsConfigurationRootDirectory) people = Array.Empty(); else people = _People.GetPeople(propertyConfiguration); @@ -90,8 +99,8 @@ public class DlibDotNet _Resize = new C_Resize(configuration.ForceResizeLastWriteTimeToCreationTime, configuration.OverrideForResizeImages, configuration.PropertiesChangedForResize, configuration.ValidResolutions, imageCodecInfo, encoderParameters, filenameExtension); } if (!configuration.SkipSearch) - Search(propertyConfiguration, configuration.Reverse, model, predictorModel, argZero, people, isSilent); - if (_Exceptions.Count == 0 && _ArgZeroIsConfigurationRootDirectory) + Search(propertyConfiguration, model, predictorModel, argZero, propertyRoot, people, isSilent); + if (!_FirstRun && _Exceptions.Count == 0 && _ArgZeroIsConfigurationRootDirectory) { long ticks = DateTime.Now.Ticks; List directoryCollections = _Rename.GetDirectoryRenameCollections(propertyConfiguration, model, predictorModel, relativePath: string.Empty, newDirectoryName: string.Empty, jsonFiles4InfoAny: false); @@ -110,7 +119,7 @@ public class DlibDotNet _Log.Information(message); if (_Exceptions.Count != 0) throw new Exception(message); - if (configuration.LoadOrCreateThenSaveDirectoryDistanceResultsForOutputResolutions.Any()) + if (!_FirstRun && configuration.LoadOrCreateThenSaveDirectoryDistanceResultsForOutputResolutions.Any()) { long ticks = DateTime.Now.Ticks; foreach (string outputResolution in configuration.LoadOrCreateThenSaveDirectoryDistanceResultsForOutputResolutions) @@ -118,6 +127,8 @@ public class DlibDotNet if (appSettings.MaxDegreeOfParallelism < 2) ticks = LogDelta(ticks, nameof(E_Distance.LoadOrCreateThenSaveDirectoryDistanceResultsForOutputResolutions)); } + if (_FirstRun) + _Log.Information("First run completed. Run again if wanted"); } private long LogDelta(long ticks, string? methodName) @@ -419,14 +430,15 @@ public class DlibDotNet } } - private void WriteGroup(Property.Models.Configuration configuration, A_Property propertyLogic, Shared.Models.Property[] propertyCollection, List>> metadataCollection, List> faceCollections, List> resizeKeyValuePairs, string sourceDirectory, string outputResolution, Item[] filteredItems) + private void WriteGroup(Property.Models.Configuration configuration, A_Property propertyLogic, Shared.Models.Property[] propertyCollection, List>> metadataCollection, List> faceCollections, List> resizeKeyValuePairs, string outputResolution, Container container, Item[] filteredItems) { Item item; string key; string json; string checkFile; - int sourceDirectoryLength = sourceDirectory.Length; - _FilePropertiesKeyValuePairs.Add(sourceDirectory, new List>()); + int sourceDirectoryLength = container.SourceDirectory.Length; + if (_ArgZeroIsConfigurationRootDirectory && outputResolution == _Configuration.OutputResolutions[0]) + _FilePropertiesKeyValuePairs.Add(container.SourceDirectory, new List>()); JsonSerializerOptions writeIndentedJsonSerializerOptions = new() { WriteIndented = false }; if (!(from l in propertyCollection where l?.Width is null select true).Any()) { @@ -435,7 +447,7 @@ public class DlibDotNet List> propertyCollectionKeyValuePairs = new(); List>> resizeKeyValuePairsCollections = new(); List>>> metadataCollectionKeyValuePairs = new(); - (int level, List directories) = Shared.Models.Stateless.Methods.IPath.Get(configuration.RootDirectory, sourceDirectory); + (int level, List directories) = Shared.Models.Stateless.Methods.IPath.Get(configuration.RootDirectory, container.SourceDirectory); string fileName = string.Concat(string.Join(configuration.FileNameDirectorySeparator, directories), ".json"); for (int i = 0; i < filteredItems.Length; i++) { @@ -445,8 +457,11 @@ public class DlibDotNet if (item.ImageFileHolder is null) continue; key = Shared.Models.Stateless.Methods.IPath.GetRelativePath(item.ImageFileHolder.FullName, sourceDirectoryLength); - _FileKeyValuePairs.Add(new KeyValuePair(sourceDirectory, key)); - _FilePropertiesKeyValuePairs[sourceDirectory].Add(new Tuple(key, propertyCollection[i])); + if (_ArgZeroIsConfigurationRootDirectory && outputResolution == _Configuration.OutputResolutions[0]) + { + _FileKeyValuePairs.Add(new KeyValuePair(container.SourceDirectory, key)); + _FilePropertiesKeyValuePairs[container.SourceDirectory].Add(new Tuple(key, propertyCollection[i])); + } faceCollectionsKeyValuePairs.Add(new KeyValuePair>(key, faceCollections[i])); propertyCollectionKeyValuePairs.Add(new KeyValuePair(key, propertyCollection[i])); resizeKeyValuePairsCollections.Add(new KeyValuePair>(key, resizeKeyValuePairs[i])); @@ -551,7 +566,7 @@ public class DlibDotNet converted: true)); } - private void FullDoWork(string argZero, Property.Models.Configuration configuration, Model? model, PredictorModel? predictorModel, long ticks, Map.Models.MapLogic mapLogic, A_Property propertyLogic, List containers) + private void FullDoWork(string argZero, Property.Models.Configuration configuration, Model? model, PredictorModel? predictorModel, string propertyRoot, long ticks, Map.Models.MapLogic mapLogic, A_Property propertyLogic, Container[] containers) { if (_Log is null) throw new NullReferenceException(nameof(_Log)); @@ -574,7 +589,6 @@ public class DlibDotNet List nullablePropertyCollection = new(); List>> metadataCollection = new(); string aPropertySingletonDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(configuration, nameof(A_Property), "{}"); - string propertyRoot = Property.Models.Stateless.IResult.GetResultsGroupDirectory(configuration, nameof(A_Property)); foreach (string outputResolution in _Configuration.OutputResolutions) { _FileKeyValuePairs.Clear(); @@ -596,7 +610,7 @@ public class DlibDotNet nullablePropertyCollection.Clear(); propertyFileHolderCollection.Clear(); SetAngleBracketCollections(configuration, propertyLogic, outputResolution, container, aResultsFullGroupDirectory, bResultsFullGroupDirectory, cResultsFullGroupDirectory, dResultsFullGroupDirectory); - exceptionCount = FullParallelWork(ticks, propertyLogic, outputResolution, bResultsFullGroupDirectory, cResultsFullGroupDirectory, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory, sourceDirectoryChanges, propertyFileHolderCollection, nullablePropertyCollection, metadataCollection, resizeKeyValuePairs, faceCollections, containers.Count, container, filteredItems); + exceptionCount = FullParallelWork(ticks, propertyLogic, outputResolution, bResultsFullGroupDirectory, cResultsFullGroupDirectory, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory, sourceDirectoryChanges, propertyFileHolderCollection, nullablePropertyCollection, metadataCollection, resizeKeyValuePairs, faceCollections, containers.Length, container, filteredItems); #pragma warning disable ids = (from l in filteredItems where l.Property?.Id is not null select l.Property.Id.Value).ToArray(); #pragma warning restore @@ -611,11 +625,11 @@ public class DlibDotNet filteredItems[i].Faces.AddRange(from l in faceCollections[i] select l); propertyCollection = (from l in nullablePropertyCollection where l is not null select l).ToArray(); if (_ArgZeroIsConfigurationRootDirectory && exceptionCount == 0) - WriteGroup(configuration, propertyLogic, propertyCollection, metadataCollection, faceCollections, resizeKeyValuePairs, container.SourceDirectory, outputResolution, filteredItems); + WriteGroup(configuration, propertyLogic, propertyCollection, metadataCollection, faceCollections, resizeKeyValuePairs, outputResolution, container, filteredItems); if (_ArgZeroIsConfigurationRootDirectory && exceptionCount == 0 && outputResolution == _Configuration.OutputResolutions[0]) mapLogic.AddToMapLogicAllCollection(filteredItems); if (exceptionCount == 0 && _Configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions.Contains(outputResolution)) - _Distance.LoadOrCreateThenSaveDistanceResults(configuration, eResultsFullGroupDirectory, container.SourceDirectory, outputResolution, sourceDirectoryChanges, filteredItems); + _Distance.LoadOrCreateThenSaveDistanceResults(configuration, eResultsFullGroupDirectory, outputResolution, container, sourceDirectoryChanges, filteredItems); if (Directory.GetFiles(propertyRoot, "*.txt", SearchOption.TopDirectoryOnly).Any()) { for (int y = 0; y < int.MaxValue; y++) @@ -672,11 +686,11 @@ public class DlibDotNet return results; } - private void Search(Property.Models.Configuration configuration, bool reverse, Model? model, PredictorModel? predictorModel, string argZero, Person[] people, bool isSilent) + private void Search(Property.Models.Configuration configuration, Model? model, PredictorModel? predictorModel, string argZero, string propertyRoot, Person[] people, bool isSilent) { if (_Log is null) throw new NullReferenceException(nameof(_Log)); - List containers; + Container[] containers; long ticks = DateTime.Now.Ticks; string aResultsFullGroupDirectory; string bResultsFullGroupDirectory; @@ -687,14 +701,16 @@ public class DlibDotNet string d2ResultsFullGroupDirectory; Dictionary personKeyValuePairs = A2_People.Convert(people); Map.Models.MapLogic mapLogic = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _Resize.FilenameExtension, personKeyValuePairs); - A_Property propertyLogic = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _Resize.FilenameExtension, reverse, model, predictorModel, mapLogic.IndicesFromNew, mapLogic.KeyValuePairs); + A_Property propertyLogic = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _Resize.FilenameExtension, _Configuration.Reverse, model, predictorModel, mapLogic.IndicesFromNew, mapLogic.KeyValuePairs); if (string.IsNullOrEmpty(configuration.RootDirectory)) containers = A_Property.Get(configuration, propertyLogic); else - containers = Property.Models.Stateless.Container.GetContainers(configuration, propertyLogic); - FullDoWork(argZero, configuration, model, predictorModel, ticks, mapLogic, propertyLogic, containers); + containers = Property.Models.Stateless.Container.GetContainers(configuration, _FirstRun, propertyLogic); + FullDoWork(argZero, configuration, model, predictorModel, propertyRoot, ticks, mapLogic, propertyLogic, containers); foreach (string outputResolution in _Configuration.OutputResolutions) { + if (_FirstRun) + break; (aResultsFullGroupDirectory, bResultsFullGroupDirectory, cResultsFullGroupDirectory, dResultsFullGroupDirectory, d2ResultsFullGroupDirectory, eResultsFullGroupDirectory, zResultsFullGroupDirectory) = GetResultsFullGroupDirectories(configuration, model, predictorModel, outputResolution); if (_ArgZeroIsConfigurationRootDirectory && _Exceptions.Count == 0 && outputResolution == _Configuration.OutputResolutions[0]) { diff --git a/Instance/Models/_E_Distance.cs b/Instance/Models/_E_Distance.cs index 6d44663..4b6ac29 100644 --- a/Instance/Models/_E_Distance.cs +++ b/Instance/Models/_E_Distance.cs @@ -173,7 +173,7 @@ internal class E_Distance } } - internal void LoadOrCreateThenSaveDistanceResults(Property.Models.Configuration configuration, string eResultsFullGroupDirectory, string sourceDirectory, string outputResolution, List> sourceDirectoryChanges, Item[] filteredItems) + internal void LoadOrCreateThenSaveDistanceResults(Property.Models.Configuration configuration, string eResultsFullGroupDirectory, string outputResolution, Container container, List> sourceDirectoryChanges, Item[] filteredItems) { Item item; string json; @@ -194,7 +194,7 @@ internal class E_Distance List dateTimes = (from l in sourceDirectoryChanges where changesFrom.Contains(l.Item1) select l.Item2).ToList(); List directoryInfoCollection = Property.Models.Stateless.IResult.GetDirectoryInfoCollection( configuration, - sourceDirectory, + container.SourceDirectory, eResultsFullGroupDirectory, contentDescription: ".tvs File", singletonDescription: string.Empty, @@ -652,7 +652,7 @@ internal class E_Distance return results; } - internal Dictionary> ParallelWork(int maxDegreeOfParallelism, string[] ignoreRelativePaths, string argZero, long ticks, List containers) + internal Dictionary> ParallelWork(int maxDegreeOfParallelism, string[] ignoreRelativePaths, string argZero, long ticks, Container[] containers) { Dictionary> results; Dictionary> keyValuePairs = Map.Models.Stateless.IMapLogic.GetKeyValuePairs(ignoreRelativePaths, argZero, containers); @@ -660,7 +660,7 @@ internal class E_Distance return results; } - public void AddToFaceDistance(int maxDegreeOfParallelism, string argZero, long ticks, Map.Models.MapLogic mapLogic, List containers, string outputResolution, List<(string, int, Mapping, DateTime, bool?, List<(FaceRecognitionDotNet.FaceEncoding, MappingContainer)>)> collection) + public void AddToFaceDistance(int maxDegreeOfParallelism, string argZero, long ticks, Map.Models.MapLogic mapLogic, Container[] containers, string outputResolution, List<(string, int, Mapping, DateTime, bool?, List<(FaceRecognitionDotNet.FaceEncoding, MappingContainer)>)> collection) { if (_Log is null) throw new NullReferenceException(nameof(_Log)); @@ -670,7 +670,7 @@ internal class E_Distance double deterministicHashCodeKey; DateTime dateTime = DateTime.Now; List faceDistances; - int containersCount = containers.Count; + int containersCount = containers.Length; foreach (Container container in containers) { if (!container.Items.Any()) @@ -702,7 +702,7 @@ internal class E_Distance } } - public static void SavePropertyHolders(string argZero, List containers, string zPropertyHolderSingletonDirectory) + public static void SavePropertyHolders(string argZero, Container[] containers, string zPropertyHolderSingletonDirectory) { string json; FileInfo fileInfo; diff --git a/Map/Models/MapLogic.cs b/Map/Models/MapLogic.cs index 240f5de..a7ca2ca 100644 --- a/Map/Models/MapLogic.cs +++ b/Map/Models/MapLogic.cs @@ -176,7 +176,7 @@ public class MapLogic } } - public void UseKeyValuePairsSaveFaceEncoding(List containers) + public void UseKeyValuePairsSaveFaceEncoding(Container[] containers) { if (!string.IsNullOrEmpty(_DeterministicHashCodeContentDirectory)) { @@ -458,7 +458,7 @@ public class MapLogic return results; } - public void AddToClosest(int maxDegreeOfParallelism, string argZero, List containers) + public void AddToClosest(int maxDegreeOfParallelism, string argZero, Container[] containers) { string key; string dateKey; @@ -508,7 +508,7 @@ public class MapLogic } } - private List<(IFileHolder? resizedFileHolder, string directory, FileInfo? faceFileInfo, string checkFile, string shortcutFile, string json)> GetClosest(string argZero, List containers, string dFacesContentDirectory, string d2ResultsFullGroupDirectory, string zPropertyHolderContentDirectory) + private List<(IFileHolder? resizedFileHolder, string directory, FileInfo? faceFileInfo, string checkFile, string shortcutFile, string json)> GetClosest(string argZero, Container[] containers, string dFacesContentDirectory, string d2ResultsFullGroupDirectory, string zPropertyHolderContentDirectory) { List<(IFileHolder?, string, FileInfo?, string, string, string)> results = new(); Closest? match; @@ -609,7 +609,7 @@ public class MapLogic return results; } - private List<(IFileHolder? resizedFileHolder, string directory, FileInfo? faceFileInfo, string checkFile, string shortcutFile, string json)> GetMapping(string argZero, List containers, string dFacesContentDirectory, string d2ResultsFullGroupDirectory, string zPropertyHolderContentDirectory) + private List<(IFileHolder? resizedFileHolder, string directory, FileInfo? faceFileInfo, string checkFile, string shortcutFile, string json)> GetMapping(string argZero, Container[] containers, string dFacesContentDirectory, string d2ResultsFullGroupDirectory, string zPropertyHolderContentDirectory) { List<(IFileHolder?, string, FileInfo?, string, string, string)> results = new(); string key; @@ -810,13 +810,13 @@ public class MapLogic } } - public void SaveClosest(string argZero, List containers, string dFacesContentDirectory, string d2ResultsFullGroupDirectory, string zPropertyHolderContentDirectory) + public void SaveClosest(string argZero, Container[] containers, string dFacesContentDirectory, string d2ResultsFullGroupDirectory, string zPropertyHolderContentDirectory) { List<(IFileHolder? resizedFileHolder, string directory, FileInfo? faceFileInfo, string checkFile, string shortcutFile, string json)> collection = GetClosest(argZero, containers, dFacesContentDirectory, d2ResultsFullGroupDirectory, zPropertyHolderContentDirectory); Save(collection); } - public void SaveMapping(string argZero, List containers, string dFacesContentDirectory, string d2ResultsFullGroupDirectory, string zPropertyHolderContentDirectory) + public void SaveMapping(string argZero, Container[] containers, string dFacesContentDirectory, string d2ResultsFullGroupDirectory, string zPropertyHolderContentDirectory) { List<(IFileHolder? resizedFileHolder, string directory, FileInfo? faceFileInfo, string checkFile, string shortcutFile, string json)> collection = GetMapping(argZero, containers, dFacesContentDirectory, d2ResultsFullGroupDirectory, zPropertyHolderContentDirectory); Save(collection); diff --git a/Map/Models/Stateless/IMapLogic.cs b/Map/Models/Stateless/IMapLogic.cs index 12d8676..846fbbe 100644 --- a/Map/Models/Stateless/IMapLogic.cs +++ b/Map/Models/Stateless/IMapLogic.cs @@ -11,8 +11,8 @@ public interface IMapLogic static string GetDateKey(DateTime dateTime, Shared.Models.Mapping mapping, DateTime minimumDateTime, bool? isWrongYear) => MapLogic.GetDateKey(dateTime, mapping, minimumDateTime, isWrongYear); - Dictionary> TestStatic_GetKeyValuePairs(string[] ignoreRelativePaths, string argZero, List containers); - static Dictionary> GetKeyValuePairs(string[] ignoreRelativePaths, string argZero, List containers) => + Dictionary> TestStatic_GetKeyValuePairs(string[] ignoreRelativePaths, string argZero, Shared.Models.Container[] containers); + static Dictionary> GetKeyValuePairs(string[] ignoreRelativePaths, string argZero, Shared.Models.Container[] containers) => MapLogic.GetKeyValuePairs(ignoreRelativePaths, argZero, containers); } \ No newline at end of file diff --git a/Map/Models/Stateless/MapLogic.cs b/Map/Models/Stateless/MapLogic.cs index 5825ae9..675f810 100644 --- a/Map/Models/Stateless/MapLogic.cs +++ b/Map/Models/Stateless/MapLogic.cs @@ -30,7 +30,7 @@ internal abstract class MapLogic return result; } - internal static Dictionary> GetKeyValuePairs(string[] ignoreRelativePaths, string argZero, List containers) + internal static Dictionary> GetKeyValuePairs(string[] ignoreRelativePaths, string argZero, Container[] containers) { Dictionary> results = new(); string key; diff --git a/Not-Copy-Copy/Not-Copy-Copy.cs b/Not-Copy-Copy/Not-Copy-Copy.cs index de76fb1..c34ab37 100644 --- a/Not-Copy-Copy/Not-Copy-Copy.cs +++ b/Not-Copy-Copy/Not-Copy-Copy.cs @@ -39,10 +39,10 @@ public class NotCopyCopy throw new Exception("This program only allows development environments!"); A_Property propertyLogic = GetPropertyLogic(reverse, model, outputExtension, predictorModel); propertyConfiguration.ChangeRootDirectory(configuration.CompareSource); - List compareContainers = A_Property.Get(propertyConfiguration, propertyLogic); + Shared.Models.Container[] compareContainers = A_Property.Get(propertyConfiguration, propertyLogic); propertyConfiguration.ChangeRootDirectory(configuration.SelectedSource); - List selectedContainers = A_Property.Get(propertyConfiguration, propertyLogic); - if (compareContainers.Count == selectedContainers.Count) + Shared.Models.Container[] selectedContainers = A_Property.Get(propertyConfiguration, propertyLogic); + if (compareContainers.Length == selectedContainers.Length) throw new Exception(); string directoryName; List distinct = new(); diff --git a/Property/Models/A_Property.cs b/Property/Models/A_Property.cs index 2901bb2..7986100 100644 --- a/Property/Models/A_Property.cs +++ b/Property/Models/A_Property.cs @@ -140,8 +140,8 @@ public class A_Property } else if (!isIgnoreExtension && isValidImageFormatExtension) { - if (populateId && (id is null || !indices.Any()) && !_IndicesFromNew.Any() && !_KeyValuePairs.Any()) - throw new Exception("In order to keep six character indices at least one need to have an item!"); + // if (populateId && (id is null || !indices.Any()) && !_IndicesFromNew.Any() && !_KeyValuePairs.Any()) + // throw new Exception("In order to keep six character indices at least one need to have an item!"); try { using Image image = Image.FromFile(filteredSourceDirectoryFileHolder.FullName); @@ -611,7 +611,7 @@ public class A_Property collectionDescription: string.Empty)); } - public void ParallelWork(long ticks, List containers, bool firstPass) + public void ParallelWork(long ticks, Shared.Models.Container[] containers, bool firstPass) { if (_Log is null) throw new NullReferenceException(nameof(_Log)); @@ -619,7 +619,7 @@ public class A_Property bool? anyFilesMoved; Item[] filteredItems; List exceptions = new(); - int containersCount = containers.Count; + int containersCount = containers.Length; List> sourceDirectoryChanges = new(); string propertyRoot = IResult.GetResultsGroupDirectory(_Configuration, nameof(A_Property)); foreach (Shared.Models.Container container in containers) @@ -706,12 +706,13 @@ public class A_Property return results.OrderBy(l => l.Ticks).ToArray(); } - public static List Get(Configuration configuration, A_Property propertyLogic) + public static Shared.Models.Container[] Get(Configuration configuration, A_Property propertyLogic) { - List results; + Shared.Models.Container[] results; + bool firstRun = false; long ticks = DateTime.Now.Ticks; List exceptionsDirectories = new(); - results = Stateless.Container.GetContainers(configuration, propertyLogic); + results = Stateless.Container.GetContainers(configuration, firstRun, propertyLogic); propertyLogic.ParallelWork(ticks, results, firstPass: false); if (exceptionsDirectories.Any()) throw new Exception(); diff --git a/Property/Models/Stateless/Container.cs b/Property/Models/Stateless/Container.cs index c3e81f4..47d9f87 100644 --- a/Property/Models/Stateless/Container.cs +++ b/Property/Models/Stateless/Container.cs @@ -144,18 +144,26 @@ public class Container return results; } - private static List GetContainers(Configuration configuration, string aPropertySingletonDirectory, List<(int, string, FileHolder[], int)> fileHolderGroupCollection, List<(int, string, List<(string, Shared.Models.Property?)>, int)> collectionFromJson) + private static Shared.Models.Container[] GetContainers(Configuration configuration, bool firstRun, string aPropertySingletonDirectory, List<(int, string, FileHolder[], int)> fileHolderGroupCollection, List<(int, string, List<(string, Shared.Models.Property?)>, int)> collectionFromJson) { - List results = new(); + Shared.Models.Container[] results; int length; - string key; + int additional; string inferred; + string fileName; + string extension; List items; + string[] existing; + string keyWithJson; string relativePath; + string? directoryName; + string extensionLowered; FileHolder keyFileHolder; - Shared.Models.Container container; + string? fileNameWithoutExtension; bool isValidImageFormatExtension; + Shared.Models.Container container; List keySourceDirectories; + Dictionary keyValuePairs = new(); Dictionary fileHolderKeyValuePairs = new(); length = configuration.RootDirectory.Length; foreach ((int g, string sourceDirectory, FileHolder[] sourceDirectoryFileHolderCollection, int r) in fileHolderGroupCollection) @@ -163,8 +171,21 @@ public class Container foreach (FileHolder sourceDirectoryFileHolder in sourceDirectoryFileHolderCollection) { relativePath = Shared.Models.Stateless.Methods.IPath.GetRelativePath(sourceDirectoryFileHolder.FullName, length); - key = string.Concat(relativePath, ".json"); - fileHolderKeyValuePairs.Add(key, new(sourceDirectory, sourceDirectoryFileHolder)); + fileHolderKeyValuePairs.Add(relativePath, new(sourceDirectory, sourceDirectoryFileHolder)); + extension = Path.GetExtension(sourceDirectoryFileHolder.FullName); + extensionLowered = Path.GetExtension(sourceDirectoryFileHolder.FullName).ToLower(); + if (extension != extensionLowered) + { + directoryName = Path.GetDirectoryName(sourceDirectoryFileHolder.FullName); + if (string.IsNullOrEmpty(directoryName)) + continue; + fileNameWithoutExtension = Path.GetFileNameWithoutExtension(sourceDirectoryFileHolder.FullName); + if (string.IsNullOrEmpty(fileNameWithoutExtension)) + continue; + fileName = Path.Combine(directoryName, $"{fileNameWithoutExtension}{extensionLowered}"); + relativePath = Shared.Models.Stateless.Methods.IPath.GetRelativePath(fileName, length); + fileHolderKeyValuePairs.Add(relativePath, new(sourceDirectory, sourceDirectoryFileHolder)); + } } } length = aPropertySingletonDirectory.Length; @@ -176,9 +197,9 @@ public class Container keySourceDirectories = new(); foreach ((string sourceDirectoryFile, Shared.Models.Property? property) in collection) { - key = Shared.Models.Stateless.Methods.IPath.GetRelativePath(sourceDirectoryFile, length); - relativePath = key[..^5]; - if (!fileHolderKeyValuePairs.ContainsKey(key)) + keyWithJson = Shared.Models.Stateless.Methods.IPath.GetRelativePath(sourceDirectoryFile, length); + relativePath = keyWithJson[..^5]; + if (!fileHolderKeyValuePairs.ContainsKey(relativePath)) { inferred = string.Concat(configuration.RootDirectory, relativePath); keyFileHolder = new(inferred); @@ -190,9 +211,9 @@ public class Container } else { - keyFileHolder = fileHolderKeyValuePairs[key].FileHolder; - keySourceDirectories.Add(fileHolderKeyValuePairs[key].SourceDirectory); - if (!fileHolderKeyValuePairs.Remove(key)) + keyFileHolder = fileHolderKeyValuePairs[relativePath].FileHolder; + keySourceDirectories.Add(fileHolderKeyValuePairs[relativePath].SourceDirectory); + if (!fileHolderKeyValuePairs.Remove(relativePath)) throw new Exception(); if (keyFileHolder.ExtensionLowered is ".json") continue; @@ -210,7 +231,7 @@ public class Container if (keySourceDirectories.Distinct().Count() != 1) continue; container = new(g, r, items, keySourceDirectories[0]); - results.Add(container); + keyValuePairs.Add(keySourceDirectories[0], container); } } length = configuration.RootDirectory.Length; @@ -220,10 +241,9 @@ public class Container foreach (FileHolder sourceDirectoryFileHolder in sourceDirectoryFileHolderCollection) { relativePath = Shared.Models.Stateless.Methods.IPath.GetRelativePath(sourceDirectoryFileHolder.FullName, length); - key = string.Concat(relativePath, ".json"); - if (!fileHolderKeyValuePairs.ContainsKey(key)) + if (!fileHolderKeyValuePairs.ContainsKey(relativePath)) continue; - if (!fileHolderKeyValuePairs.Remove(key)) + if (!fileHolderKeyValuePairs.Remove(relativePath)) throw new Exception(); if (sourceDirectoryFileHolder.ExtensionLowered is ".json") continue; @@ -232,19 +252,38 @@ public class Container } if (items.Any()) { - container = new(g, r, items, sourceDirectory); - results.Add(container); + if (!keyValuePairs.ContainsKey(sourceDirectory)) + { + container = new(g, r, items, sourceDirectory); + keyValuePairs.Add(sourceDirectory, container); + } + else + { + additional = 0; + container = keyValuePairs[sourceDirectory]; + existing = (from l in container.Items select l.ImageFileHolder?.FullName).ToArray(); + foreach (Item item in items) + { + if (item.ImageFileHolder is null || existing.Contains(item.ImageFileHolder.FullName)) + continue; + additional += 1; + items.Add(item); + } + container = new(g, r + additional, items, sourceDirectory); + keyValuePairs[sourceDirectory] = container; + } } } - if (fileHolderKeyValuePairs.Any()) + if (!firstRun && fileHolderKeyValuePairs.Any()) throw new Exception(); - results = (from l in results orderby l.G, l.R select l).ToList(); + KeyValuePair[] sortedKeyValuePairs = (from l in keyValuePairs orderby l.Value.G, l.Value.R select l).ToArray(); + results = (from l in sortedKeyValuePairs select l.Value).ToArray(); return results; } - public static List GetContainers(Configuration configuration, A_Property propertyLogic) + public static Shared.Models.Container[] GetContainers(Configuration configuration, bool firstRun, A_Property propertyLogic) { - List results; + Shared.Models.Container[] results; string searchPattern = "*"; List topDirectories = new(); List<(int g, string sourceDirectory, string[] sourceDirectoryFiles, int r)> jsonCollection; @@ -254,7 +293,7 @@ public class Container jsonCollection = GetJsonGroupCollection(configuration, propertyLogic, aPropertySingletonDirectory); fileHolderGroupCollection = GetFileHolderGroupCollection(configuration, propertyLogic, searchPattern, topDirectories); collectionFromJson = GetCollection(aPropertySingletonDirectory, jsonCollection); - results = GetContainers(configuration, aPropertySingletonDirectory, fileHolderGroupCollection, collectionFromJson); + results = GetContainers(configuration, firstRun, aPropertySingletonDirectory, fileHolderGroupCollection, collectionFromJson); return results; } diff --git a/Property/Models/Stateless/IResult.cs b/Property/Models/Stateless/IResult.cs index 6b726e3..8e5ecde 100644 --- a/Property/Models/Stateless/IResult.cs +++ b/Property/Models/Stateless/IResult.cs @@ -14,9 +14,13 @@ public interface IResult static string GetRelativePath(Configuration configuration, string path) => Result.GetRelativePath(configuration, path); + string TestStatic_GetResultsGroupDirectory(Configuration configuration, string description, bool create); + static string GetResultsGroupDirectory(Configuration configuration, string description, bool create) + => Result.GetResultsGroupDirectory(configuration, description, create); + string TestStatic_GetResultsGroupDirectory(Configuration configuration, string description); static string GetResultsGroupDirectory(Configuration configuration, string description) - => Result.GetResultsGroupDirectory(configuration, description); + => Result.GetResultsGroupDirectory(configuration, description, create: true); string TestStatic_GetResultsDateGroupDirectory(Configuration configuration, string description); static string GetResultsDateGroupDirectory(Configuration configuration, string description) diff --git a/Property/Models/Stateless/Result.cs b/Property/Models/Stateless/Result.cs index 335c1a9..b4c617d 100644 --- a/Property/Models/Stateless/Result.cs +++ b/Property/Models/Stateless/Result.cs @@ -11,17 +11,17 @@ internal class Result return result; } - internal static string GetResultsGroupDirectory(Configuration configuration, string description) + internal static string GetResultsGroupDirectory(Configuration configuration, string description, bool create) { string result = Path.Combine($"{configuration.RootDirectory} - Results", description.Replace("_", ") ")); - if (!Directory.Exists(result)) + if (create && !Directory.Exists(result)) _ = Directory.CreateDirectory(result); return result; } internal static string GetResultsDateGroupDirectory(Configuration configuration, string description) { - string result = Path.Combine(GetResultsGroupDirectory(configuration, description), configuration.DateGroup); + string result = Path.Combine(GetResultsGroupDirectory(configuration, description, create: true), configuration.DateGroup); if (!Directory.Exists(result)) _ = Directory.CreateDirectory(result); return result; diff --git a/Shared/Models/Stateless/Methods/IProperty.cs b/Shared/Models/Stateless/Methods/IProperty.cs index 5c251f7..f94d951 100644 --- a/Shared/Models/Stateless/Methods/IProperty.cs +++ b/Shared/Models/Stateless/Methods/IProperty.cs @@ -30,8 +30,8 @@ public interface IProperty static string GetDiffRootDirectory(string diffPropertyDirectory) => Property.GetDiffRootDirectory(diffPropertyDirectory); - bool TestStatic_Any(List propertyHolderCollections); - static bool Any(List propertyHolderCollections) => + bool TestStatic_Any(Models.Container[] propertyHolderCollections); + static bool Any(Models.Container[] propertyHolderCollections) => Property.Any(propertyHolderCollections); (bool?, string[]) TestStatic_IsWrongYear(string[] segments, string year); diff --git a/Shared/Models/Stateless/Methods/Property.cs b/Shared/Models/Stateless/Methods/Property.cs index eaa5f43..6172b19 100644 --- a/Shared/Models/Stateless/Methods/Property.cs +++ b/Shared/Models/Stateless/Methods/Property.cs @@ -253,7 +253,7 @@ internal abstract class Property return new(j, dateTimes, results); } - internal static bool Any(List propertyHolderCollections) + internal static bool Any(Models.Container[] propertyHolderCollections) { bool result = false; foreach (Models.Container container in propertyHolderCollections)