You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by ph...@apache.org on 2018/02/28 16:22:02 UTC
nifi-minifi-cpp git commit: MINIFICPP-415 Added implementation of
matches() EL function
Repository: nifi-minifi-cpp
Updated Branches:
refs/heads/master 3d9fad569 -> c99b3fa49
MINIFICPP-415 Added implementation of matches() EL function
This closes #270.
Signed-off-by: Marc Parisi <ph...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/repo
Commit: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/commit/c99b3fa4
Tree: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/tree/c99b3fa4
Diff: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/diff/c99b3fa4
Branch: refs/heads/master
Commit: c99b3fa494c15dcf1c264e7d67d729c8325ca0df
Parents: 3d9fad5
Author: Andrew I. Christianson <an...@andyic.org>
Authored: Mon Feb 26 10:47:26 2018 -0500
Committer: Marc Parisi <ph...@apache.org>
Committed: Wed Feb 28 11:21:35 2018 -0500
----------------------------------------------------------------------
EXPRESSIONS.md | 42 ++++++++++++++++++++
extensions/expression-language/Expression.cpp | 13 ++++++
.../ExpressionLanguageTests.cpp | 24 +++++++++++
3 files changed, 79 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/c99b3fa4/EXPRESSIONS.md
----------------------------------------------------------------------
diff --git a/EXPRESSIONS.md b/EXPRESSIONS.md
index a0a7df4..d46990e 100644
--- a/EXPRESSIONS.md
+++ b/EXPRESSIONS.md
@@ -173,6 +173,10 @@ token, filename.
- [`fromRadix`](#fromradix)
- [`random`](#random)
+### Searching
+
+- [`matches`](#matches)
+
## Planned Features
### String Manipulation
@@ -183,6 +187,17 @@ token, filename.
- `prepend`
- `length`
+### Searching
+
+- `startsWith`
+- `endsWith`
+- `contains`
+- `in`
+- `find`
+- `indexOf`
+- `lastIndexOf`
+- `jsonPath`
+
### Boolean Logic
- `isNull`
@@ -752,3 +767,30 @@ random number generator.
**Return Type**: Number
**Examples**: `${random():mod(10):plus(1)}` returns random number between 1 and 10 inclusive.
+
+## Searching
+
+### matches
+
+**Description**: Returns true if the Subject exactly matches the Regular Expression provided by the argument.
+
+**Subject Type**: String
+
+**Arguments**:
+
+| Argument | Description |
+| - | - |
+| Regex | The Regular Expression (in the Java Pattern syntax) to match against the Subject |
+
+**Return Type**: Boolean
+
+**Examples**:
+
+If the `filename` attribute has the value "a brand new filename.txt", then the
+following Expressions will provide the following results:
+
+| Expression | Value |
+| - | - |
+| `${filename:matches('a.*txt')}` | true |
+| `${filename:matches('brand')}` | false |
+| `${filename:matches('.brand.')}` | true |
http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/c99b3fa4/extensions/expression-language/Expression.cpp
----------------------------------------------------------------------
diff --git a/extensions/expression-language/Expression.cpp b/extensions/expression-language/Expression.cpp
index de737ed..97bf340 100644
--- a/extensions/expression-language/Expression.cpp
+++ b/extensions/expression-language/Expression.cpp
@@ -152,6 +152,17 @@ std::string expr_replaceEmpty(const std::vector<std::string> &args) {
return std::regex_replace(result, find, replace);
}
+std::string expr_matches(const std::vector<std::string> &args) {
+ const auto &subject = args[0];
+ const std::regex expr = std::regex(args[1]);
+
+ if (std::regex_match(subject.begin(), subject.end(), expr)) {
+ return "true";
+ } else {
+ return "false";
+ }
+}
+
#endif // EXPRESSION_LANGUAGE_USE_REGEX
std::string expr_binaryOp(const std::vector<std::string> &args,
@@ -335,6 +346,8 @@ Expression make_dynamic_function(const std::string &function_name,
return make_dynamic_function_incomplete<expr_replaceNull>(function_name, args, 1);
} else if (function_name == "replaceEmpty") {
return make_dynamic_function_incomplete<expr_replaceEmpty>(function_name, args, 1);
+ } else if (function_name == "matches") {
+ return make_dynamic_function_incomplete<expr_matches>(function_name, args, 1);
#endif // EXPRESSION_LANGUAGE_USE_REGEX
} else if (function_name == "plus") {
return make_dynamic_function_incomplete<expr_plus>(function_name, args, 1);
http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/c99b3fa4/libminifi/test/expression-language-tests/ExpressionLanguageTests.cpp
----------------------------------------------------------------------
diff --git a/libminifi/test/expression-language-tests/ExpressionLanguageTests.cpp b/libminifi/test/expression-language-tests/ExpressionLanguageTests.cpp
index d6ab607..f0a9c7c 100644
--- a/libminifi/test/expression-language-tests/ExpressionLanguageTests.cpp
+++ b/libminifi/test/expression-language-tests/ExpressionLanguageTests.cpp
@@ -408,6 +408,30 @@ TEST_CASE("Replace Empty 3", "[expressionLanguageReplaceEmpty2]") { // NOLINT
REQUIRE("abc" == expr({flow_file_a}));
}
+TEST_CASE("Matches", "[expressionLanguageMatches]") { // NOLINT
+ auto expr = expression::compile("${attr:matches('^(Ct|Bt|At):.*t$')}");
+
+ auto flow_file_a = std::make_shared<MockFlowFile>();
+ flow_file_a->addAttribute("attr", "At:est");
+ REQUIRE("true" == expr({flow_file_a}));
+}
+
+TEST_CASE("Matches 2", "[expressionLanguageMatches2]") { // NOLINT
+ auto expr = expression::compile("${attr:matches('^(Ct|Bt|At):.*t$')}");
+
+ auto flow_file_a = std::make_shared<MockFlowFile>();
+ flow_file_a->addAttribute("attr", "At:something");
+ REQUIRE("false" == expr({flow_file_a}));
+}
+
+TEST_CASE("Matches 3", "[expressionLanguageMatches3]") { // NOLINT
+ auto expr = expression::compile("${attr:matches('(Ct|Bt|At):.*t')}");
+
+ auto flow_file_a = std::make_shared<MockFlowFile>();
+ flow_file_a->addAttribute("attr", " At:est");
+ REQUIRE("false" == expr({flow_file_a}));
+}
+
#endif // EXPRESSION_LANGUAGE_USE_REGEX
TEST_CASE("Plus Integer", "[expressionLanguagePlusInteger]") { // NOLINT