Repository: metron Updated Branches: refs/heads/master 0c6aad8c7 -> 9be0d8584
METRON-1431 Add REGEXP_REPLACE function to Stellar (havran via ottobackwards) closes apache/metron#912 Project: http://git-wip-us.apache.org/repos/asf/metron/repo Commit: http://git-wip-us.apache.org/repos/asf/metron/commit/9be0d858 Tree: http://git-wip-us.apache.org/repos/asf/metron/tree/9be0d858 Diff: http://git-wip-us.apache.org/repos/asf/metron/diff/9be0d858 Branch: refs/heads/master Commit: 9be0d858452ebc836e812d665c55a5481fa6fea2 Parents: 0c6aad8 Author: havran <havran.in...@gmail.com> Authored: Mon Jan 29 16:44:33 2018 -0500 Committer: otto <o...@apache.org> Committed: Mon Jan 29 16:44:33 2018 -0500 ---------------------------------------------------------------------- metron-stellar/stellar-common/README.md | 9 +++++ .../stellar/dsl/functions/RegExFunctions.java | 36 ++++++++++++++++++++ .../dsl/functions/RegExFunctionsTest.java | 19 +++++++++++ 3 files changed, 64 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/metron/blob/9be0d858/metron-stellar/stellar-common/README.md ---------------------------------------------------------------------- diff --git a/metron-stellar/stellar-common/README.md b/metron-stellar/stellar-common/README.md index 076f250..98aea77 100644 --- a/metron-stellar/stellar-common/README.md +++ b/metron-stellar/stellar-common/README.md @@ -232,6 +232,7 @@ Where: | [ `REDUCE`](#reduce) | | [ `REGEXP_MATCH`](#regexp_match) | | [ `REGEXP_GROUP_VAL`](#regexp_group_val) | +| [ `REGEXP_REPLACE`](#regexp_replace) | | [ `ROUND`](#round) | | [ `SAMPLE_ADD`](../../metron-analytics/metron-statistics#sample_add) | | [ `SAMPLE_GET`](../../metron-analytics/metron-statistics#sample_get) | @@ -879,6 +880,14 @@ Where: * group - The integer that selects what group to select, starting at 1 * Returns: The value of the group, or null if not matched or no group at index. +### `REGEXP_REPLACE` + * Description: Replace all occurences of the regex pattern within the string by value + * Input: + * string - The input string + * pattern - The proposed regex pattern + * value - The value to replace the regex pattern + * Returns: The modified input string with replaced values + ### `ROUND` * Description: Rounds a number to the nearest integer. This is half-up rounding. * Input: http://git-wip-us.apache.org/repos/asf/metron/blob/9be0d858/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 a1ea229..ddc8860 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 @@ -21,6 +21,7 @@ package org.apache.metron.stellar.dsl.functions; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.apache.commons.lang3.StringUtils; import org.apache.metron.stellar.common.utils.ConversionUtils; import org.apache.metron.stellar.common.utils.PatternCache; import org.apache.metron.stellar.dsl.BaseStellarFunction; @@ -100,4 +101,39 @@ public class RegExFunctions { return matcher.group(groupNumber); } } + + @Stellar(name = "REGEXP_REPLACE", + description = "Replace all occurences of the regex pattern within the string by value", + params = { + "string - The input string", + "pattern - The regex pattern to be replaced. Special characters must be escaped (e.g. \\\\d)", + "value - The value to replace the regex pattern" + }, + returns = "The modified input string with replaced values") + public static class RegexpReplace extends BaseStellarFunction { + + @Override + public Object apply(List<Object> list) { + if (list.size() != 3) { + throw new IllegalStateException( + "REGEXP_REPLACE expects three args: [string, pattern, value]" + + " where pattern is a regexp pattern"); + } + String str = (String) list.get(0); + String stringPattern = (String) list.get(1); + String value = (String) list.get(2); + + if (StringUtils.isEmpty(str)) { + return null; + } + + if (StringUtils.isEmpty(stringPattern) || StringUtils.isEmpty(value)) { + return str; + } + + Pattern pattern = PatternCache.INSTANCE.getPattern(stringPattern); + Matcher matcher = pattern.matcher(str); + return matcher.replaceAll(value); + } + } } http://git-wip-us.apache.org/repos/asf/metron/blob/9be0d858/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 2aefb67..f0b579f 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 @@ -68,4 +68,23 @@ public class RegExFunctionsTest { Assert.assertTrue("Did not fail on wrong number of parameters",false); } } + + @Test + public void testRegExReplace() throws Exception { + final Map<String, String> variableMap = new HashMap<String, String>() {{ + put("numbers", "12345"); + put("numberPattern", "\\d(\\d)(\\d).*"); + put("letters", "abcde"); + put("empty", ""); + }}; + + Assert.assertTrue(runPredicate("REGEXP_REPLACE(empty, numberPattern, letters) == null", new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); + Assert.assertTrue(runPredicate("REGEXP_REPLACE(numbers, empty, empty) == numbers", new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); + Assert.assertTrue(runPredicate("REGEXP_REPLACE(numbers, empty, letters) == numbers", new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); + Assert.assertTrue(runPredicate("REGEXP_REPLACE(numbers, numberPattern, empty) == numbers", new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); + Assert.assertTrue(runPredicate("REGEXP_REPLACE(numbers, numberPattern, letters) == letters", new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); + Assert.assertTrue(runPredicate("REGEXP_REPLACE(letters, numberPattern, numbers) == letters", new DefaultVariableResolver(v -> variableMap.get(v),v -> variableMap.containsKey(v)))); + } + + }