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<>();