From c09470c639213308ae1d37dae5214a8172bae058 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Fri, 28 Aug 2020 13:54:53 -0700 Subject: [PATCH] Fully decouple split from filter --- SabreTools.Library/DatFiles/DatFile.cs | 7 +---- SabreTools.Library/Filtering/Filter.cs | 5 --- SabreTools/Features/BaseFeature.cs | 43 ++++++++++++-------------- SabreTools/Features/Batch.cs | 2 +- SabreTools/Features/DatFromDir.cs | 4 ++- SabreTools/Features/Update.cs | 12 ++++--- SabreTools/Features/Verify.cs | 7 +++-- 7 files changed, 38 insertions(+), 42 deletions(-) diff --git a/SabreTools.Library/DatFiles/DatFile.cs b/SabreTools.Library/DatFiles/DatFile.cs index 842add45..dea21d22 100644 --- a/SabreTools.Library/DatFiles/DatFile.cs +++ b/SabreTools.Library/DatFiles/DatFile.cs @@ -812,10 +812,8 @@ namespace SabreTools.Library.DatFiles /// Apply a Filter on the DatFile /// /// Filter to use - /// True if DatFile tags override splitting, false otherwise /// True if the DatFile was filtered, false on error - /// TODO: Fully decouple splitting - public bool ApplyFilter(Filter filter, bool useTags) + public bool ApplyFilter(Filter filter) { // If we have a null filter, return false if (filter == null) @@ -823,9 +821,6 @@ namespace SabreTools.Library.DatFiles try { - // Apply splitting, if necessary - ApplySplitting(filter.InternalSplit, useTags); - // Loop over every key in the dictionary List keys = Items.Keys.ToList(); foreach (string key in keys) diff --git a/SabreTools.Library/Filtering/Filter.cs b/SabreTools.Library/Filtering/Filter.cs index 15739dfc..b9256df6 100644 --- a/SabreTools.Library/Filtering/Filter.cs +++ b/SabreTools.Library/Filtering/Filter.cs @@ -359,11 +359,6 @@ namespace SabreTools.Library.Filtering /// public bool IncludeOfInGame { get; set; } - /// - /// Internally split a DatFile - /// - public MergingFlag InternalSplit { get; set; } - #endregion #endregion // Fields diff --git a/SabreTools/Features/BaseFeature.cs b/SabreTools/Features/BaseFeature.cs index 891501a2..43480833 100644 --- a/SabreTools/Features/BaseFeature.cs +++ b/SabreTools/Features/BaseFeature.cs @@ -2529,6 +2529,26 @@ Some special strings that can be used: return splittingMode; } + /// + /// Get SplitType from feature list + /// + protected MergingFlag GetSplitType(Dictionary features) + { + MergingFlag splitType = MergingFlag.None; + if (GetBoolean(features, DatDeviceNonMergedValue)) + splitType = MergingFlag.Device; + else if (GetBoolean(features, DatFullNonMergedValue)) + splitType = MergingFlag.Full; + else if (GetBoolean(features, DatMergedValue)) + splitType = MergingFlag.Merged; + else if (GetBoolean(features, DatNonMergedValue)) + splitType = MergingFlag.NonMerged; + else if (GetBoolean(features, DatSplitValue)) + splitType = MergingFlag.Split; + + return splitType; + } + /// /// Get StatReportFormat from feature list /// @@ -3001,34 +3021,11 @@ Some special strings that can be used: // Include 'of" in game filters filter.IncludeOfInGame = GetBoolean(features, MatchOfTagsValue); - // Internal splitting - filter.InternalSplit = GetSplitType(features); - #endregion return filter; } - /// - /// Get SplitType from feature list - /// - private MergingFlag GetSplitType(Dictionary features) - { - MergingFlag splitType = MergingFlag.None; - if (GetBoolean(features, DatDeviceNonMergedValue)) - splitType = MergingFlag.Device; - else if (GetBoolean(features, DatFullNonMergedValue)) - splitType = MergingFlag.Full; - else if (GetBoolean(features, DatMergedValue)) - splitType = MergingFlag.Merged; - else if (GetBoolean(features, DatNonMergedValue)) - splitType = MergingFlag.NonMerged; - else if (GetBoolean(features, DatSplitValue)) - splitType = MergingFlag.Split; - - return splitType; - } - #endregion } } diff --git a/SabreTools/Features/Batch.cs b/SabreTools/Features/Batch.cs index 10112239..2a32a450 100644 --- a/SabreTools/Features/Batch.cs +++ b/SabreTools/Features/Batch.cs @@ -171,7 +171,7 @@ Reset the internal state: reset();"; filter.SetFilter(filterField, filterValue, filterNegate); // Apply the filter blindly - datFile.ApplyFilter(filter, false); + datFile.ApplyFilter(filter); datFile.Items.ClearMarked(); // TODO: We might not want to remove immediately break; diff --git a/SabreTools/Features/DatFromDir.cs b/SabreTools/Features/DatFromDir.cs index cc4c0bc0..c185847a 100644 --- a/SabreTools/Features/DatFromDir.cs +++ b/SabreTools/Features/DatFromDir.cs @@ -64,6 +64,7 @@ namespace SabreTools.Features bool noAutomaticDate = GetBoolean(features, NoAutomaticDateValue); var omitFromScan = GetOmitFromScan(features); var skipFileType = GetSkipFileType(features); + var splitType = GetSplitType(features); // Create a new DATFromDir object and process the inputs DatFile basedat = DatFile.Create(Header); @@ -94,7 +95,8 @@ namespace SabreTools.Features if (success) { datdata.ApplyExtras(Extras); - datdata.ApplyFilter(Filter, false); + datdata.ApplySplitting(splitType, false); + datdata.ApplyFilter(Filter); datdata.ApplyCleaning(Cleaner); datdata.Write(OutputDir); } diff --git a/SabreTools/Features/Update.cs b/SabreTools/Features/Update.cs index 1f00869e..b86c7a71 100644 --- a/SabreTools/Features/Update.cs +++ b/SabreTools/Features/Update.cs @@ -167,7 +167,8 @@ namespace SabreTools.Features || datFile.Header.DatFormat.HasFlag(DatFormat.CSV) || datFile.Header.DatFormat.HasFlag(DatFormat.SSV)); datFile.ApplyExtras(Extras); - datFile.ApplyFilter(Filter, false); + datFile.ApplySplitting(GetSplitType(features), false); + datFile.ApplyFilter(Filter); datFile.ApplyCleaning(Cleaner); // Get the correct output path @@ -204,7 +205,8 @@ namespace SabreTools.Features // Apply the extras, filter, and cleaning userInputDat.ApplyExtras(Extras); - userInputDat.ApplyFilter(Filter, false); + userInputDat.ApplySplitting(GetSplitType(features), false); + userInputDat.ApplyFilter(Filter); userInputDat.ApplyCleaning(Cleaner); // Output only DatItems that are duplicated across inputs @@ -293,7 +295,8 @@ namespace SabreTools.Features DatFile repDat = DatFile.Create(userInputDat.Header.CloneFiltering()); repDat.Parse(inputPath, indexId: 1, keep: true); repDat.ApplyExtras(Extras); - repDat.ApplyFilter(Filter, false); + repDat.ApplySplitting(GetSplitType(features), false); + repDat.ApplyFilter(Filter); repDat.ApplyCleaning(Cleaner); // Now replace the fields from the base DatFile @@ -315,7 +318,8 @@ namespace SabreTools.Features DatFile repDat = DatFile.Create(userInputDat.Header.CloneFiltering()); repDat.Parse(inputPath, indexId: 1, keep: true); repDat.ApplyExtras(Extras); - repDat.ApplyFilter(Filter, false); + repDat.ApplySplitting(GetSplitType(features), false); + repDat.ApplyFilter(Filter); repDat.ApplyCleaning(Cleaner); // Now replace the fields from the base DatFile diff --git a/SabreTools/Features/Verify.cs b/SabreTools/Features/Verify.cs index ab30cb2b..720b9022 100644 --- a/SabreTools/Features/Verify.cs +++ b/SabreTools/Features/Verify.cs @@ -48,6 +48,7 @@ namespace SabreTools.Features TreatAsFiles asFiles = GetTreatAsFiles(features); bool hashOnly = GetBoolean(features, HashOnlyValue); bool quickScan = GetBoolean(features, QuickValue); + var splitType = GetSplitType(features); // If we are in individual mode, process each DAT on their own if (GetBoolean(features, IndividualValue)) @@ -57,7 +58,8 @@ namespace SabreTools.Features DatFile datdata = DatFile.Create(); datdata.Parse(datfile, 99, keep: true); datdata.ApplyExtras(Extras); - datdata.ApplyFilter(Filter, true); + datdata.ApplySplitting(splitType, true); + datdata.ApplyFilter(Filter); datdata.ApplyCleaning(Cleaner); // Set depot information @@ -88,7 +90,8 @@ namespace SabreTools.Features { datdata.Parse(datfile, 99, keep: true); datdata.ApplyExtras(Extras); - datdata.ApplyFilter(Filter, true); + datdata.ApplySplitting(splitType, true); + datdata.ApplyFilter(Filter); datdata.ApplyCleaning(Cleaner); }