You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by ma...@apache.org on 2014/12/30 15:18:50 UTC

incubator-nifi git commit: NIFI-206: Build appropriate AnyAttribute, AllAttributes, AnyMatchingAttribute, etc. evaluators in the buildExpressionEvaluator method rather than building at evaluation time. This way, embedded expressions are also wrapped appr

Repository: incubator-nifi
Updated Branches:
  refs/heads/develop bfe39c0b8 -> fed987e77


NIFI-206: Build appropriate AnyAttribute, AllAttributes, AnyMatchingAttribute, etc. evaluators in the buildExpressionEvaluator method rather than building at evaluation time. This way, embedded expressions are also wrapped appropriately.


Project: http://git-wip-us.apache.org/repos/asf/incubator-nifi/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-nifi/commit/fed987e7
Tree: http://git-wip-us.apache.org/repos/asf/incubator-nifi/tree/fed987e7
Diff: http://git-wip-us.apache.org/repos/asf/incubator-nifi/diff/fed987e7

Branch: refs/heads/develop
Commit: fed987e778e0e2488888ffe2ac3a916b68255aac
Parents: bfe39c0
Author: Mark Payne <ma...@hotmail.com>
Authored: Tue Dec 30 09:16:14 2014 -0500
Committer: Mark Payne <ma...@hotmail.com>
Committed: Tue Dec 30 09:16:14 2014 -0500

----------------------------------------------------------------------
 .../attribute/expression/language/Query.java    | 60 +++++++++++---------
 .../expression/language/TestQuery.java          | 10 ++++
 2 files changed, 42 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/fed987e7/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/Query.java
----------------------------------------------------------------------
diff --git a/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/Query.java b/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/Query.java
index f4c1c0d..93ab7ad 100644
--- a/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/Query.java
+++ b/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/Query.java
@@ -636,32 +636,7 @@ public class Query {
             throw new IllegalStateException("A Query cannot be evaluated more than once");
         }
 
-        Evaluator<?> chosenEvaluator = evaluator;
-        final Evaluator<?> rootEvaluator = getRootSubjectEvaluator(evaluator);
-        if (rootEvaluator != null) {
-            if (rootEvaluator instanceof MultiAttributeEvaluator) {
-                if (evaluator.getResultType() != ResultType.BOOLEAN) {
-                    throw new AttributeExpressionLanguageParsingException("Found Multi-Attribute function but return type is " + evaluator.getResultType() + ", not " + ResultType.BOOLEAN + ", for query: " + query);
-                }
-
-                final MultiAttributeEvaluator multiAttrEval = (MultiAttributeEvaluator) rootEvaluator;
-
-                switch (multiAttrEval.getEvaluationType()) {
-                    case ANY_ATTRIBUTE:
-                    case ANY_MATCHING_ATTRIBUTE:
-                    case ANY_DELINEATED_VALUE:
-                        chosenEvaluator = new AnyAttributeEvaluator((BooleanEvaluator) evaluator, multiAttrEval);
-                        break;
-                    case ALL_ATTRIBUTES:
-                    case ALL_MATCHING_ATTRIBUTES:
-                    case ALL_DELINEATED_VALUES:
-                        chosenEvaluator = new AllAttributesEvaluator((BooleanEvaluator) evaluator, multiAttrEval);
-                        break;
-                }
-            }
-        }
-
-        return chosenEvaluator.evaluate(attributes);
+        return evaluator.evaluate(attributes);
     }
 
     Tree getTree() {
@@ -843,8 +818,10 @@ public class Query {
         if (tree.getChildCount() == 0) {
             throw new AttributeExpressionLanguageParsingException("EXPRESSION tree node has no children");
         }
+        
+        final Evaluator<?> evaluator;
         if (tree.getChildCount() == 1) {
-            return buildEvaluator(tree.getChild(0));
+            evaluator = buildEvaluator(tree.getChild(0));
         } else {
             // we can chain together functions in the form of:
             // ${x:trim():substring(1,2):trim()}
@@ -852,8 +829,35 @@ public class Query {
             // subject is the function to its left (the first trim()), and its subject is the value of
             // the 'x' attribute. We accomplish this logic by iterating over all of the children of the
             // tree from the right-most child going left-ward.
-            return buildFunctionExpressionEvaluator(tree, 0);
+            evaluator = buildFunctionExpressionEvaluator(tree, 0);
+        }
+        
+        Evaluator<?> chosenEvaluator = evaluator;
+        final Evaluator<?> rootEvaluator = getRootSubjectEvaluator(evaluator);
+        if (rootEvaluator != null) {
+            if (rootEvaluator instanceof MultiAttributeEvaluator) {
+                if (evaluator.getResultType() != ResultType.BOOLEAN) {
+                    throw new AttributeExpressionLanguageParsingException("Found Multi-Attribute function but return type is " + evaluator.getResultType() + ", not " + ResultType.BOOLEAN + ", for query: " + tree.getText());
+                }
+
+                final MultiAttributeEvaluator multiAttrEval = (MultiAttributeEvaluator) rootEvaluator;
+
+                switch (multiAttrEval.getEvaluationType()) {
+                    case ANY_ATTRIBUTE:
+                    case ANY_MATCHING_ATTRIBUTE:
+                    case ANY_DELINEATED_VALUE:
+                        chosenEvaluator = new AnyAttributeEvaluator((BooleanEvaluator) evaluator, multiAttrEval);
+                        break;
+                    case ALL_ATTRIBUTES:
+                    case ALL_MATCHING_ATTRIBUTES:
+                    case ALL_DELINEATED_VALUES:
+                        chosenEvaluator = new AllAttributesEvaluator((BooleanEvaluator) evaluator, multiAttrEval);
+                        break;
+                }
+            }
         }
+        
+        return chosenEvaluator;
     }
 
     private static Evaluator<?> buildFunctionExpressionEvaluator(final Tree tree, final int offset) {

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/fed987e7/commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestQuery.java
----------------------------------------------------------------------
diff --git a/commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestQuery.java b/commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestQuery.java
index a2b7214..dd7a7fe 100644
--- a/commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestQuery.java
+++ b/commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestQuery.java
@@ -1047,6 +1047,16 @@ public class TestQuery {
         assertEquals(ResultType.NUMBER, Query.getResultType("${header.size:toNumber()}"));
     }
     
+    @Test
+    public void testAnyAttributeEmbedded() {
+        final Map<String, String> attributes = new HashMap<>();
+        attributes.put("a1", "test1");
+        attributes.put("b2", "2test");
+        attributes.put("c3", "3test3");
+        
+        final String query = "${a1:equals('test1'):and( ${anyAttribute('a1','b2','c3'):contains('2')})}";
+        verifyEquals(query, attributes, true);
+    }
     
     private void verifyEquals(final String expression, final Map<String, String> attributes, final Object expectedResult) {
         Query.validateExpression(expression, false);