METRON-1655 Make REGEXP_MATCH take multiple regexs in the 2nd arg (ottobackwards) closes apache/metron#1098
Project: http://git-wip-us.apache.org/repos/asf/metron/repo Commit: http://git-wip-us.apache.org/repos/asf/metron/commit/b2a22b81 Tree: http://git-wip-us.apache.org/repos/asf/metron/tree/b2a22b81 Diff: http://git-wip-us.apache.org/repos/asf/metron/diff/b2a22b81 Branch: refs/heads/feature/METRON-1554-pcap-query-panel Commit: b2a22b81a3d763be81be0746b608fecf2e09c04e Parents: f183d98 Author: ottobackwards <[email protected]> Authored: Tue Jul 10 13:28:39 2018 -0400 Committer: otto <[email protected]> Committed: Tue Jul 10 13:28:39 2018 -0400 ---------------------------------------------------------------------- metron-stellar/stellar-common/README.md | 4 +-- .../stellar/dsl/functions/RegExFunctions.java | 27 +++++++++++++++----- .../dsl/functions/RegExFunctionsTest.java | 7 +++++ 3 files changed, 30 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/metron/blob/b2a22b81/metron-stellar/stellar-common/README.md ---------------------------------------------------------------------- diff --git a/metron-stellar/stellar-common/README.md b/metron-stellar/stellar-common/README.md index 0dd8e16..88a3834 100644 --- a/metron-stellar/stellar-common/README.md +++ b/metron-stellar/stellar-common/README.md @@ -886,10 +886,10 @@ Where: * Returns: The reduction of the list. ### `REGEXP_MATCH` - * Description: Determines whether a regex matches a string + * Description: Determines whether a regex matches a string. If a list of patterns is passed, then the matching is an OR operation * Input: * string - The string to test - * pattern - The proposed regex pattern + * pattern - The proposed regex pattern or a list of patterns * Returns: True if the regex pattern matches the string and false if otherwise. ### `REGEXP_GROUP_VAL` http://git-wip-us.apache.org/repos/asf/metron/blob/b2a22b81/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/dsl/functions/RegExFunctions.java ---------------------------------------------------------------------- diff --git a/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/dsl/functions/RegExFunctions.java b/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/dsl/functions/RegExFunctions.java index ddc8860..48e82a3 100644 --- a/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/dsl/functions/RegExFunctions.java +++ b/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/dsl/functions/RegExFunctions.java @@ -30,10 +30,10 @@ import org.apache.metron.stellar.dsl.Stellar; public class RegExFunctions { @Stellar(name = "REGEXP_MATCH", - description = "Determines whether a regex matches a string", + description = "Determines whether a regex matches a string, if a list of patterns is passed, then the matching is an OR operation", params = { "string - The string to test", - "pattern - The proposed regex pattern" + "pattern - The proposed regex pattern or a list of proposed regex patterns" }, returns = "True if the regex pattern matches the string and false if otherwise.") public static class RegexpMatch extends BaseStellarFunction { @@ -42,14 +42,29 @@ public class RegExFunctions { public Object apply(List<Object> list) { if (list.size() < 2) { throw new IllegalStateException( - "REGEXP_MATCH expects two args: [string, pattern] where pattern is a regexp pattern"); + "REGEXP_MATCH expects two args: [string, pattern] where pattern is a regexp pattern or a list of regexp patterns"); } - String patternString = (String) list.get(1); + Object patternObject = list.get(1); String str = (String) list.get(0); - if (str == null || patternString == null) { + if (str == null || patternObject == null) { return false; } - return PatternCache.INSTANCE.getPattern(patternString).matcher(str).matches(); + if (patternObject instanceof String) { + return PatternCache.INSTANCE.getPattern((String)patternObject).matcher(str).matches(); + } else if (patternObject instanceof Iterable) { + boolean matches = false; + for (Object thisPatternObject : (Iterable)patternObject) { + if (thisPatternObject == null) { + continue; + } + if (PatternCache.INSTANCE.getPattern(thisPatternObject.toString()).matcher(str).matches()) { + matches = true; + break; + } + } + return matches; + } + return false; } } http://git-wip-us.apache.org/repos/asf/metron/blob/b2a22b81/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/RegExFunctionsTest.java ---------------------------------------------------------------------- diff --git a/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/RegExFunctionsTest.java b/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/RegExFunctionsTest.java index f0b579f..dc159b8 100644 --- a/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/RegExFunctionsTest.java +++ b/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/RegExFunctionsTest.java @@ -37,11 +37,18 @@ public class RegExFunctionsTest { put("numbers", "12345"); put("numberPattern", "\\d(\\d)(\\d).*"); put("letters", "abcde"); + put("letterPattern", "[a-zA-Z]+"); put("empty", ""); }}; Assert.assertTrue(runPredicate("REGEXP_MATCH(numbers,numberPattern)", new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); Assert.assertFalse(runPredicate("REGEXP_MATCH(letters,numberPattern)", new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); + Assert.assertTrue(runPredicate("REGEXP_MATCH(letters,[numberPattern,letterPattern])", new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); + Assert.assertFalse(runPredicate("REGEXP_MATCH(letters,[numberPattern])", new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); + Assert.assertFalse(runPredicate("REGEXP_MATCH(letters,[numberPattern,numberPattern])", new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); + Assert.assertFalse(runPredicate("REGEXP_MATCH(null,[numberPattern])", new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); + Assert.assertFalse(runPredicate("REGEXP_MATCH(letters,null)", new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); + Assert.assertFalse(runPredicate("REGEXP_MATCH(letters,[null])", new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); } @Test
