You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metron.apache.org by ot...@apache.org on 2018/01/29 22:12:45 UTC
metron git commit: METRON-1431 Add REGEXP_REPLACE function to Stellar
(havran via ottobackwards) closes apache/metron#912
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 <ha...@gmail.com>
Authored: Mon Jan 29 16:44:33 2018 -0500
Committer: otto <ot...@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))));
+ }
+
+
}