From ee92e400545bf497d9244493a090bfecd7b280af Mon Sep 17 00:00:00 2001 From: Otto Fowler Date: Sun, 8 Jul 2018 12:35:22 -0400 Subject: [PATCH] METRON-1655 multiple regex args for REGEXP_MATCH --- 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(-) diff --git a/metron-stellar/stellar-common/README.md b/metron-stellar/stellar-common/README.md index 0dd8e16b6b..88a383412f 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` 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 ddc8860541..48e82a363c 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 @@ 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 static class RegexpMatch extends BaseStellarFunction { public Object apply(List 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; } } 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 f0b579fbca..dc159b83d7 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 void testRegExMatch() throws Exception { 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