diff --git a/Instance/DlibDotNet.cs b/Instance/DlibDotNet.cs index 09a241b..d9fab14 100644 --- a/Instance/DlibDotNet.cs +++ b/Instance/DlibDotNet.cs @@ -359,6 +359,7 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable if (!runToDoCollectionFirst) break; (filesCollectionRootDirectory, filePathsCollection, filesCollectionCountIsOne) = GetFilesCollectionThenCopyOrMove(ticks, fileSearchFilter, directorySearchFilter, options, outputResolution); + SaveDistinctIds(_Configuration.PropertyConfiguration, bResultsFullGroupDirectory, filePathsCollection); notNineCollection = GetNotNineCollection(filePathsCollection); break; } @@ -403,7 +404,6 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable if (!Directory.Exists(aPropertySingletonDirectory)) _ = Directory.CreateDirectory(aPropertySingletonDirectory); int count = filePathsCollection.Select(l => l.Count).Sum(); - SaveDistinctIds(_Configuration.PropertyConfiguration, bResultsFullGroupDirectory, filePathsCollection); message = $") Building Container(s) - {(int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds)} total second(s)"; _ProgressBar = new(count, message, options); readOnlyContainers = Shared.Models.Stateless.Methods.IContainer.GetContainers(this, _Configuration.PropertyConfiguration, aPropertySingletonDirectory, filesCollectionRootDirectory, filePathsCollection); @@ -663,14 +663,10 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable } } - private static void SaveDistinctIds(Property.Models.Configuration propertyConfiguration, string bResultsFullGroupDirectory, ReadOnlyCollection> filePathsCollection) + private static ReadOnlyDictionary> GetKeyValuePairs(ReadOnlyCollection> filePathsCollection) { - string paddedId; - List distinct = []; - List identifiers = []; - string bMetadataCollectionDirectory = Path.Combine(bResultsFullGroupDirectory, propertyConfiguration.ResultCollection); - if (!Directory.Exists(bMetadataCollectionDirectory)) - _ = Directory.CreateDirectory(bMetadataCollectionDirectory); + Dictionary> results = []; + List? collection; foreach (ReadOnlyCollection filePaths in filePathsCollection) { if (filePaths.Count == 0) @@ -679,15 +675,45 @@ public partial class DlibDotNet : IDlibDotNet, IDisposable { if (filePath.Id is null) continue; - if (distinct.Contains(filePath.Id.Value)) - continue; - distinct.Add(filePath.Id.Value); - paddedId = IId.GetPaddedId(propertyConfiguration, filePath.Id.Value, filePath.HasIgnoreKeyword, filePath.HasDateTimeOriginal, index: null); - identifiers.Add(new(filePath.Id.Value, paddedId)); + if (!results.TryGetValue(filePath.Id.Value, out collection)) + { + results.Add(filePath.Id.Value, []); + if (!results.TryGetValue(filePath.Id.Value, out collection)) + throw new Exception(); + } + collection.Add(filePath); } } - string json = JsonSerializer.Serialize(identifiers.OrderBy(l => l.PaddedId).ToArray(), IdentifierCollectionSourceGenerationContext.Default.IdentifierArray); - _ = Shared.Models.Stateless.Methods.IPath.WriteAllText(Path.Combine(bMetadataCollectionDirectory, ".json"), json, updateDateWhenMatches: false, compareBeforeWrite: true, updateToWhenMatches: null); + return new(results); + } + + private static void SaveDistinctIds(Property.Models.Configuration propertyConfiguration, string bResultsFullGroupDirectory, ReadOnlyCollection> filePathsCollection) + { + ReadOnlyDictionary> keyValuePairs = GetKeyValuePairs(filePathsCollection); + if (keyValuePairs.Count > 0) + { + string paddedId; + FilePath filePath; + Identifier identifier; + string[] directoryNames; + List identifiers = []; + string rootDirectory = propertyConfiguration.RootDirectory.Replace('\\', '/'); + string bMetadataCollectionDirectory = Path.Combine(bResultsFullGroupDirectory, propertyConfiguration.ResultCollection); + if (!Directory.Exists(bMetadataCollectionDirectory)) + _ = Directory.CreateDirectory(bMetadataCollectionDirectory); + foreach (KeyValuePair> keyValuePair in keyValuePairs) + { + filePath = keyValuePair.Value[0]; + if (filePath.Id is null) + continue; + directoryNames = keyValuePair.Value.Select(l => l.DirectoryName.Replace('\\', '/')).ToArray(); + paddedId = IId.GetPaddedId(propertyConfiguration, filePath.Id.Value, filePath.HasIgnoreKeyword, filePath.HasDateTimeOriginal, index: null); + identifier = new(directoryNames, filePath.HasDateTimeOriginal, filePath.Id.Value, filePath.Length, paddedId, filePath.LastWriteTicks); + identifiers.Add(identifier); + } + string json = JsonSerializer.Serialize((from l in identifiers orderby l.DirectoryNames.Length descending, l.Id select l).ToArray(), IdentifierCollectionSourceGenerationContext.Default.IdentifierArray); + _ = Shared.Models.Stateless.Methods.IPath.WriteAllText(Path.Combine(bMetadataCollectionDirectory, ".json"), json.Replace(rootDirectory, string.Empty), updateDateWhenMatches: false, compareBeforeWrite: true, updateToWhenMatches: null); + } } private ReadOnlyCollection GetMappings(Property.Models.Configuration propertyConfiguration, string eDistanceContentDirectory, ReadOnlyCollection readOnlyContainers, MapLogic mapLogic, bool distinctItems) diff --git a/Instance/Models/Identifier.cs b/Instance/Models/Identifier.cs index fbe0457..5832659 100644 --- a/Instance/Models/Identifier.cs +++ b/Instance/Models/Identifier.cs @@ -3,7 +3,12 @@ using System.Text.Json.Serialization; namespace View_by_Distance.Instance.Models; -internal record Identifier(int Id, string PaddedId) +internal sealed record Identifier(string[] DirectoryNames, + bool? HasDateTimeOriginal, + int Id, + long Length, + string PaddedId, + long Ticks) { public override string ToString() diff --git a/Tests/UnitTestHardCoded.cs b/Tests/UnitTestHardCoded.cs index 7bbdee0..87e83fc 100644 --- a/Tests/UnitTestHardCoded.cs +++ b/Tests/UnitTestHardCoded.cs @@ -45,7 +45,7 @@ public partial class UnitTestHardCoded Environment.SetEnvironmentVariable(nameof(workingDirectory), workingDirectory); propertyConfiguration = Property.Models.Binder.Configuration.Get(isEnvironment, configurationRoot); configuration = Models.Binder.Configuration.Get(isEnvironment, configurationRoot, propertyConfiguration); - _Git = "c9dbce3b"; + _Git = "304b5e2a"; _AppSettings = appSettings; _Configuration = configuration; _IsEnvironment = isEnvironment;