From 7db449cca1ae7a66b69fa5563cc7d23ffdfb1ccf Mon Sep 17 00:00:00 2001 From: Paul Ming Date: Wed, 16 Aug 2023 15:26:18 -0700 Subject: [PATCH] Fix #2709 (make OR operator work in multitool queries) --- src/Sarif/Query/Evaluators/ExpressionEvaluators.cs | 10 ++++++++-- .../QueryCommandTests.cs | 4 +++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/Sarif/Query/Evaluators/ExpressionEvaluators.cs b/src/Sarif/Query/Evaluators/ExpressionEvaluators.cs index a2b1f885e..4b468505b 100644 --- a/src/Sarif/Query/Evaluators/ExpressionEvaluators.cs +++ b/src/Sarif/Query/Evaluators/ExpressionEvaluators.cs @@ -118,10 +118,16 @@ public OrEvaluator(IEnumerable> terms) public void Evaluate(ICollection list, BitArray matches) { + BitArray termMatches = new BitArray(list.Count); + foreach (IExpressionEvaluator term in _terms) { - // Add each term's matches to the same set - term.Evaluate(list, matches); + // Get matches for the term + termMatches.SetAll(false); + term.Evaluate(list, termMatches); + + // Union with matches so far + matches.Or(termMatches); // Stop if everything has already matched if (matches.TrueCount() == list.Count) { break; } diff --git a/src/Test.UnitTests.Sarif.Multitool.Library/QueryCommandTests.cs b/src/Test.UnitTests.Sarif.Multitool.Library/QueryCommandTests.cs index fd2d6e0c5..e3d210c6c 100644 --- a/src/Test.UnitTests.Sarif.Multitool.Library/QueryCommandTests.cs +++ b/src/Test.UnitTests.Sarif.Multitool.Library/QueryCommandTests.cs @@ -22,6 +22,9 @@ public void QueryCommand_Basics() // All Results: No filter RunAndVerifyCount(5, new QueryOptions() { Expression = "", InputFilePath = filePath }); + // Or operator + RunAndVerifyCount(2, new QueryOptions() { Expression = "Uri >| test_key.pem || Uri >| test_rsa_privkey.pem", InputFilePath = filePath }); + // Rule filtering RunAndVerifyCount(1, new QueryOptions() { Expression = "RuleId = 'CSCAN0020/0'", InputFilePath = filePath }); RunAndVerifyCount(4, new QueryOptions() { Expression = "RuleId = 'CSCAN0060/0'", InputFilePath = filePath }); @@ -82,7 +85,6 @@ public void QueryCommand_Properties() RunAndVerifyCount(0, new QueryOptions() { Expression = "properties.patchPublicationDate < '2022-04-25T00:00:00'", InputFilePath = filePath }); } - private void RunAndVerifyCount(int expectedCount, QueryOptions options) { options.ReturnCount = true;