FilterRunner update to better support machine types

This commit is contained in:
Matt Nadareski
2025-05-14 14:42:15 -04:00
parent c52fe915b0
commit d0f0fd6f7c

View File

@@ -20,24 +20,23 @@ namespace SabreTools.Core.Filter
/// </summary> /// </summary>
private readonly string[] _datItemTypeNames = TypeHelper.GetDatItemTypeNames(); private readonly string[] _datItemTypeNames = TypeHelper.GetDatItemTypeNames();
/// <summary>
/// Set of machine type keys that are logically grouped
/// </summary>
/// TODO: REMOVE THIS WHEN A PROPER IMPLEMENTATION IS FOUND
private readonly string[] _machineTypeKeys =
[
$"{MetadataFile.MachineKey}.{Machine.IsBiosKey}",
$"{MetadataFile.MachineKey}.{Machine.IsDeviceKey}",
$"{MetadataFile.MachineKey}.{Machine.IsMechanicalKey}",
];
public FilterRunner(FilterObject[] filters) public FilterRunner(FilterObject[] filters)
{ {
foreach (var filter in filters) foreach (var filter in filters)
{ {
// Ensure the key exists // Get the key as a string
string key = filter.Key.ToString(); string key = filter.Key.ToString();
if (!Filters.ContainsKey(filter.Key.ToString()))
// Special case for machine types
if (filter.Key.ItemName == MetadataFile.MachineKey && filter.Key.FieldName == Machine.IsBiosKey)
key = $"{MetadataFile.MachineKey}.COMBINEDTYPE";
else if (filter.Key.ItemName == MetadataFile.MachineKey && filter.Key.FieldName == Machine.IsDeviceKey)
key = $"{MetadataFile.MachineKey}.COMBINEDTYPE";
else if (filter.Key.ItemName == MetadataFile.MachineKey && filter.Key.FieldName == Machine.IsMechanicalKey)
key = $"{MetadataFile.MachineKey}.COMBINEDTYPE";
// Ensure the key exists
if (!Filters.ContainsKey(key))
Filters[key] = new FilterGroup(GroupType.OR); Filters[key] = new FilterGroup(GroupType.OR);
// Add the filter to the set // Add the filter to the set
@@ -53,9 +52,19 @@ namespace SabreTools.Core.Filter
{ {
var filter = new FilterObject(filterString); var filter = new FilterObject(filterString);
// Ensure the key exists // Get the key as a string
string key = filter.Key.ToString(); string key = filter.Key.ToString();
if (!Filters.ContainsKey(filter.Key.ToString()))
// Special case for machine types
if (filter.Key.ItemName == MetadataFile.MachineKey && filter.Key.FieldName == Machine.IsBiosKey)
key = $"{MetadataFile.MachineKey}.COMBINEDTYPE";
else if (filter.Key.ItemName == MetadataFile.MachineKey && filter.Key.FieldName == Machine.IsDeviceKey)
key = $"{MetadataFile.MachineKey}.COMBINEDTYPE";
else if (filter.Key.ItemName == MetadataFile.MachineKey && filter.Key.FieldName == Machine.IsMechanicalKey)
key = $"{MetadataFile.MachineKey}.COMBINEDTYPE";
// Ensure the key exists
if (!Filters.ContainsKey(key))
Filters[key] = new FilterGroup(GroupType.OR); Filters[key] = new FilterGroup(GroupType.OR);
// Add the filter to the set // Add the filter to the set
@@ -82,38 +91,6 @@ namespace SabreTools.Core.Filter
if (itemName == null) if (itemName == null)
return false; return false;
// TODO: REMOVE THIS ENTIRE BLOCK WHEN A PROPER IMPLEMENTATION IS FOUND
// Handle special keys that work in tandem
if (itemName == MetadataFile.MachineKey)
{
// Check that one of the special keys exists
bool containsKey = false;
foreach (string key in _machineTypeKeys)
{
if (Filters.ContainsKey(key))
containsKey = true;
}
// If at least one exists
if (containsKey)
{
bool matchAny = false;
foreach (string filterKey in _machineTypeKeys)
{
// Skip missing keys
if (!Filters.ContainsKey(filterKey))
continue;
// Check for a match like normal
matchAny |= Filters[filterKey].Matches(dictionaryBase);
}
// If we don't get a match, it's a failure
if (!matchAny)
return false;
}
}
// Loop through and run each filter in order // Loop through and run each filter in order
foreach (var filterKey in Filters.Keys) foreach (var filterKey in Filters.Keys)
{ {
@@ -123,10 +100,6 @@ namespace SabreTools.Core.Filter
else if (!filterKey.StartsWith("item.") && !filterKey.StartsWith(itemName)) else if (!filterKey.StartsWith("item.") && !filterKey.StartsWith(itemName))
continue; continue;
// TODO: REMOVE THIS ENTIRE BLOCK WHEN A PROPER IMPLEMENTATION IS FOUND
if (Array.Exists(_machineTypeKeys, key => key == filterKey))
continue;
// If we don't get a match, it's a failure // If we don't get a match, it's a failure
bool matchOne = Filters[filterKey].Matches(dictionaryBase); bool matchOne = Filters[filterKey].Matches(dictionaryBase);
if (!matchOne) if (!matchOne)