diff --git a/Copy-Distinct/CopyDistinct.cs b/Copy-Distinct/CopyDistinct.cs index b50670b..0c283c6 100644 --- a/Copy-Distinct/CopyDistinct.cs +++ b/Copy-Distinct/CopyDistinct.cs @@ -2,6 +2,7 @@ using Microsoft.Extensions.Logging; using Phares.Shared; using ShellProgressBar; +using System.Collections.ObjectModel; using View_by_Distance.Copy.Distinct.Models; using View_by_Distance.Shared.Models; using View_by_Distance.Shared.Models.Methods; @@ -34,7 +35,7 @@ public class CopyDistinct _PropertyConfiguration = propertyConfiguration; _Configuration = configuration; logger?.LogInformation(propertyConfiguration.RootDirectory); - (bool move, List filesCollection, bool anyLenFiles, bool moveBack) = Verify(); + (bool move, ReadOnlyCollection filesCollection, bool anyLenFiles, bool moveBack) = Verify(); _FileGroups = Shared.Models.Stateless.Methods.IPath.GetKeyValuePairs(propertyConfiguration, appSettings.CopyTo, [appSettings.ResultDirectoryKey]); List lines = CopyDistinctFilesInDirectories(logger, move, filesCollection, anyLenFiles, moveBack); if (lines.Count != 0) @@ -42,7 +43,7 @@ public class CopyDistinct _ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(propertyConfiguration.RootDirectory); } - private (bool, List, bool, bool) Verify() + private (bool, ReadOnlyCollection, bool, bool) Verify() { if (_AppSettings is null) throw new NullReferenceException(nameof(_AppSettings)); @@ -62,7 +63,7 @@ public class CopyDistinct const string directorySearchFilter = "*"; string copyTo = Path.GetFullPath(_AppSettings.CopyTo); bool move = copyTo == _PropertyConfiguration.RootDirectory; - List filesCollection = Shared.Models.Stateless.Methods.IDirectory.GetFilesCollection(_PropertyConfiguration.RootDirectory, directorySearchFilter, fileSearchFilter, useCeilingAverage); + ReadOnlyCollection filesCollection = Shared.Models.Stateless.Methods.IDirectory.GetFilesCollection(_PropertyConfiguration.RootDirectory, directorySearchFilter, fileSearchFilter, useCeilingAverage); bool anyLenFiles = filesCollection.Any(l => l.Any(m => m.EndsWith("len"))); if (!move) moveBack = false; @@ -88,10 +89,10 @@ public class CopyDistinct } if (move && _AppSettings.IfCanUseId) throw new NotSupportedException("Not allowed because it would irreversible!"); - return (move, filesCollection, anyLenFiles, moveBack); + return (move, new(filesCollection), anyLenFiles, moveBack); } - private static (string[], List<(FileHolder, string?, string)>) GetMoveBackToDoCollection(List filesCollection) + private static (string[], List<(FileHolder, string?, string)>) GetMoveBackToDoCollection(ReadOnlyCollection filesCollection) { List<(FileHolder, string?, string)> results = []; string key; @@ -153,7 +154,7 @@ public class CopyDistinct return (distinctDirectories.ToArray(), results); } - private List CopyDistinctFilesInDirectories(ILogger? logger, bool move, List filesCollection, bool anyLenFiles, bool moveBack) + private List CopyDistinctFilesInDirectories(ILogger? logger, bool move, ReadOnlyCollection filesCollection, bool anyLenFiles, bool moveBack) { List results = []; ProgressBar progressBar; diff --git a/Instance/DlibDotNet.cs b/Instance/DlibDotNet.cs index 64e5470..a2b92c2 100644 --- a/Instance/DlibDotNet.cs +++ b/Instance/DlibDotNet.cs @@ -234,6 +234,26 @@ public partial class DlibDotNet throw new Exception("Configuration has to match interface!"); } + private ReadOnlyCollection GetNotNineCollection(ReadOnlyCollection filesCollection) + { + List results = []; + FileHolder fileHolder; + foreach (string[] files in filesCollection) + { + foreach (string file in files) + { + if (!file.Contains(" !9")) + continue; + fileHolder = new(file); + (_, int? id) = IDirectory.GetId(_Configuration.PropertyConfiguration.Offset, fileHolder); + if (id is null) + continue; + results.Add(id.Value); + } + } + return new(results); + } + private void Search(long ticks, ReadOnlyCollection personContainers, string argZero, string propertyRoot) { int t; @@ -250,11 +270,12 @@ public partial class DlibDotNet const string fileSearchFilter = "*"; string fPhotoPrismSingletonDirectory; bool filesCollectionCountIsOne = false; - List? filesCollection = null; const string directorySearchFilter = "*"; string? filesCollectionRootDirectory = null; bool configurationOutputResolutionsHas = false; + ReadOnlyCollection? notNineCollection = null; ReadOnlyDictionary> personKeyToIds; + ReadOnlyCollection? filesCollection = null; bool runToDoCollectionFirst = GetRunToDoCollectionFirst(ticks); Dictionary> fileNameToCollection; (aResultsFullGroupDirectory, bResultsFullGroupDirectory) = GetResultsFullGroupDirectories(); @@ -277,6 +298,7 @@ public partial class DlibDotNet break; (filesCollectionRootDirectory, filesCollection) = GetFilesCollectionThenCopyOrMove(ticks, fileSearchFilter, directorySearchFilter, options, outputResolution); filesCollectionCountIsOne = filesCollection.Count == 1; + notNineCollection = GetNotNineCollection(filesCollection); break; } fPhotoPrismContentDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(_Configuration.PropertyConfiguration, nameof(F_PhotoPrism), _Configuration.PropertyConfiguration.ResultContent); @@ -307,7 +329,7 @@ public partial class DlibDotNet int count; foreach (string outputResolution in _Configuration.OutputResolutions) { - if (outputResolution.Any(l => char.IsNumber(l))) + if (outputResolution.Any(char.IsNumber)) continue; (cResultsFullGroupDirectory, _, _, _) = GetResultsFullGroupDirectories(outputResolution); filesCollectionRootDirectory = Path.Combine(cResultsFullGroupDirectory, _Configuration.PropertyConfiguration.ResultContent, _Configuration.PropertyConfiguration.ResultAllInOne); @@ -368,8 +390,8 @@ public partial class DlibDotNet && _Configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions.Contains(outputResolution) && _Exceptions.Count == 0) MapLogic(ticks, new(containers), fPhotoPrismContentDirectory, mapLogic, outputResolution, new(personKeyToIds), distinctFilteredFaces, distinctFilteredMappingCollection); - if (_Configuration.SaveRandomForOutputResolutions.Contains(outputResolution) && personKeyToIds.Count > 0 && distinctFilteredMappingCollection.Count > 0) - _Random.Random(_Configuration.PropertyConfiguration, _Configuration.RadomUseBirthdayMinimum, _Configuration.ValidKeyWordsToIgnoreInRandom, outputResolution, personKeyToIds, distinctFilteredMappingCollection); + if (runToDoCollectionFirst && _Configuration.SaveRandomForOutputResolutions.Contains(outputResolution) && personKeyToIds.Count > 0 && distinctFilteredMappingCollection.Count > 0) + _Random.Random(_Configuration.PropertyConfiguration, _Configuration.RadomUseBirthdayMinimum, _Configuration.ValidKeyWordsToIgnoreInRandom, outputResolution, personKeyToIds, notNineCollection, distinctFilteredMappingCollection); if (_IsEnvironment.Development) continue; if (!_IsEnvironment.Development) @@ -1201,13 +1223,13 @@ public partial class DlibDotNet } } - private (string, List) GetFilesCollectionThenCopyOrMove(long ticks, string fileSearchFilter, string directorySearchFilter, ProgressBarOptions options, string outputResolution) + private (string, ReadOnlyCollection) GetFilesCollectionThenCopyOrMove(long ticks, string fileSearchFilter, string directorySearchFilter, ProgressBarOptions options, string outputResolution) { ProgressBar progressBar; string filesCollectionRootDirectory = _Configuration.PropertyConfiguration.RootDirectory; (string cResultsFullGroupDirectory, _, _, _) = GetResultsFullGroupDirectories(outputResolution); IReadOnlyDictionary fileGroups = Shared.Models.Stateless.Methods.IPath.GetKeyValuePairs(_Configuration.PropertyConfiguration, cResultsFullGroupDirectory, [_Configuration.PropertyConfiguration.ResultContent]); - List filesCollection = IDirectory.GetFilesCollection(filesCollectionRootDirectory, directorySearchFilter, fileSearchFilter, useCeilingAverage: false); + ReadOnlyCollection filesCollection = IDirectory.GetFilesCollection(filesCollectionRootDirectory, directorySearchFilter, fileSearchFilter, useCeilingAverage: false); int count = filesCollection.Select(l => l.Length).Sum(); string message = $") Selecting for ## pattern directory - {(int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds)} total second(s)"; progressBar = new(count, message, options); @@ -1222,7 +1244,7 @@ public partial class DlibDotNet progressBar = new(count, message, options); _ = IDirectory.CopyOrMove(toDoCollection, move: false, moveBack: false, () => progressBar.Tick()); progressBar.Dispose(); - return (filesCollectionRootDirectory, filesCollection); + return (filesCollectionRootDirectory, new(filesCollection)); } } \ No newline at end of file diff --git a/Instance/Models/_F_Random.cs b/Instance/Models/_F_Random.cs index 86ffdc9..5881853 100644 --- a/Instance/Models/_F_Random.cs +++ b/Instance/Models/_F_Random.cs @@ -54,7 +54,7 @@ internal class F_Random return new(results); } - internal void Random(Property.Models.Configuration configuration, int radomUseBirthdayMinimum, string[] validKeyWordsToIgnoreInRandom, string outputResolution, ReadOnlyDictionary> personKeyToIds, ReadOnlyCollection mappingCollection) + internal void Random(Property.Models.Configuration configuration, int radomUseBirthdayMinimum, string[] validKeyWordsToIgnoreInRandom, string outputResolution, ReadOnlyDictionary> personKeyToIds, ReadOnlyCollection? notNineCollection, ReadOnlyCollection mappingCollection) { string key; string json; @@ -75,10 +75,12 @@ internal class F_Random { if (distinctCollection.Contains(mapping.MappingFromItem.Id)) continue; - if (mapping.MappingFromItem.Keywords is not null && mapping.MappingFromItem.Keywords.Any(l => validKeyWordsToIgnoreInRandom.Contains(l))) - continue; if (mapping.MappingFromItem.ImageFileHolder.DirectoryName is null) continue; + if (notNineCollection is not null && notNineCollection.Contains(mapping.MappingFromItem.Id)) + continue; + if (mapping.MappingFromItem.Keywords is not null && mapping.MappingFromItem.Keywords.Any(l => validKeyWordsToIgnoreInRandom.Contains(l))) + continue; relativePaths.Add(mapping.MappingFromItem.RelativePath); distinctCollection.Add(mapping.MappingFromItem.Id); } diff --git a/Metadata-Query/MetadataQuery.cs b/Metadata-Query/MetadataQuery.cs index 5438785..859117d 100644 --- a/Metadata-Query/MetadataQuery.cs +++ b/Metadata-Query/MetadataQuery.cs @@ -2,6 +2,7 @@ using Microsoft.Extensions.Logging; using Phares.Shared; using ShellProgressBar; +using System.Collections.ObjectModel; using System.Text; using System.Text.Json; using View_by_Distance.Metadata.Query.Models; @@ -68,7 +69,7 @@ public class MetadataQuery Dictionary>>? dictionary; List<(string FileName, string Count, string TagGroup, string TagIdName, string Value)> collection = []; ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true }; - List filesCollection = Shared.Models.Stateless.Methods.IDirectory.GetFilesCollection(_PropertyConfiguration.RootDirectory, directorySearchFilter, fileSearchFilter, useCeilingAverage); + ReadOnlyCollection filesCollection = Shared.Models.Stateless.Methods.IDirectory.GetFilesCollection(_PropertyConfiguration.RootDirectory, directorySearchFilter, fileSearchFilter, useCeilingAverage); foreach (string[] files in filesCollection) { if (files.Length == 0) diff --git a/Mirror-Length/MirrorLength.cs b/Mirror-Length/MirrorLength.cs index 5f6aa39..aa15b08 100644 --- a/Mirror-Length/MirrorLength.cs +++ b/Mirror-Length/MirrorLength.cs @@ -2,6 +2,7 @@ using Microsoft.Extensions.Logging; using Phares.Shared; using ShellProgressBar; +using System.Collections.ObjectModel; using View_by_Distance.Mirror.Length.Models; using View_by_Distance.Shared.Models.Methods; @@ -53,7 +54,7 @@ public class MirrorLength throw new NullReferenceException(nameof(_PropertyConfiguration)); } - private static List<(string, string, DateTime, long)[]> GetToDoCollection(ProgressBar progressBar, List filesCollection) + private static List<(string, string, DateTime, long)[]> GetToDoCollection(ProgressBar progressBar, ReadOnlyCollection filesCollection) { List<(string, string, DateTime, long)[]> results = []; FileInfo fileInfo; @@ -208,7 +209,7 @@ public class MirrorLength const bool useCeilingAverage = true; const string fileSearchFilter = "*"; const string directorySearchFilter = "*"; - List filesCollection = Shared.Models.Stateless.Methods.IDirectory.GetFilesCollection(_PropertyConfiguration.RootDirectory, directorySearchFilter, fileSearchFilter, useCeilingAverage); + ReadOnlyCollection filesCollection = Shared.Models.Stateless.Methods.IDirectory.GetFilesCollection(_PropertyConfiguration.RootDirectory, directorySearchFilter, fileSearchFilter, useCeilingAverage); ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true }; progressBar = new(filesCollection.Count, message, options); List<(string, string, DateTime, long)[]> collection = GetToDoCollection(progressBar, filesCollection); diff --git a/Rename/Rename.cs b/Rename/Rename.cs index a488d12..c22e857 100644 --- a/Rename/Rename.cs +++ b/Rename/Rename.cs @@ -3,6 +3,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using Phares.Shared; using ShellProgressBar; +using System.Collections.ObjectModel; using System.Text; using View_by_Distance.Metadata.Models; using View_by_Distance.Rename.Models; @@ -88,7 +89,7 @@ public class Rename List<(FileHolder, string, string)> toDoCollection = []; List<(FileHolder, string)> verifiedToDoCollection = []; ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true }; - List filesCollection = IDirectory.GetFilesCollection(_PropertyConfiguration.RootDirectory, directorySearchFilter, fileSearchFilter, useCeilingAverage); + ReadOnlyCollection filesCollection = IDirectory.GetFilesCollection(_PropertyConfiguration.RootDirectory, directorySearchFilter, fileSearchFilter, useCeilingAverage); int count = filesCollection.Select(l => l.Length).Sum(); foreach (string[] files in filesCollection) { diff --git a/Set-Created-Date/SetCreatedDate.cs b/Set-Created-Date/SetCreatedDate.cs index 7f2cd5b..924f05d 100644 --- a/Set-Created-Date/SetCreatedDate.cs +++ b/Set-Created-Date/SetCreatedDate.cs @@ -2,6 +2,7 @@ using Microsoft.Extensions.Logging; using Phares.Shared; using ShellProgressBar; +using System.Collections.ObjectModel; using System.Text; using View_by_Distance.Metadata.Models; using View_by_Distance.Set.Created.Date.Models; @@ -94,7 +95,7 @@ public class SetCreatedDate return results; } - private List GetToDoCollection(ProgressBar progressBar, List filesCollection) + private List GetToDoCollection(ProgressBar progressBar, ReadOnlyCollection filesCollection) { List results = []; int minutes; @@ -147,7 +148,7 @@ public class SetCreatedDate const string fileSearchFilter = "*"; string message = nameof(SetCreatedDate); const string directorySearchFilter = "*"; - List filesCollection = Shared.Models.Stateless.Methods.IDirectory.GetFilesCollection(_PropertyConfiguration.RootDirectory, directorySearchFilter, fileSearchFilter, useCeilingAverage); + ReadOnlyCollection filesCollection = Shared.Models.Stateless.Methods.IDirectory.GetFilesCollection(_PropertyConfiguration.RootDirectory, directorySearchFilter, fileSearchFilter, useCeilingAverage); int count = filesCollection.Select(l => l.Length).Sum(); ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true }; progressBar = new(count, message, options); diff --git a/Shared/Models/Item.cs b/Shared/Models/Item.cs index 44e2459..70de74d 100644 --- a/Shared/Models/Item.cs +++ b/Shared/Models/Item.cs @@ -6,7 +6,6 @@ namespace View_by_Distance.Shared.Models; public class Item : Properties.IItem { - protected readonly string[] _AlternateFileLines; protected List _Faces; protected readonly bool? _FileSizeChanged; protected readonly FileHolder _ImageFileHolder; @@ -19,7 +18,6 @@ public class Item : Properties.IItem protected readonly string _RelativePath; protected FileHolder? _ResizedFileHolder; protected readonly FileHolder _SourceDirectoryFileHolder; - public string[] AlternateFileLines => _AlternateFileLines; public List Faces => _Faces; public bool? FileSizeChanged => _FileSizeChanged; public FileHolder ImageFileHolder => _ImageFileHolder; @@ -34,9 +32,8 @@ public class Item : Properties.IItem public FileHolder SourceDirectoryFileHolder => _SourceDirectoryFileHolder; [JsonConstructor] - public Item(string[] alternateFileLines, List faces, bool? fileSizeChanged, FileHolder imageFileHolder, bool? isNotUniqueAndNeedsReview, bool isUniqueFileName, bool isValidImageFormatExtension, bool? lastWriteTimeChanged, bool? moved, Property? property, string relativePath, FileHolder? resizedFileHolder, FileHolder sourceDirectoryFileHolder) + public Item(List faces, bool? fileSizeChanged, FileHolder imageFileHolder, bool? isNotUniqueAndNeedsReview, bool isUniqueFileName, bool isValidImageFormatExtension, bool? lastWriteTimeChanged, bool? moved, Property? property, string relativePath, FileHolder? resizedFileHolder, FileHolder sourceDirectoryFileHolder) { - _AlternateFileLines = alternateFileLines; _Faces = faces; _FileSizeChanged = fileSizeChanged; _ImageFileHolder = imageFileHolder; @@ -51,8 +48,8 @@ public class Item : Properties.IItem _SourceDirectoryFileHolder = sourceDirectoryFileHolder; } - public Item(FileHolder sourceDirectoryFileHolder, string relativePath, FileHolder imageFileInfo, bool? isNotUniqueAndNeedsReview, bool isUniqueFileName, bool isValidImageFormatExtension, Property? property, string[] alternateFileLines, bool? abandoned, bool? fileSizeChanged, bool? lastWriteTimeChanged) : - this(alternateFileLines, [], fileSizeChanged, imageFileInfo, isNotUniqueAndNeedsReview, isUniqueFileName, isValidImageFormatExtension, lastWriteTimeChanged, null, property, relativePath, null, sourceDirectoryFileHolder) + public Item(FileHolder sourceDirectoryFileHolder, string relativePath, FileHolder imageFileInfo, bool? isNotUniqueAndNeedsReview, bool isUniqueFileName, bool isValidImageFormatExtension, Property? property, bool? abandoned, bool? fileSizeChanged, bool? lastWriteTimeChanged) : + this([], fileSizeChanged, imageFileInfo, isNotUniqueAndNeedsReview, isUniqueFileName, isValidImageFormatExtension, lastWriteTimeChanged, null, property, relativePath, null, sourceDirectoryFileHolder) { if (relativePath.EndsWith(".json")) throw new ArgumentException("Can not be a *.json file!"); @@ -61,7 +58,7 @@ public class Item : Properties.IItem } public Item(FileHolder sourceDirectoryFileHolder, string relativePath, bool isValidImageFormatExtension) : - this(sourceDirectoryFileHolder, relativePath, sourceDirectoryFileHolder, null, false, isValidImageFormatExtension, null, [], null, null, null) + this(sourceDirectoryFileHolder, relativePath, sourceDirectoryFileHolder, null, false, isValidImageFormatExtension, null, null, null, null) { } public override string ToString() diff --git a/Shared/Models/Properties/IItem.cs b/Shared/Models/Properties/IItem.cs index 2e3c0c4..f073564 100644 --- a/Shared/Models/Properties/IItem.cs +++ b/Shared/Models/Properties/IItem.cs @@ -3,7 +3,6 @@ namespace View_by_Distance.Shared.Models.Properties; public interface IItem { - public string[] AlternateFileLines { get; } public bool? FileSizeChanged { get; } public List Faces { get; } public FileHolder ImageFileHolder { get; } diff --git a/Shared/Models/Property.cs b/Shared/Models/Property.cs index af26ce5..bc423c9 100644 --- a/Shared/Models/Property.cs +++ b/Shared/Models/Property.cs @@ -28,23 +28,6 @@ public record Property(DateTime CreationTime, public List GetDateTimes() => Stateless.Methods.Property.GetDateTimes(CreationTime, LastWriteTime, DateTime, DateTimeDigitized, DateTimeFromName, DateTimeOriginal, GPSDateStamp); - public static Property GetProperty(Property property, string[] keywords) => - new(property.CreationTime, - property.DateTime, - property.DateTimeDigitized, - property.DateTimeFromName, - property.DateTimeOriginal, - property.FileSize, - property.GPSDateStamp, - property.Height, - property.Id, - keywords, - property.LastWriteTime, - property.Make, - property.Model, - property.Orientation, - property.Width); - } [JsonSourceGenerationOptions(WriteIndented = true)] diff --git a/Shared/Models/Stateless/Methods/Container.cs b/Shared/Models/Stateless/Methods/Container.cs index 7572df2..9135498 100644 --- a/Shared/Models/Stateless/Methods/Container.cs +++ b/Shared/Models/Stateless/Methods/Container.cs @@ -38,12 +38,12 @@ internal abstract class Container return results.ToArray(); } - internal static List GetFilePairs(Properties.IPropertyConfiguration propertyConfiguration, string directorySearchFilter, string extension, string aPropertySingletonDirectory, List filesCollection) + internal static List GetFilePairs(Properties.IPropertyConfiguration propertyConfiguration, string directorySearchFilter, string extension, string aPropertySingletonDirectory, ReadOnlyCollection filesCollection) { int renamed; const bool useCeilingAverage = true; List? filePairs = null; - List? jsonFilesCollection = null; + ReadOnlyCollection? jsonFilesCollection = null; IReadOnlyDictionary>? compareFileNamesToFiles = null; IReadOnlyDictionary> fileNamesToFiles = IDirectory.GetFilesKeyValuePairs(filesCollection); for (int i = 0; i < int.MaxValue; i++) @@ -62,57 +62,29 @@ internal abstract class Container return filePairs; } - private static string[] GetAlternateFileLines(string? alternateFilesCollectionDirectory, Models.FilePair filePair) + private static Models.Property? GetProperty(Models.FilePair filePair) { - string[]? results; - string pathDirectoryName = Path.GetFileName(Path.GetDirectoryName(filePair.Path) ?? filePair.Path); - string? alternateFile = alternateFilesCollectionDirectory is null ? null : Path.Combine(alternateFilesCollectionDirectory, pathDirectoryName, $"{Path.GetFileName(filePair.Path)}.tsv"); - if (!File.Exists(alternateFile)) - results = []; - else - results = File.ReadAllLines(alternateFile); - return results; - } - - private static (Models.Property?, string[]) GetProperty(Models.FilePair filePair, string? alternateFilesCollectionDirectory) - { - string[] results; Models.Property? result; if (filePair.Match is null) - (result, results) = (null, []); + result = null; else { string json = File.ReadAllText(filePair.Match); if (string.IsNullOrEmpty(json)) - (result, results) = (null, []); + result = null; else - { result = JsonSerializer.Deserialize(json, PropertyGenerationContext.Default.Property); - if (result is null) - results = []; - else - { - results = alternateFilesCollectionDirectory is null ? [] : GetAlternateFileLines(alternateFilesCollectionDirectory, filePair); - if (results.Any(l => l.Contains('!'))) - { - if (result.Keywords is null) - result = Models.Property.GetProperty(result, ["!"]); - else - result = Models.Property.GetProperty(result, result.Keywords.Concat(new string[] { "!" }).ToArray()); - } - } - } } - return (result, results); + return result; } - private static void ParallelFor(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory, string extension, int rootDirectoryLength, string? alternateFilesCollectionDirectory, Models.FilePair filePair, List results) + private static void ParallelFor(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory, string extension, int rootDirectoryLength, Models.FilePair filePair, List results) { string fileName; bool abandoned = false; Models.FileHolder sourceDirectoryFileHolder; + Models.Property? property = GetProperty(filePair); Models.FileHolder imageFileInfo = new(filePair.Path); - (Models.Property? property, string[] alternateFileLines) = GetProperty(filePair, alternateFilesCollectionDirectory); bool? fileSizeChanged = property is not null ? property.FileSize != imageFileInfo.Length : null; string relativePath = IPath.GetRelativePath(filePair.Path, rootDirectoryLength, forceExtensionToLower: true); bool isValidImageFormatExtension = propertyConfiguration.ValidImageFormatExtensions.Contains(imageFileInfo.ExtensionLowered); @@ -132,7 +104,7 @@ internal abstract class Container File.SetCreationTime(sourceDirectoryFileHolder.FullName, imageFileInfo.LastWriteTime.Value); File.SetLastWriteTime(sourceDirectoryFileHolder.FullName, sourceDirectoryFileHolder.LastWriteTime.Value); } - Models.Item item = new(sourceDirectoryFileHolder, relativePath, imageFileInfo, filePair.IsNotUniqueAndNeedsReview, filePair.IsUnique, isValidImageFormatExtension, property, alternateFileLines, abandoned, fileSizeChanged, lastWriteTimeChanged); + Models.Item item = new(sourceDirectoryFileHolder, relativePath, imageFileInfo, filePair.IsNotUniqueAndNeedsReview, filePair.IsUnique, isValidImageFormatExtension, property, abandoned, fileSizeChanged, lastWriteTimeChanged); lock (results) results.Add(new(filePair.Path, imageFileInfo.DirectoryName, filePair.IsUnique, filePair.Collection, item)); } @@ -141,22 +113,20 @@ internal abstract class Container { List results = []; int maxDegreeOfParallelism = Environment.ProcessorCount; - string? alternateResultAllInOne = !propertyConfiguration.ResultAllInOne.Contains(' ') ? null : propertyConfiguration.ResultAllInOne.Replace(' ', '-'); - string? alternateFilesCollectionDirectory = alternateResultAllInOne is null ? null : Path.Combine(Path.GetDirectoryName(filesCollectionDirectory) ?? filesCollectionDirectory, alternateResultAllInOne); int filesCollectionDirectoryLength = filesCollectionDirectory.Length; ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = maxDegreeOfParallelism }; - _ = Parallel.For(0, filePairs.Count, parallelOptions, (i, state) => ParallelFor(propertyConfiguration, aPropertySingletonDirectory, extension, filesCollectionDirectoryLength, alternateFilesCollectionDirectory, filePairs[i], results)); + _ = Parallel.For(0, filePairs.Count, parallelOptions, (i, state) => ParallelFor(propertyConfiguration, aPropertySingletonDirectory, extension, filesCollectionDirectoryLength, filePairs[i], results)); return results; } - private static (int, Models.Container[]) GetContainers(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory, string filesCollectionDirectory, List filesCollection, string directorySearchFilter) + private static (int, Models.Container[]) GetContainers(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory, string filesCollectionDirectory, ReadOnlyCollection filesCollection, string directorySearchFilter) { List results = []; string? directory; List? items; Models.Container container; - const string extension = ".json"; List directories = []; + const string extension = ".json"; Dictionary> directoryToItems = []; foreach (string[] files in filesCollection) { @@ -198,7 +168,7 @@ internal abstract class Container return (collection.Count, results.ToArray()); } - internal static (int, Models.Container[]) GetContainers(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory, string filesCollectionDirectory, List filesCollection) + internal static (int, Models.Container[]) GetContainers(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory, string filesCollectionDirectory, ReadOnlyCollection filesCollection) { int count; Models.Container[] results; @@ -214,7 +184,7 @@ internal abstract class Container const bool useCeilingAverage = true; const string fileSearchFilter = "*"; const string directorySearchFilter = "*"; - List filesCollection = IDirectory.GetFilesCollection(propertyConfiguration.RootDirectory, directorySearchFilter, fileSearchFilter, useCeilingAverage); + ReadOnlyCollection filesCollection = IDirectory.GetFilesCollection(propertyConfiguration.RootDirectory, directorySearchFilter, fileSearchFilter, useCeilingAverage); (count, results) = GetContainers(propertyConfiguration, aPropertySingletonDirectory, propertyConfiguration.RootDirectory, filesCollection, directorySearchFilter); return (count, results); } diff --git a/Shared/Models/Stateless/Methods/IContainer.cs b/Shared/Models/Stateless/Methods/IContainer.cs index f34a751..65e87f4 100644 --- a/Shared/Models/Stateless/Methods/IContainer.cs +++ b/Shared/Models/Stateless/Methods/IContainer.cs @@ -15,9 +15,9 @@ public interface IContainer static Models.Item[] GetFilterItems(Properties.IPropertyConfiguration propertyConfiguration, Models.Container container) => Container.GetFilterItems(propertyConfiguration, container); - List TestStatic_GetFilePairs(Properties.IPropertyConfiguration propertyConfiguration, string directorySearchFilter, string extension, string aPropertySingletonDirectory, List filesCollection) => + List TestStatic_GetFilePairs(Properties.IPropertyConfiguration propertyConfiguration, string directorySearchFilter, string extension, string aPropertySingletonDirectory, ReadOnlyCollection filesCollection) => Container.GetFilePairs(propertyConfiguration, directorySearchFilter, extension, aPropertySingletonDirectory, filesCollection); - static List GetFilePairs(Properties.IPropertyConfiguration propertyConfiguration, string directorySearchFilter, string extension, string aPropertySingletonDirectory, List filesCollection) => + static List GetFilePairs(Properties.IPropertyConfiguration propertyConfiguration, string directorySearchFilter, string extension, string aPropertySingletonDirectory, ReadOnlyCollection filesCollection) => Container.GetFilePairs(propertyConfiguration, directorySearchFilter, extension, aPropertySingletonDirectory, filesCollection); (int, Models.Container[]) TestStatic_GetContainers(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory) => @@ -25,9 +25,9 @@ public interface IContainer static (int, Models.Container[]) GetContainers(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory) => Container.GetContainers(propertyConfiguration, aPropertySingletonDirectory); - (int, Models.Container[]) TestStatic_GetContainers(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory, string filesCollectionDirectory, List filesCollection) => + (int, Models.Container[]) TestStatic_GetContainers(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory, string filesCollectionDirectory, ReadOnlyCollection filesCollection) => GetContainers(propertyConfiguration, aPropertySingletonDirectory, filesCollectionDirectory, filesCollection); - static (int, Models.Container[]) GetContainers(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory, string filesCollectionDirectory, List filesCollection) => + static (int, Models.Container[]) GetContainers(Properties.IPropertyConfiguration propertyConfiguration, string aPropertySingletonDirectory, string filesCollectionDirectory, ReadOnlyCollection filesCollection) => Container.GetContainers(propertyConfiguration, aPropertySingletonDirectory, filesCollectionDirectory, filesCollection); List TestStatic_GetFilteredDistinctIds(Properties.IPropertyConfiguration propertyConfiguration, Models.Container[] containers) => diff --git a/Shared/Models/Stateless/Methods/IDirectory.cs b/Shared/Models/Stateless/Methods/IDirectory.cs index 5930c0d..0c2704a 100644 --- a/Shared/Models/Stateless/Methods/IDirectory.cs +++ b/Shared/Models/Stateless/Methods/IDirectory.cs @@ -1,3 +1,5 @@ +using System.Collections.ObjectModel; + namespace View_by_Distance.Shared.Models.Stateless.Methods; public interface IDirectory @@ -36,19 +38,19 @@ public interface IDirectory static bool NameWithoutExtensionIsPaddedIdFormat(Models.FileHolder fileHolder, short sortOrderOnlyLengthIndex) => NameWithoutExtensionIsPaddedIdFormat(fileHolder.NameWithoutExtension, sortOrderOnlyLengthIndex); - List TestStatic_GetFilesCollection(string directory, string directorySearchFilter, string fileSearchFilter, bool useCeilingAverage) => + ReadOnlyCollection TestStatic_GetFilesCollection(string directory, string directorySearchFilter, string fileSearchFilter, bool useCeilingAverage) => GetFilesCollection(directory, directorySearchFilter, fileSearchFilter, useCeilingAverage); - static List GetFilesCollection(string directory, string directorySearchFilter, string fileSearchFilter, bool useCeilingAverage) => + static ReadOnlyCollection GetFilesCollection(string directory, string directorySearchFilter, string fileSearchFilter, bool useCeilingAverage) => XDirectory.GetFilesCollection(directory, directorySearchFilter, fileSearchFilter, useCeilingAverage); - IReadOnlyDictionary> TestStatic_GetFilesKeyValuePairs(List filesCollection) => + IReadOnlyDictionary> TestStatic_GetFilesKeyValuePairs(ReadOnlyCollection filesCollection) => GetFilesKeyValuePairs(filesCollection); - static IReadOnlyDictionary> GetFilesKeyValuePairs(List filesCollection) => + static IReadOnlyDictionary> GetFilesKeyValuePairs(ReadOnlyCollection filesCollection) => XDirectory.GetFilesKeyValuePairs(filesCollection); - int TestStatic_LookForAbandoned(List jsonFilesCollection, IReadOnlyDictionary> fileNamesToFiles, string extension) => + int TestStatic_LookForAbandoned(ReadOnlyCollection jsonFilesCollection, IReadOnlyDictionary> fileNamesToFiles, string extension) => LookForAbandoned(jsonFilesCollection, fileNamesToFiles, extension); - static int LookForAbandoned(List jsonFilesCollection, IReadOnlyDictionary> fileNamesToFiles, string extension) => + static int LookForAbandoned(ReadOnlyCollection jsonFilesCollection, IReadOnlyDictionary> fileNamesToFiles, string extension) => XDirectory.LookForAbandoned(jsonFilesCollection, fileNamesToFiles, extension); int TestStatic_MaybeMove(string directory, string resultAllInOne, int resultAllInOneSubdirectoryLength, List filePairs, string jsonGroupDirectory, string extension) => @@ -56,9 +58,9 @@ public interface IDirectory static int MaybeMove(string directory, string resultAllInOne, int resultAllInOneSubdirectoryLength, List filePairs, string jsonGroupDirectory, string extension) => XDirectory.MaybeMove(directory, resultAllInOne, resultAllInOneSubdirectoryLength, filePairs, jsonGroupDirectory, extension); - List TestStatic_GetFiles(List filesCollection, IReadOnlyDictionary> fileNamesToFiles, string extension, IReadOnlyDictionary> compareFileNamesToFiles) => + List TestStatic_GetFiles(ReadOnlyCollection filesCollection, IReadOnlyDictionary> fileNamesToFiles, string extension, IReadOnlyDictionary> compareFileNamesToFiles) => GetFiles(filesCollection, fileNamesToFiles, extension, compareFileNamesToFiles); - static List GetFiles(List filesCollection, IReadOnlyDictionary> fileNamesToFiles, string extension, IReadOnlyDictionary> compareFileNamesToFiles) => + static List GetFiles(ReadOnlyCollection filesCollection, IReadOnlyDictionary> fileNamesToFiles, string extension, IReadOnlyDictionary> compareFileNamesToFiles) => XDirectory.GetFiles(filesCollection, fileNamesToFiles, extension, compareFileNamesToFiles); void TestStatic_MoveFiles(List files, string find, string replace) => @@ -66,14 +68,14 @@ public interface IDirectory static void MoveFiles(List files, string find, string replace) => XDirectory.MoveFiles(files, find, replace); - (string[], List<(Models.FileHolder, string?, string)>) TestStatic_GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, List filesCollection, string[] directories, Action? tick) => + (string[], List<(Models.FileHolder, string?, string)>) TestStatic_GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, ReadOnlyCollection filesCollection, string[] directories, Action? tick) => GetToDoCollection(propertyConfiguration, filesCollection, directories, tick); - static (string[], List<(Models.FileHolder, string?, string)>) GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, List filesCollection, string[] directories, Action? tick) => + static (string[], List<(Models.FileHolder, string?, string)>) GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, ReadOnlyCollection filesCollection, string[] directories, Action? tick) => XDirectory.GetToDoCollection(propertyConfiguration, copyDuplicates: false, ifCanUseId: true, filesCollection, directories, tick); - (string[], List<(Models.FileHolder, string?, string)>) TestStatic_GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, bool copyDuplicates, bool ifCanUseId, List filesCollection, string[] directories, Action? tick) => + (string[], List<(Models.FileHolder, string?, string)>) TestStatic_GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, bool copyDuplicates, bool ifCanUseId, ReadOnlyCollection filesCollection, string[] directories, Action? tick) => GetToDoCollection(propertyConfiguration, copyDuplicates, ifCanUseId, filesCollection, directories, tick); - static (string[], List<(Models.FileHolder, string?, string)>) GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, bool copyDuplicates, bool ifCanUseId, List filesCollection, string[] directories, Action? tick) => + static (string[], List<(Models.FileHolder, string?, string)>) GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, bool copyDuplicates, bool ifCanUseId, ReadOnlyCollection filesCollection, string[] directories, Action? tick) => XDirectory.GetToDoCollection(propertyConfiguration, copyDuplicates, ifCanUseId, filesCollection, directories, tick); List TestStatic_CopyOrMove(List<(Models.FileHolder, string?, string)> toDoCollection, bool move, bool moveBack, Action? tick) => diff --git a/Shared/Models/Stateless/Methods/XDirectory.cs b/Shared/Models/Stateless/Methods/XDirectory.cs index 95c170e..01f291d 100644 --- a/Shared/Models/Stateless/Methods/XDirectory.cs +++ b/Shared/Models/Stateless/Methods/XDirectory.cs @@ -1,3 +1,5 @@ +using System.Collections.ObjectModel; + namespace View_by_Distance.Shared.Models.Stateless.Methods; internal abstract partial class XDirectory @@ -30,7 +32,7 @@ internal abstract partial class XDirectory return results; } - internal static List GetFilesCollection(string directory, string directorySearchFilter, string fileSearchFilter, bool useCeilingAverage) + internal static ReadOnlyCollection GetFilesCollection(string directory, string directorySearchFilter, string fileSearchFilter, bool useCeilingAverage) { List results = []; if (!fileSearchFilter.Contains('*')) @@ -49,10 +51,10 @@ internal abstract partial class XDirectory int ceilingAverage = directory[^1] == '_' || results.Count == 0 ? 0 : GetCeilingAverage(results); if (useCeilingAverage) results = GetFilesCollection(results, ceilingAverage); - return results; + return new(results); } - internal static IReadOnlyDictionary> GetFilesKeyValuePairs(List filesCollection) + internal static IReadOnlyDictionary> GetFilesKeyValuePairs(ReadOnlyCollection filesCollection) { Dictionary> results = []; string fileName; @@ -74,7 +76,7 @@ internal abstract partial class XDirectory return results; } - internal static int LookForAbandoned(List jsonFilesCollection, IReadOnlyDictionary> fileNamesToFiles, string extension) + internal static int LookForAbandoned(ReadOnlyCollection jsonFilesCollection, IReadOnlyDictionary> fileNamesToFiles, string extension) { string fileName; string fileNameWith; @@ -145,7 +147,7 @@ internal abstract partial class XDirectory return result; } - internal static List GetFiles(List filesCollection, IReadOnlyDictionary> fileNamesToFiles, string extension, IReadOnlyDictionary> compareFileNamesToFiles) + internal static List GetFiles(ReadOnlyCollection filesCollection, IReadOnlyDictionary> fileNamesToFiles, string extension, IReadOnlyDictionary> compareFileNamesToFiles) { List results = []; string? match; @@ -319,7 +321,7 @@ internal abstract partial class XDirectory return (nameWithoutExtensionIsIdFormat, id); } - private static SortedRecord[] GetSortedRecords(int offset, List filesCollection) + private static SortedRecord[] GetSortedRecords(int offset, ReadOnlyCollection filesCollection) { List results = []; int? id; @@ -338,7 +340,7 @@ internal abstract partial class XDirectory return (from l in results orderby l.FileHolder.CreationTime, l.FileHolder.FullName.Length descending select l).ToArray(); } - internal static (string[], List<(Models.FileHolder, string?, string)>) GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, bool copyDuplicates, bool ifCanUseId, List filesCollection, string[] directories, Action? tick) + internal static (string[], List<(Models.FileHolder, string?, string)>) GetToDoCollection(Properties.IPropertyConfiguration propertyConfiguration, bool copyDuplicates, bool ifCanUseId, ReadOnlyCollection filesCollection, string[] directories, Action? tick) { List<(Models.FileHolder, string?, string)> results = []; string paddedId; diff --git a/Tests/UnitTestResize.cs b/Tests/UnitTestResize.cs index 7cd746a..a3be45a 100644 --- a/Tests/UnitTestResize.cs +++ b/Tests/UnitTestResize.cs @@ -136,7 +136,6 @@ public class UnitTestResize Shared.Models.Property? property = null; const bool isValidImageFormatExtension = true; List> subFileTuples = []; - string[] alternateFileLines = []; int length = _PropertyConfiguration.RootDirectory.Length; string[] changesFrom = [nameof(A_Property)]; string outputResolution = _Configuration.OutputResolutions[0]; @@ -167,7 +166,7 @@ public class UnitTestResize resize.SetAngleBracketCollection(cResultsFullGroupDirectory, sourceDirectory); resize.Update(cResultsFullGroupDirectory); blurHasher.Update(cResultsFullGroupDirectory); - item = new(sourceDirectoryFileHolder, relativePath, fileHolder, isNotUniqueAndNeedsReview, isUniqueFileName, isValidImageFormatExtension, property, alternateFileLines, false, false, false); + item = new(sourceDirectoryFileHolder, relativePath, fileHolder, isNotUniqueAndNeedsReview, isUniqueFileName, isValidImageFormatExtension, property, false, false, false); Assert.IsNotNull(item.ImageFileHolder); if (item.Property is null) { diff --git a/TestsWithFaceRecognitionDotNet/UnitTestFace.cs b/TestsWithFaceRecognitionDotNet/UnitTestFace.cs index 718fda2..db1f880 100644 --- a/TestsWithFaceRecognitionDotNet/UnitTestFace.cs +++ b/TestsWithFaceRecognitionDotNet/UnitTestFace.cs @@ -209,7 +209,6 @@ public class UnitTestFace Shared.Models.Property? property = null; const bool isValidImageFormatExtension = true; List> subFileTuples = []; - string[] alternateFileLines = []; int length = _PropertyConfiguration.RootDirectory.Length; string[] changesFrom = [nameof(A_Property)]; string outputResolution = _Configuration.OutputResolutions[0]; @@ -240,7 +239,7 @@ public class UnitTestFace resize.SetAngleBracketCollection(cResultsFullGroupDirectory, sourceDirectory); resize.Update(cResultsFullGroupDirectory); blurHasher.Update(cResultsFullGroupDirectory); - item = new(sourceDirectoryFileHolder, relativePath, fileHolder, isNotUniqueAndNeedsReview, isUniqueFileName, isValidImageFormatExtension, property, alternateFileLines, false, false, false); + item = new(sourceDirectoryFileHolder, relativePath, fileHolder, isNotUniqueAndNeedsReview, isUniqueFileName, isValidImageFormatExtension, property, false, false, false); Assert.IsNotNull(item.ImageFileHolder); if (item.Property is null) {