This is an automated email from the ASF dual-hosted git repository.

pvillard pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/main by this push:
     new 09aea76bb5 NIFI-14672 Support same replacement values in 
replaceByPattern
09aea76bb5 is described below

commit 09aea76bb52626b87f16e7a4b24e159d6e193dfc
Author: Alaksiej Ščarbaty <[email protected]>
AuthorDate: Wed Jun 18 13:32:50 2025 +0200

    NIFI-14672 Support same replacement values in replaceByPattern
    
    Signed-off-by: Pierre Villard <[email protected]>
    
    This closes #10027.
---
 .../functions/ReplaceByPatternEvaluator.java       | 22 ++++++++++++----------
 .../attribute/expression/language/TestQuery.java   | 10 ++++++++++
 2 files changed, 22 insertions(+), 10 deletions(-)

diff --git 
a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/ReplaceByPatternEvaluator.java
 
b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/ReplaceByPatternEvaluator.java
index 6519bc6b21..4184e8ec05 100644
--- 
a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/ReplaceByPatternEvaluator.java
+++ 
b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/ReplaceByPatternEvaluator.java
@@ -24,9 +24,9 @@ import 
org.apache.nifi.attribute.expression.language.evaluation.StringEvaluator;
 import 
org.apache.nifi.attribute.expression.language.evaluation.StringQueryResult;
 import 
org.apache.nifi.attribute.expression.language.evaluation.literals.StringLiteralEvaluator;
 
+import java.util.ArrayList;
 import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.List;
 import java.util.regex.Pattern;
 
 public class ReplaceByPatternEvaluator extends StringEvaluator {
@@ -34,7 +34,7 @@ public class ReplaceByPatternEvaluator extends 
StringEvaluator {
     private final Evaluator<String> subject;
     private final Evaluator<String> search;
 
-    private Map<String, Pattern> compiledPatterns = null;
+    private List<PatternMapping> compiledPatterns = null;
 
     public ReplaceByPatternEvaluator(final Evaluator<String> subject, final 
Evaluator<String> search) {
         this.subject = subject;
@@ -56,7 +56,7 @@ public class ReplaceByPatternEvaluator extends 
StringEvaluator {
             return new StringQueryResult(null);
         }
 
-        final Map<String, Pattern> patterns;
+        final List<PatternMapping> patterns;
         if (compiledPatterns == null) {
             String expression = search.evaluate(evaluationContext).getValue();
             if (expression == null) {
@@ -67,17 +67,17 @@ public class ReplaceByPatternEvaluator extends 
StringEvaluator {
             patterns = compiledPatterns;
         }
 
-        for (Map.Entry<String, Pattern> entry : patterns.entrySet()) {
-            if (entry.getValue().matcher(subjectValue).matches()) {
-                return new StringQueryResult(entry.getKey());
+        for (PatternMapping entry : patterns) {
+            if (entry.pattern().matcher(subjectValue).matches()) {
+                return new StringQueryResult(entry.replacement());
             }
         }
 
         return new StringQueryResult(subjectValue);
     }
 
-    private Map<String, Pattern> compilePatterns(final String argument) {
-        final Map<String, Pattern> result = new HashMap<>();
+    private List<PatternMapping> compilePatterns(final String argument) {
+        final List<PatternMapping> result = new ArrayList<>();
         if (argument == null || argument.trim().isEmpty()) {
             return result;
         }
@@ -97,7 +97,7 @@ public class ReplaceByPatternEvaluator extends 
StringEvaluator {
             }
 
             try {
-                result.put(mappedTo, Pattern.compile(streamPattern));
+                result.add(new PatternMapping(Pattern.compile(streamPattern), 
mappedTo));
             } catch (Exception e) {
                 // ignore
                 continue;
@@ -112,4 +112,6 @@ public class ReplaceByPatternEvaluator extends 
StringEvaluator {
         return subject;
     }
 
+    private record PatternMapping(Pattern pattern, String replacement) {
+    }
 }
diff --git 
a/nifi-commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestQuery.java
 
b/nifi-commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestQuery.java
index 2e26b8acc7..07beec7196 100644
--- 
a/nifi-commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestQuery.java
+++ 
b/nifi-commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestQuery.java
@@ -2389,10 +2389,20 @@ public class TestQuery {
         
verifyEquals("${str_attr:replaceByPattern('myValue[3-4]:test,.*:foo')}", 
attributes, "foo");
         
verifyEquals("${str_attr:replaceByPattern('myValue[3-4]:test,abc:foo')}", 
attributes, "myValue2");
         verifyEquals("${str_attr:replaceByPattern('myValue[3-4]:test, abc:foo, 
myValue[1-4]:xyz')}", attributes, "xyz");
+        
verifyEquals("${str_attr:replaceByPattern('myValue1:test,myValue2:test,myValue3:test')}",
 attributes, "test");
 
         
verifyEquals("${str_attr:replaceByPattern(${literal('myValue[3-4]:test'):append(','):append('
 .*:foo')})}", attributes, "foo");
     }
 
+    @Test
+    public void testReplaceByPatternWithSameReplacement() {
+        final String expression = "${attr:replaceByPattern('a:ok,b:ok,c:ok')}";
+
+        verifyEquals(expression, Map.of("attr", "a"), "ok");
+        verifyEquals(expression, Map.of("attr", "b"), "ok");
+        verifyEquals(expression, Map.of("attr", "c"), "ok");
+    }
+
     @Test
     public void testHashFailure() {
         final Map<String, String> attributes = new HashMap<>();

Reply via email to