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 2015/01/07 20:28:28 UTC

incubator-nifi git commit: NIFI-22: fixed issues with newly added join and count functions

Repository: incubator-nifi
Updated Branches:
  refs/heads/NIFI-22 49256d9d8 -> 14cba2a57


NIFI-22: fixed issues with newly added join and count functions


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

Branch: refs/heads/NIFI-22
Commit: 14cba2a57ec78cd1bb8e664474f0db1e6f2799b9
Parents: 49256d9
Author: Mark Payne <ma...@hotmail.com>
Authored: Wed Jan 7 14:16:51 2015 -0500
Committer: Mark Payne <ma...@hotmail.com>
Committed: Wed Jan 7 14:16:51 2015 -0500

----------------------------------------------------------------------
 .../attribute/expression/language/Query.java    | 50 ++++++++++++--------
 .../evaluation/reduce/JoinEvaluator.java        |  4 +-
 .../evaluation/selection/MappingEvaluator.java  |  2 +-
 .../expression/language/TestQuery.java          |  6 +--
 4 files changed, 35 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/14cba2a5/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 9a5fe0a..420a8e2 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
@@ -116,6 +116,7 @@ import org.antlr.runtime.ANTLRStringStream;
 import org.antlr.runtime.CharStream;
 import org.antlr.runtime.CommonTokenStream;
 import org.antlr.runtime.tree.Tree;
+import org.apache.nifi.attribute.expression.language.evaluation.selection.MappingEvaluator;
 
 /**
  * Class used for creating and evaluating NiFi Expression Language. Once a Query
@@ -515,26 +516,26 @@ public class Query {
         try {
             final List<String> substrings = new ArrayList<>();
             final Map<String, Tree> trees = new HashMap<>();
-    
+
             int lastIndex = 0;
             for (final Range range : ranges) {
                 if (range.getStart() > lastIndex) {
                     substrings.add(query.substring(lastIndex, range.getStart()).replace("$$", "$"));
                     lastIndex = range.getEnd() + 1;
                 }
-    
+
                 final String treeText = query.substring(range.getStart(), range.getEnd() + 1).replace("$$", "$");
                 substrings.add(treeText);
                 trees.put(treeText, Query.compileTree(treeText));
                 lastIndex = range.getEnd() + 1;
             }
-    
+
             final Range lastRange = ranges.get(ranges.size() - 1);
             if (lastRange.getEnd() + 1 < query.length()) {
                 final String treeText = query.substring(lastRange.getEnd() + 1).replace("$$", "$");
                 substrings.add(treeText);
             }
-    
+
             return new StandardPreparedQuery(substrings, trees);
         } catch (final AttributeExpressionLanguageParsingException e) {
             return new InvalidPreparedQuery(query, e.getMessage());
@@ -550,7 +551,7 @@ public class Query {
 
             final Evaluator<?> evaluator = buildEvaluator(tree);
             verifyMappingEvaluatorReduced(evaluator);
-            
+
             return new Query(query, tree, evaluator);
         } catch (final AttributeExpressionLanguageParsingException e) {
             throw e;
@@ -559,7 +560,6 @@ public class Query {
         }
     }
 
-    
     private static void verifyMappingEvaluatorReduced(final Evaluator<?> evaluator) {
         // if the result type of the evaluator is BOOLEAN, then it will always
         // be reduced when evaluator.
@@ -572,20 +572,20 @@ public class Query {
         if (rootEvaluator != null && rootEvaluator instanceof MultiAttributeEvaluator) {
             final MultiAttributeEvaluator multiAttrEval = (MultiAttributeEvaluator) rootEvaluator;
             switch (multiAttrEval.getEvaluationType()) {
-            case ALL_ATTRIBUTES:
-            case ALL_MATCHING_ATTRIBUTES:
-            case ALL_DELINEATED_VALUES: {
-                if (!(evaluator instanceof ReduceEvaluator)) {
-                    throw new AttributeExpressionLanguageParsingException("Cannot evaluate expression because it attempts to reference multiple attributes but does not use a reducing function");
+                case ALL_ATTRIBUTES:
+                case ALL_MATCHING_ATTRIBUTES:
+                case ALL_DELINEATED_VALUES: {
+                    if (!(evaluator instanceof ReduceEvaluator)) {
+                        throw new AttributeExpressionLanguageParsingException("Cannot evaluate expression because it attempts to reference multiple attributes but does not use a reducing function");
+                    }
+                    break;
                 }
-                break;
-            }
-            default:
-                throw new AttributeExpressionLanguageParsingException("Cannot evaluate expression because it attempts to reference multiple attributes but does not use a reducing function");
+                default:
+                    throw new AttributeExpressionLanguageParsingException("Cannot evaluate expression because it attempts to reference multiple attributes but does not use a reducing function");
             }
         }
     }
-    
+
     private static CommonTokenStream createTokenStream(final String expression) throws AttributeExpressionLanguageParsingException {
         final CharStream input = new ANTLRStringStream(expression);
         final AttributeExpressionLexer lexer = new AttributeExpressionLexer(input);
@@ -791,7 +791,7 @@ public class Query {
         if (tree.getChildCount() == 0) {
             throw new AttributeExpressionLanguageParsingException("EXPRESSION tree node has no children");
         }
-        
+
         final Evaluator<?> evaluator;
         if (tree.getChildCount() == 1) {
             evaluator = buildEvaluator(tree.getChild(0));
@@ -804,7 +804,7 @@ public class Query {
             // tree from the right-most child going left-ward.
             evaluator = buildFunctionExpressionEvaluator(tree, 0);
         }
-        
+
         Evaluator<?> chosenEvaluator = evaluator;
         final Evaluator<?> rootEvaluator = getRootSubjectEvaluator(evaluator);
         if (rootEvaluator != null) {
@@ -819,13 +819,21 @@ public class Query {
                         break;
                     case ALL_ATTRIBUTES:
                     case ALL_MATCHING_ATTRIBUTES:
-                    case ALL_DELINEATED_VALUES:
-                        chosenEvaluator = new AllAttributesEvaluator((BooleanEvaluator) evaluator, multiAttrEval);
+                    case ALL_DELINEATED_VALUES: {
+                        final ResultType resultType = evaluator.getResultType();
+                        if (resultType == ResultType.BOOLEAN) {
+                            chosenEvaluator = new AllAttributesEvaluator((BooleanEvaluator) evaluator, multiAttrEval);
+                        } else if (evaluator instanceof ReduceEvaluator) {
+                            chosenEvaluator = new MappingEvaluator((ReduceEvaluator) evaluator, multiAttrEval);
+                        } else {
+                            throw new AttributeExpressionLanguageException("Cannot evaluate Expression because it attempts to reference multiple attributes but does not use a reducing function");
+                        }
                         break;
+                    }
                 }
             }
         }
-        
+
         return chosenEvaluator;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/14cba2a5/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/reduce/JoinEvaluator.java
----------------------------------------------------------------------
diff --git a/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/reduce/JoinEvaluator.java b/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/reduce/JoinEvaluator.java
index 6fab871..eefdada 100644
--- a/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/reduce/JoinEvaluator.java
+++ b/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/reduce/JoinEvaluator.java
@@ -37,9 +37,9 @@ public class JoinEvaluator extends StringEvaluator implements ReduceEvaluator<St
     
     @Override
     public QueryResult<String> evaluate(final Map<String, String> attributes) {
-        final String subject = subjectEvaluator.evaluate(attributes).getValue();
+        String subject = subjectEvaluator.evaluate(attributes).getValue();
         if ( subject == null ) {
-            return new StringQueryResult("");
+            subject = "";
         }
         
         final String delimiter = delimiterEvaluator.evaluate(attributes).getValue();

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/14cba2a5/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/selection/MappingEvaluator.java
----------------------------------------------------------------------
diff --git a/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/selection/MappingEvaluator.java b/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/selection/MappingEvaluator.java
index 61ff2af..d872b6e 100644
--- a/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/selection/MappingEvaluator.java
+++ b/commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/selection/MappingEvaluator.java
@@ -55,7 +55,7 @@ public class MappingEvaluator<T> implements Evaluator<T> {
 
     @Override
     public Evaluator<?> getSubjectEvaluator() {
-        return mappingEvaluator;
+        return null;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/14cba2a5/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 824249b..ad0065c 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
@@ -235,8 +235,8 @@ public class TestQuery {
     public void testJoin() {
         final Map<String, String> attributes = new HashMap<>();
         attributes.put("a.a", "a");
-        attributes.put("b.b", "b");
-        attributes.put("c.c", "c");
+        attributes.put("a.b", "b");
+        attributes.put("a.c", "c");
         verifyEquals("${allAttributes( 'a.a', 'a.b', 'a.c' ):join(', ')}", attributes, "a, b, c");
         verifyEquals("${x:join(', ')}", attributes, "");
         verifyEquals("${a.a:join(', ')}", attributes, "a");
@@ -282,7 +282,7 @@ public class TestQuery {
     public void testCount() {
         final Map<String, String> attributes = new HashMap<>();
         attributes.put("a", "a");
-        attributes.put("b", "");
+        attributes.put("b", "abc");
         attributes.put("c", "        \n");
         attributes.put("n1", "111");
         attributes.put("n2", "222");