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/feature/METRON-1344-test-infrastructure
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))));
+  }
+
+
 }

Reply via email to