NIFI-482: Allowed for new 'literal' function. Make expressions invalid when 
they attempt to evaluate functions against the values of 'reducing functions'; 
cleanup Evaluators that were depending on Abstract classes instead of 
interfaces. Updated EL Guide to include new 'literal' function


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

Branch: refs/heads/NIFI-680
Commit: c4c98fc4a92ef44993324c5510cc31ba4736d4b8
Parents: 0f01b3c
Author: Mark Payne <marka...@hotmail.com>
Authored: Fri Jun 19 09:01:35 2015 -0400
Committer: Mark Payne <marka...@hotmail.com>
Committed: Mon Jun 22 09:04:55 2015 -0400

----------------------------------------------------------------------
 .../language/antlr/AttributeExpressionLexer.g   |   1 +
 .../language/antlr/AttributeExpressionParser.g  |   3 +-
 .../attribute/expression/language/Query.java    | 255 ++++++++++++-------
 .../language/evaluation/BooleanEvaluator.java   |  11 +
 .../language/evaluation/DateEvaluator.java      |  11 +
 .../language/evaluation/Evaluator.java          |  12 +
 .../language/evaluation/NumberEvaluator.java    |  10 +
 .../language/evaluation/StringEvaluator.java    |  11 +
 .../evaluation/functions/AndEvaluator.java      |   6 +-
 .../evaluation/functions/AppendEvaluator.java   |   6 +-
 .../functions/AttributeEvaluator.java           |   4 +-
 .../evaluation/functions/ContainsEvaluator.java |   7 +-
 .../evaluation/functions/DivideEvaluator.java   |   6 +-
 .../evaluation/functions/EndsWithEvaluator.java |   7 +-
 .../evaluation/functions/FindEvaluator.java     |   7 +-
 .../evaluation/functions/FormatEvaluator.java   |   4 +-
 .../functions/GreaterThanEvaluator.java         |   7 +-
 .../functions/GreaterThanOrEqualEvaluator.java  |   7 +-
 .../evaluation/functions/IndexOfEvaluator.java  |   7 +-
 .../functions/LastIndexOfEvaluator.java         |   7 +-
 .../evaluation/functions/LengthEvaluator.java   |   7 +-
 .../evaluation/functions/LessThanEvaluator.java |   7 +-
 .../functions/LessThanOrEqualEvaluator.java     |   7 +-
 .../evaluation/functions/MatchesEvaluator.java  |   7 +-
 .../evaluation/functions/MinusEvaluator.java    |   6 +-
 .../evaluation/functions/ModEvaluator.java      |   6 +-
 .../evaluation/functions/MultiplyEvaluator.java |   6 +-
 .../evaluation/functions/NotEvaluator.java      |   4 +-
 .../functions/NumberToDateEvaluator.java        |   5 +-
 .../evaluation/functions/OrEvaluator.java       |   6 +-
 .../evaluation/functions/PlusEvaluator.java     |   6 +-
 .../evaluation/functions/PrependEvaluator.java  |   6 +-
 .../functions/ReplaceAllEvaluator.java          |   8 +-
 .../functions/ReplaceEmptyEvaluator.java        |   6 +-
 .../evaluation/functions/ReplaceEvaluator.java  |   8 +-
 .../functions/ReplaceNullEvaluator.java         |   6 +-
 .../functions/StartsWithEvaluator.java          |   7 +-
 .../functions/StringToDateEvaluator.java        |   7 +-
 .../functions/SubstringAfterEvaluator.java      |   6 +-
 .../functions/SubstringAfterLastEvaluator.java  |   6 +-
 .../functions/SubstringBeforeEvaluator.java     |   6 +-
 .../functions/SubstringBeforeLastEvaluator.java |   6 +-
 .../functions/SubstringEvaluator.java           |  11 +-
 .../evaluation/functions/ToLowerEvaluator.java  |   6 +-
 .../evaluation/functions/ToNumberEvaluator.java |   7 +-
 .../evaluation/functions/ToRadixEvaluator.java  |  11 +-
 .../evaluation/functions/ToUpperEvaluator.java  |   6 +-
 .../evaluation/functions/TrimEvaluator.java     |   4 +-
 .../functions/UrlDecodeEvaluator.java           |   6 +-
 .../functions/UrlEncodeEvaluator.java           |   6 +-
 .../evaluation/literals/ToLiteralEvaluator.java |  43 ++++
 .../evaluation/reduce/JoinEvaluator.java        |   6 +-
 .../selection/AllAttributesEvaluator.java       |   7 +-
 .../selection/AnyAttributeEvaluator.java        |   7 +-
 .../AnyMatchingAttributeEvaluator.java          |  21 --
 .../selection/DelineatedAttributeEvaluator.java |  12 +-
 .../selection/IteratingEvaluator.java           |  33 +++
 .../evaluation/selection/MappingEvaluator.java  |  11 +-
 .../selection/MultiAttributeEvaluator.java      |   3 +-
 .../selection/MultiMatchAttributeEvaluator.java |   5 +
 .../selection/MultiNamedAttributeEvaluator.java |   5 +
 .../expression/language/TestQuery.java          |  54 +++-
 .../asciidoc/expression-language-guide.adoc     |  26 +-
 63 files changed, 532 insertions(+), 286 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c4c98fc4/nifi/nifi-commons/nifi-expression-language/src/main/antlr3/org/apache/nifi/attribute/expression/language/antlr/AttributeExpressionLexer.g
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-commons/nifi-expression-language/src/main/antlr3/org/apache/nifi/attribute/expression/language/antlr/AttributeExpressionLexer.g
 
b/nifi/nifi-commons/nifi-expression-language/src/main/antlr3/org/apache/nifi/attribute/expression/language/antlr/AttributeExpressionLexer.g
index 10394b9..80581f5 100644
--- 
a/nifi/nifi-commons/nifi-expression-language/src/main/antlr3/org/apache/nifi/attribute/expression/language/antlr/AttributeExpressionLexer.g
+++ 
b/nifi/nifi-commons/nifi-expression-language/src/main/antlr3/org/apache/nifi/attribute/expression/language/antlr/AttributeExpressionLexer.g
@@ -150,6 +150,7 @@ TO_RADIX : 'toRadix';
 OR : 'or';
 AND : 'and';
 JOIN : 'join';
+TO_LITERAL : 'literal';
 
 // 2 arg functions
 SUBSTRING      : 'substring';

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c4c98fc4/nifi/nifi-commons/nifi-expression-language/src/main/antlr3/org/apache/nifi/attribute/expression/language/antlr/AttributeExpressionParser.g
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-commons/nifi-expression-language/src/main/antlr3/org/apache/nifi/attribute/expression/language/antlr/AttributeExpressionParser.g
 
b/nifi/nifi-commons/nifi-expression-language/src/main/antlr3/org/apache/nifi/attribute/expression/language/antlr/AttributeExpressionParser.g
index f6a87dd..7c37530 100644
--- 
a/nifi/nifi-commons/nifi-expression-language/src/main/antlr3/org/apache/nifi/attribute/expression/language/antlr/AttributeExpressionParser.g
+++ 
b/nifi/nifi-commons/nifi-expression-language/src/main/antlr3/org/apache/nifi/attribute/expression/language/antlr/AttributeExpressionParser.g
@@ -127,7 +127,8 @@ functionCall : functionRef ->
 
 booleanLiteral : TRUE | FALSE;
 zeroArgStandaloneFunction : (IP | UUID | NOW | NEXT_INT | HOSTNAME) LPAREN! 
RPAREN!;
-oneArgStandaloneFunction : HOSTNAME^ LPAREN! booleanLiteral RPAREN!;
+oneArgStandaloneFunction : (TO_LITERAL^ LPAREN! anyArg RPAREN!) | 
+                           (HOSTNAME^ LPAREN! booleanLiteral RPAREN!);
 standaloneFunction : zeroArgStandaloneFunction | oneArgStandaloneFunction;
 
 attributeRefOrFunctionCall     : (attributeRef | standaloneFunction);

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c4c98fc4/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/Query.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/Query.java
 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/Query.java
index 77d08c6..07fbac6 100644
--- 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/Query.java
+++ 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/Query.java
@@ -95,12 +95,14 @@ import 
org.apache.nifi.attribute.expression.language.evaluation.functions.UuidEv
 import 
org.apache.nifi.attribute.expression.language.evaluation.literals.BooleanLiteralEvaluator;
 import 
org.apache.nifi.attribute.expression.language.evaluation.literals.NumberLiteralEvaluator;
 import 
org.apache.nifi.attribute.expression.language.evaluation.literals.StringLiteralEvaluator;
+import 
org.apache.nifi.attribute.expression.language.evaluation.literals.ToLiteralEvaluator;
 import 
org.apache.nifi.attribute.expression.language.evaluation.reduce.CountEvaluator;
 import 
org.apache.nifi.attribute.expression.language.evaluation.reduce.JoinEvaluator;
 import 
org.apache.nifi.attribute.expression.language.evaluation.reduce.ReduceEvaluator;
 import 
org.apache.nifi.attribute.expression.language.evaluation.selection.AllAttributesEvaluator;
 import 
org.apache.nifi.attribute.expression.language.evaluation.selection.AnyAttributeEvaluator;
 import 
org.apache.nifi.attribute.expression.language.evaluation.selection.DelineatedAttributeEvaluator;
+import 
org.apache.nifi.attribute.expression.language.evaluation.selection.IteratingEvaluator;
 import 
org.apache.nifi.attribute.expression.language.evaluation.selection.MultiAttributeEvaluator;
 import 
org.apache.nifi.attribute.expression.language.evaluation.selection.MultiMatchAttributeEvaluator;
 import 
org.apache.nifi.attribute.expression.language.evaluation.selection.MultiNamedAttributeEvaluator;
@@ -114,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 static 
org.apache.nifi.attribute.expression.language.antlr.AttributeExpressionParser.ALL_ATTRIBUTES;
 import static 
org.apache.nifi.attribute.expression.language.antlr.AttributeExpressionParser.ALL_DELINEATED_VALUES;
 import static 
org.apache.nifi.attribute.expression.language.antlr.AttributeExpressionParser.ALL_MATCHING_ATTRIBUTES;
@@ -171,6 +174,7 @@ import static 
org.apache.nifi.attribute.expression.language.antlr.AttributeExpre
 import static 
org.apache.nifi.attribute.expression.language.antlr.AttributeExpressionParser.SUBSTRING_BEFORE;
 import static 
org.apache.nifi.attribute.expression.language.antlr.AttributeExpressionParser.SUBSTRING_BEFORE_LAST;
 import static 
org.apache.nifi.attribute.expression.language.antlr.AttributeExpressionParser.TO_DATE;
+import static 
org.apache.nifi.attribute.expression.language.antlr.AttributeExpressionParser.TO_LITERAL;
 import static 
org.apache.nifi.attribute.expression.language.antlr.AttributeExpressionParser.TO_LOWER;
 import static 
org.apache.nifi.attribute.expression.language.antlr.AttributeExpressionParser.TO_NUMBER;
 import static 
org.apache.nifi.attribute.expression.language.antlr.AttributeExpressionParser.TO_RADIX;
@@ -181,6 +185,7 @@ import static 
org.apache.nifi.attribute.expression.language.antlr.AttributeExpre
 import static 
org.apache.nifi.attribute.expression.language.antlr.AttributeExpressionParser.URL_DECODE;
 import static 
org.apache.nifi.attribute.expression.language.antlr.AttributeExpressionParser.URL_ENCODE;
 import static 
org.apache.nifi.attribute.expression.language.antlr.AttributeExpressionParser.UUID;
+
 import 
org.apache.nifi.attribute.expression.language.evaluation.selection.MappingEvaluator;
 
 /**
@@ -205,7 +210,7 @@ public class Query {
         try {
             validateExpression(value, false);
             return true;
-        } catch (final ProcessException e) {
+        } catch (final AttributeExpressionLanguageParsingException | 
ProcessException e) {
             return false;
         }
     }
@@ -341,7 +346,7 @@ public class Query {
 
             if (c == '\\') {
                 backslashCount++;
-            } else if (c == quoteChar && ((backslashCount % 2 == 0) || 
lastChar != '\\')) {
+            } else if (c == quoteChar && (backslashCount % 2 == 0 || lastChar 
!= '\\')) {
                 return i;
             }
 
@@ -359,7 +364,7 @@ public class Query {
 
         final String value = evaluated.toString();
         final String escaped = value.replace("$$", "$");
-        return (decorator == null) ? escaped : decorator.decorate(escaped);
+        return decorator == null ? escaped : decorator.decorate(escaped);
     }
 
     static String evaluateExpressions(final String rawValue, Map<String, 
String> expressionMap) throws ProcessException {
@@ -631,6 +636,25 @@ public class Query {
     }
 
     private static void verifyMappingEvaluatorReduced(final Evaluator<?> 
evaluator) {
+        final Evaluator<?> rightMostEvaluator;
+        if (evaluator instanceof IteratingEvaluator) {
+            rightMostEvaluator = ((IteratingEvaluator<?>) 
evaluator).getLogicEvaluator();
+        } else {
+            rightMostEvaluator = evaluator;
+        }
+
+        Evaluator<?> eval = rightMostEvaluator.getSubjectEvaluator();
+        Evaluator<?> lastEval = rightMostEvaluator;
+        while (eval != null) {
+            if (eval instanceof ReduceEvaluator) {
+                throw new 
AttributeExpressionLanguageParsingException("Expression attempts to call 
function '" + lastEval.getToken() + "' on the result of '" + eval.getToken() +
+                    "'. This is not allowed. Instead, use \"${literal( 
${<embedded expression>} ):" + lastEval.getToken() + "(...)}\"");
+            }
+
+            lastEval = eval;
+            eval = eval.getSubjectEvaluator();
+        }
+
         // if the result type of the evaluator is BOOLEAN, then it will always
         // be reduced when evaluator.
         final ResultType resultType = evaluator.getResultType();
@@ -691,7 +715,7 @@ public class Query {
         return "Query [" + query + "]";
     }
 
-    private static StringEvaluator newStringLiteralEvaluator(final String 
literalValue) {
+    private static Evaluator<String> newStringLiteralEvaluator(final String 
literalValue) {
         if (literalValue == null || literalValue.length() < 2) {
             return new StringLiteralEvaluator(literalValue);
         }
@@ -724,7 +748,7 @@ public class Query {
             return toStringEvaluator(evaluators.get(0));
         }
 
-        StringEvaluator lastEvaluator = toStringEvaluator(evaluators.get(0));
+        Evaluator<String> lastEvaluator = toStringEvaluator(evaluators.get(0));
         for (int i = 1; i < evaluators.size(); i++) {
             lastEvaluator = new AppendEvaluator(lastEvaluator, 
toStringEvaluator(evaluators.get(i)));
         }
@@ -749,8 +773,8 @@ public class Query {
                 final Tree functionTypeTree = tree.getChild(0);
                 final int multiAttrType = functionTypeTree.getType();
                 if (multiAttrType == ANY_DELINEATED_VALUE || multiAttrType == 
ALL_DELINEATED_VALUES) {
-                    final StringEvaluator delineatedValueEvaluator = 
toStringEvaluator(buildEvaluator(tree.getChild(1)));
-                    final StringEvaluator delimiterEvaluator = 
toStringEvaluator(buildEvaluator(tree.getChild(2)));
+                    final Evaluator<String> delineatedValueEvaluator = 
toStringEvaluator(buildEvaluator(tree.getChild(1)));
+                    final Evaluator<String> delimiterEvaluator = 
toStringEvaluator(buildEvaluator(tree.getChild(2)));
 
                     return new 
DelineatedAttributeEvaluator(delineatedValueEvaluator, delimiterEvaluator, 
multiAttrType);
                 }
@@ -807,6 +831,10 @@ public class Query {
             case NOW: {
                 return new NowEvaluator();
             }
+            case TO_LITERAL: {
+                final Evaluator<?> argEvaluator = 
buildEvaluator(tree.getChild(0));
+                return new ToLiteralEvaluator(argEvaluator);
+            }
             case IP: {
                 try {
                     return new IPEvaluator();
@@ -818,7 +846,7 @@ public class Query {
                 if (tree.getChildCount() == 0) {
                     try {
                         return new HostnameEvaluator(false);
-                    } catch (UnknownHostException e) {
+                    } catch (final UnknownHostException e) {
                         throw new AttributeExpressionLanguageException(e);
                     }
                 } else if (tree.getChildCount() == 1) {
@@ -832,7 +860,7 @@ public class Query {
                             default:
                                 throw new 
AttributeExpressionLanguageParsingException("Call to hostname() must take 0 or 
1 (boolean) parameter");
                         }
-                    } catch (UnknownHostException e) {
+                    } catch (final UnknownHostException e) {
                         throw new AttributeExpressionLanguageException(e);
                     }
                 } else {
@@ -847,16 +875,22 @@ public class Query {
         }
     }
 
+    private static <T> Evaluator<T> addToken(final Evaluator<T> evaluator, 
final String token) {
+        evaluator.setToken(token);
+        return evaluator;
+    }
+
     private static Evaluator<Boolean> buildBooleanEvaluator(final Tree tree) {
         switch (tree.getType()) {
             case TRUE:
-                return new BooleanLiteralEvaluator(true);
+                return addToken(new BooleanLiteralEvaluator(true), "true");
             case FALSE:
-                return new BooleanLiteralEvaluator(false);
+                return addToken(new BooleanLiteralEvaluator(false), "true");
         }
         throw new AttributeExpressionLanguageParsingException("Cannot build 
Boolean evaluator from tree " + tree.toString());
     }
 
+    @SuppressWarnings({ "rawtypes", "unchecked" })
     private static Evaluator<?> buildExpressionEvaluator(final Tree tree) {
         if (tree.getChildCount() == 0) {
             throw new AttributeExpressionLanguageParsingException("EXPRESSION 
tree node has no children");
@@ -901,6 +935,27 @@ public class Query {
                         break;
                     }
                 }
+
+                switch (multiAttrEval.getEvaluationType()) {
+                    case ANY_ATTRIBUTE:
+                        chosenEvaluator.setToken("anyAttribute");
+                        break;
+                    case ANY_MATCHING_ATTRIBUTE:
+                        chosenEvaluator.setToken("anyMatchingAttribute");
+                        break;
+                    case ANY_DELINEATED_VALUE:
+                        chosenEvaluator.setToken("anyDelineatedValue");
+                        break;
+                    case ALL_ATTRIBUTES:
+                        chosenEvaluator.setToken("allAttributes");
+                        break;
+                    case ALL_MATCHING_ATTRIBUTES:
+                        chosenEvaluator.setToken("allMatchingAttributes");
+                        break;
+                    case ALL_DELINEATED_VALUES:
+                        chosenEvaluator.setToken("allDelineatedValues");
+                        break;
+                }
             }
         }
 
@@ -934,24 +989,25 @@ public class Query {
         return args;
     }
 
-    private static StringEvaluator toStringEvaluator(final Evaluator<?> 
evaluator) {
+    private static Evaluator<String> toStringEvaluator(final Evaluator<?> 
evaluator) {
         return toStringEvaluator(evaluator, null);
     }
 
-    private static StringEvaluator toStringEvaluator(final Evaluator<?> 
evaluator, final String location) {
+    private static Evaluator<String> toStringEvaluator(final Evaluator<?> 
evaluator, final String location) {
         if (evaluator.getResultType() == ResultType.STRING) {
             return (StringEvaluator) evaluator;
         }
 
-        return new StringCastEvaluator(evaluator);
+        return addToken(new StringCastEvaluator(evaluator), 
evaluator.getToken());
     }
 
-    private static BooleanEvaluator toBooleanEvaluator(final Evaluator<?> 
evaluator, final String location) {
+    @SuppressWarnings("unchecked")
+    private static Evaluator<Boolean> toBooleanEvaluator(final Evaluator<?> 
evaluator, final String location) {
         switch (evaluator.getResultType()) {
             case BOOLEAN:
-                return (BooleanEvaluator) evaluator;
+                return (Evaluator<Boolean>) evaluator;
             case STRING:
-                return new BooleanCastEvaluator((StringEvaluator) evaluator);
+                return addToken(new BooleanCastEvaluator((StringEvaluator) 
evaluator), evaluator.getToken());
             default:
                 throw new AttributeExpressionLanguageParsingException("Cannot 
implicitly convert Data Type " + evaluator.getResultType() + " to " + 
ResultType.BOOLEAN
                     + (location == null ? "" : " at location [" + location + 
"]"));
@@ -959,22 +1015,23 @@ public class Query {
 
     }
 
-    private static BooleanEvaluator toBooleanEvaluator(final Evaluator<?> 
evaluator) {
+    private static Evaluator<Boolean> toBooleanEvaluator(final Evaluator<?> 
evaluator) {
         return toBooleanEvaluator(evaluator, null);
     }
 
-    private static NumberEvaluator toNumberEvaluator(final Evaluator<?> 
evaluator) {
+    private static Evaluator<Long> toNumberEvaluator(final Evaluator<?> 
evaluator) {
         return toNumberEvaluator(evaluator, null);
     }
 
-    private static NumberEvaluator toNumberEvaluator(final Evaluator<?> 
evaluator, final String location) {
+    @SuppressWarnings("unchecked")
+    private static Evaluator<Long> toNumberEvaluator(final Evaluator<?> 
evaluator, final String location) {
         switch (evaluator.getResultType()) {
             case NUMBER:
-                return (NumberEvaluator) evaluator;
+                return (Evaluator<Long>) evaluator;
             case STRING:
-                return new NumberCastEvaluator(evaluator);
+                return addToken(new NumberCastEvaluator(evaluator), 
evaluator.getToken());
             case DATE:
-                return new DateToNumberEvaluator((DateEvaluator) evaluator);
+                return addToken(new DateToNumberEvaluator((DateEvaluator) 
evaluator), evaluator.getToken());
             default:
                 throw new AttributeExpressionLanguageParsingException("Cannot 
implicitly convert Data Type " + evaluator.getResultType() + " to " + 
ResultType.NUMBER
                     + (location == null ? "" : " at location [" + location + 
"]"));
@@ -997,233 +1054,233 @@ public class Query {
         switch (tree.getType()) {
             case TRIM: {
                 verifyArgCount(argEvaluators, 0, "trim");
-                return new TrimEvaluator(toStringEvaluator(subjectEvaluator));
+                return addToken(new 
TrimEvaluator(toStringEvaluator(subjectEvaluator)), "trim");
             }
             case TO_STRING: {
                 verifyArgCount(argEvaluators, 0, "toString");
-                return new ToStringEvaluator(subjectEvaluator);
+                return addToken(new ToStringEvaluator(subjectEvaluator), 
"toString");
             }
             case TO_LOWER: {
                 verifyArgCount(argEvaluators, 0, "toLower");
-                return new 
ToLowerEvaluator(toStringEvaluator(subjectEvaluator));
+                return addToken(new 
ToLowerEvaluator(toStringEvaluator(subjectEvaluator)), "toLower");
             }
             case TO_UPPER: {
                 verifyArgCount(argEvaluators, 0, "toUpper");
-                return new 
ToUpperEvaluator(toStringEvaluator(subjectEvaluator));
+                return addToken(new 
ToUpperEvaluator(toStringEvaluator(subjectEvaluator)), "toUpper");
             }
             case URL_ENCODE: {
                 verifyArgCount(argEvaluators, 0, "urlEncode");
-                return new 
UrlEncodeEvaluator(toStringEvaluator(subjectEvaluator));
+                return addToken(new 
UrlEncodeEvaluator(toStringEvaluator(subjectEvaluator)), "urlEncode");
             }
             case URL_DECODE: {
                 verifyArgCount(argEvaluators, 0, "urlDecode");
-                return new 
UrlDecodeEvaluator(toStringEvaluator(subjectEvaluator));
+                return addToken(new 
UrlDecodeEvaluator(toStringEvaluator(subjectEvaluator)), "urlDecode");
             }
             case SUBSTRING_BEFORE: {
                 verifyArgCount(argEvaluators, 1, "substringBefore");
-                return new 
SubstringBeforeEvaluator(toStringEvaluator(subjectEvaluator),
-                    toStringEvaluator(argEvaluators.get(0), "first argument to 
substringBefore"));
+                return addToken(new 
SubstringBeforeEvaluator(toStringEvaluator(subjectEvaluator),
+                    toStringEvaluator(argEvaluators.get(0), "first argument to 
substringBefore")), "substringBefore");
             }
             case SUBSTRING_BEFORE_LAST: {
                 verifyArgCount(argEvaluators, 1, "substringBeforeLast");
-                return new 
SubstringBeforeLastEvaluator(toStringEvaluator(subjectEvaluator),
-                    toStringEvaluator(argEvaluators.get(0), "first argument to 
substringBeforeLast"));
+                return addToken(new 
SubstringBeforeLastEvaluator(toStringEvaluator(subjectEvaluator),
+                    toStringEvaluator(argEvaluators.get(0), "first argument to 
substringBeforeLast")), "substringBeforeLast");
             }
             case SUBSTRING_AFTER: {
                 verifyArgCount(argEvaluators, 1, "substringAfter");
-                return new 
SubstringAfterEvaluator(toStringEvaluator(subjectEvaluator),
-                    toStringEvaluator(argEvaluators.get(0), "first argument to 
substringAfter"));
+                return addToken(new 
SubstringAfterEvaluator(toStringEvaluator(subjectEvaluator),
+                    toStringEvaluator(argEvaluators.get(0), "first argument to 
substringAfter")), "substringAfter");
             }
             case SUBSTRING_AFTER_LAST: {
                 verifyArgCount(argEvaluators, 1, "substringAfterLast");
-                return new 
SubstringAfterLastEvaluator(toStringEvaluator(subjectEvaluator),
-                    toStringEvaluator(argEvaluators.get(0), "first argument to 
substringAfterLast"));
+                return addToken(new 
SubstringAfterLastEvaluator(toStringEvaluator(subjectEvaluator),
+                    toStringEvaluator(argEvaluators.get(0), "first argument to 
substringAfterLast")), "substringAfterLast");
             }
             case REPLACE_NULL: {
                 verifyArgCount(argEvaluators, 1, "replaceNull");
-                return new 
ReplaceNullEvaluator(toStringEvaluator(subjectEvaluator),
-                    toStringEvaluator(argEvaluators.get(0), "first argument to 
replaceNull"));
+                return addToken(new 
ReplaceNullEvaluator(toStringEvaluator(subjectEvaluator),
+                    toStringEvaluator(argEvaluators.get(0), "first argument to 
replaceNull")), "replaceNull");
             }
             case REPLACE_EMPTY: {
                 verifyArgCount(argEvaluators, 1, "replaceEmtpy");
-                return new 
ReplaceEmptyEvaluator(toStringEvaluator(subjectEvaluator), 
toStringEvaluator(argEvaluators.get(0), "first argumen to replaceEmpty"));
+                return addToken(new 
ReplaceEmptyEvaluator(toStringEvaluator(subjectEvaluator), 
toStringEvaluator(argEvaluators.get(0), "first argument to replaceEmpty")), 
"replaceEmpty");
             }
             case REPLACE: {
                 verifyArgCount(argEvaluators, 2, "replace");
-                return new 
ReplaceEvaluator(toStringEvaluator(subjectEvaluator),
+                return addToken(new 
ReplaceEvaluator(toStringEvaluator(subjectEvaluator),
                     toStringEvaluator(argEvaluators.get(0), "first argument to 
replace"),
-                    toStringEvaluator(argEvaluators.get(1), "second argument 
to replace"));
+                    toStringEvaluator(argEvaluators.get(1), "second argument 
to replace")), "replace");
             }
             case REPLACE_ALL: {
                 verifyArgCount(argEvaluators, 2, "replaceAll");
-                return new 
ReplaceAllEvaluator(toStringEvaluator(subjectEvaluator),
+                return addToken(new 
ReplaceAllEvaluator(toStringEvaluator(subjectEvaluator),
                     toStringEvaluator(argEvaluators.get(0), "first argument to 
replaceAll"),
-                    toStringEvaluator(argEvaluators.get(1), "second argument 
to replaceAll"));
+                    toStringEvaluator(argEvaluators.get(1), "second argument 
to replaceAll")), "replaceAll");
             }
             case APPEND: {
                 verifyArgCount(argEvaluators, 1, "append");
-                return new AppendEvaluator(toStringEvaluator(subjectEvaluator),
-                    toStringEvaluator(argEvaluators.get(0), "first argument to 
append"));
+                return addToken(new 
AppendEvaluator(toStringEvaluator(subjectEvaluator),
+                    toStringEvaluator(argEvaluators.get(0), "first argument to 
append")), "append");
             }
             case PREPEND: {
                 verifyArgCount(argEvaluators, 1, "prepend");
-                return new 
PrependEvaluator(toStringEvaluator(subjectEvaluator),
-                    toStringEvaluator(argEvaluators.get(0), "first argument to 
prepend"));
+                return addToken(new 
PrependEvaluator(toStringEvaluator(subjectEvaluator),
+                    toStringEvaluator(argEvaluators.get(0), "first argument to 
prepend")), "prepend");
             }
             case SUBSTRING: {
                 final int numArgs = argEvaluators.size();
                 if (numArgs == 1) {
-                    return new 
SubstringEvaluator(toStringEvaluator(subjectEvaluator),
-                        toNumberEvaluator(argEvaluators.get(0), "first 
argument to substring"));
+                    return addToken(new 
SubstringEvaluator(toStringEvaluator(subjectEvaluator),
+                        toNumberEvaluator(argEvaluators.get(0), "first 
argument to substring")), "substring");
                 } else if (numArgs == 2) {
-                    return new 
SubstringEvaluator(toStringEvaluator(subjectEvaluator),
+                    return addToken(new 
SubstringEvaluator(toStringEvaluator(subjectEvaluator),
                         toNumberEvaluator(argEvaluators.get(0), "first 
argument to substring"),
-                        toNumberEvaluator(argEvaluators.get(1), "second 
argument to substring"));
+                        toNumberEvaluator(argEvaluators.get(1), "second 
argument to substring")), "substring");
                 } else {
                     throw new 
AttributeExpressionLanguageParsingException("substring() function can take 
either 1 or 2 arguments but cannot take " + numArgs + " arguments");
                 }
             }
             case JOIN: {
                 verifyArgCount(argEvaluators, 1, "join");
-                return new JoinEvaluator(toStringEvaluator(subjectEvaluator), 
toStringEvaluator(argEvaluators.get(0)));
+                return addToken(new 
JoinEvaluator(toStringEvaluator(subjectEvaluator), 
toStringEvaluator(argEvaluators.get(0))), "join");
             }
             case COUNT: {
                 verifyArgCount(argEvaluators, 0, "count");
-                return new CountEvaluator(subjectEvaluator);
+                return addToken(new CountEvaluator(subjectEvaluator), "count");
             }
             case IS_NULL: {
                 verifyArgCount(argEvaluators, 0, "isNull");
-                return new 
IsNullEvaluator(toStringEvaluator(subjectEvaluator));
+                return addToken(new 
IsNullEvaluator(toStringEvaluator(subjectEvaluator)), "isNull");
             }
             case IS_EMPTY: {
                 verifyArgCount(argEvaluators, 0, "isNull");
-                return new 
IsEmptyEvaluator(toStringEvaluator(subjectEvaluator));
+                return addToken(new 
IsEmptyEvaluator(toStringEvaluator(subjectEvaluator)), "isEmpty");
             }
             case NOT_NULL: {
                 verifyArgCount(argEvaluators, 0, "notNull");
-                return new 
NotNullEvaluator(toStringEvaluator(subjectEvaluator));
+                return addToken(new 
NotNullEvaluator(toStringEvaluator(subjectEvaluator)), "notNull");
             }
             case STARTS_WITH: {
                 verifyArgCount(argEvaluators, 1, "startsWith");
-                return new 
StartsWithEvaluator(toStringEvaluator(subjectEvaluator),
-                    toStringEvaluator(argEvaluators.get(0), "first argument to 
startsWith"));
+                return addToken(new 
StartsWithEvaluator(toStringEvaluator(subjectEvaluator),
+                    toStringEvaluator(argEvaluators.get(0), "first argument to 
startsWith")), "startsWith");
             }
             case ENDS_WITH: {
                 verifyArgCount(argEvaluators, 1, "endsWith");
-                return new 
EndsWithEvaluator(toStringEvaluator(subjectEvaluator),
-                    toStringEvaluator(argEvaluators.get(0), "first argument to 
endsWith"));
+                return addToken(new 
EndsWithEvaluator(toStringEvaluator(subjectEvaluator),
+                    toStringEvaluator(argEvaluators.get(0), "first argument to 
endsWith")), "endsWith");
             }
             case CONTAINS: {
                 verifyArgCount(argEvaluators, 1, "contains");
-                return new 
ContainsEvaluator(toStringEvaluator(subjectEvaluator),
-                    toStringEvaluator(argEvaluators.get(0), "first argument to 
contains"));
+                return addToken(new 
ContainsEvaluator(toStringEvaluator(subjectEvaluator),
+                    toStringEvaluator(argEvaluators.get(0), "first argument to 
contains")), "contains");
             }
             case FIND: {
                 verifyArgCount(argEvaluators, 1, "find");
-                return new FindEvaluator(toStringEvaluator(subjectEvaluator),
-                    toStringEvaluator(argEvaluators.get(0), "first argument to 
find"));
+                return addToken(new 
FindEvaluator(toStringEvaluator(subjectEvaluator),
+                    toStringEvaluator(argEvaluators.get(0), "first argument to 
find")), "find");
             }
             case MATCHES: {
                 verifyArgCount(argEvaluators, 1, "matches");
-                return new 
MatchesEvaluator(toStringEvaluator(subjectEvaluator),
-                    toStringEvaluator(argEvaluators.get(0), "first argument to 
matches"));
+                return addToken(new 
MatchesEvaluator(toStringEvaluator(subjectEvaluator),
+                    toStringEvaluator(argEvaluators.get(0), "first argument to 
matches")), "matches");
             }
             case EQUALS: {
                 verifyArgCount(argEvaluators, 1, "equals");
-                return new EqualsEvaluator(subjectEvaluator, 
argEvaluators.get(0));
+                return addToken(new EqualsEvaluator(subjectEvaluator, 
argEvaluators.get(0)), "equals");
             }
             case EQUALS_IGNORE_CASE: {
                 verifyArgCount(argEvaluators, 1, "equalsIgnoreCase");
-                return new 
EqualsIgnoreCaseEvaluator(toStringEvaluator(subjectEvaluator),
-                    toStringEvaluator(argEvaluators.get(0), "first argument to 
equalsIgnoreCase"));
+                return addToken(new 
EqualsIgnoreCaseEvaluator(toStringEvaluator(subjectEvaluator),
+                    toStringEvaluator(argEvaluators.get(0), "first argument to 
equalsIgnoreCase")), "equalsIgnoreCase");
             }
             case GREATER_THAN: {
                 verifyArgCount(argEvaluators, 1, "gt");
-                return new 
GreaterThanEvaluator(toNumberEvaluator(subjectEvaluator),
-                    toNumberEvaluator(argEvaluators.get(0), "first argument to 
gt"));
+                return addToken(new 
GreaterThanEvaluator(toNumberEvaluator(subjectEvaluator),
+                    toNumberEvaluator(argEvaluators.get(0), "first argument to 
gt")), "gt");
             }
             case GREATER_THAN_OR_EQUAL: {
                 verifyArgCount(argEvaluators, 1, "ge");
-                return new 
GreaterThanOrEqualEvaluator(toNumberEvaluator(subjectEvaluator),
-                    toNumberEvaluator(argEvaluators.get(0), "first argument to 
ge"));
+                return addToken(new 
GreaterThanOrEqualEvaluator(toNumberEvaluator(subjectEvaluator),
+                    toNumberEvaluator(argEvaluators.get(0), "first argument to 
ge")), "ge");
             }
             case LESS_THAN: {
                 verifyArgCount(argEvaluators, 1, "lt");
-                return new 
LessThanEvaluator(toNumberEvaluator(subjectEvaluator),
-                    toNumberEvaluator(argEvaluators.get(0), "first argument to 
lt"));
+                return addToken(new 
LessThanEvaluator(toNumberEvaluator(subjectEvaluator),
+                    toNumberEvaluator(argEvaluators.get(0), "first argument to 
lt")), "lt");
             }
             case LESS_THAN_OR_EQUAL: {
                 verifyArgCount(argEvaluators, 1, "le");
-                return new 
LessThanOrEqualEvaluator(toNumberEvaluator(subjectEvaluator),
-                    toNumberEvaluator(argEvaluators.get(0), "first argument to 
le"));
+                return addToken(new 
LessThanOrEqualEvaluator(toNumberEvaluator(subjectEvaluator),
+                    toNumberEvaluator(argEvaluators.get(0), "first argument to 
le")), "le");
             }
             case LENGTH: {
                 verifyArgCount(argEvaluators, 0, "length");
-                return new 
LengthEvaluator(toStringEvaluator(subjectEvaluator));
+                return addToken(new 
LengthEvaluator(toStringEvaluator(subjectEvaluator)), "length");
             }
             case TO_DATE: {
                 if (argEvaluators.isEmpty()) {
-                    return new 
NumberToDateEvaluator(toNumberEvaluator(subjectEvaluator));
+                    return addToken(new 
NumberToDateEvaluator(toNumberEvaluator(subjectEvaluator)), "toDate");
                 } else if (subjectEvaluator.getResultType() == 
ResultType.STRING) {
-                    return new 
StringToDateEvaluator(toStringEvaluator(subjectEvaluator), 
toStringEvaluator(argEvaluators.get(0)));
+                    return addToken(new 
StringToDateEvaluator(toStringEvaluator(subjectEvaluator), 
toStringEvaluator(argEvaluators.get(0))), "toDate");
                 } else {
-                    return new 
NumberToDateEvaluator(toNumberEvaluator(subjectEvaluator));
+                    return addToken(new 
NumberToDateEvaluator(toNumberEvaluator(subjectEvaluator)), "toDate");
                 }
             }
             case TO_NUMBER: {
                 verifyArgCount(argEvaluators, 0, "toNumber");
                 switch (subjectEvaluator.getResultType()) {
                     case STRING:
-                        return new ToNumberEvaluator((StringEvaluator) 
subjectEvaluator);
+                        return addToken(new 
ToNumberEvaluator((StringEvaluator) subjectEvaluator), "toNumber");
                     case DATE:
-                        return new DateToNumberEvaluator((DateEvaluator) 
subjectEvaluator);
+                        return addToken(new 
DateToNumberEvaluator((DateEvaluator) subjectEvaluator), "toNumber");
                     default:
                         throw new 
AttributeExpressionLanguageParsingException(subjectEvaluator + " returns type " 
+ subjectEvaluator.getResultType() + " but expected to get " + 
ResultType.STRING);
                 }
             }
             case TO_RADIX: {
                 if (argEvaluators.size() == 1) {
-                    return new ToRadixEvaluator((NumberEvaluator) 
subjectEvaluator, toNumberEvaluator(argEvaluators.get(0)));
+                    return addToken(new ToRadixEvaluator((NumberEvaluator) 
subjectEvaluator, toNumberEvaluator(argEvaluators.get(0))), "toRadix");
                 } else {
-                    return new ToRadixEvaluator((NumberEvaluator) 
subjectEvaluator, toNumberEvaluator(argEvaluators.get(0)), 
toNumberEvaluator(argEvaluators.get(1)));
+                    return addToken(new ToRadixEvaluator((NumberEvaluator) 
subjectEvaluator, toNumberEvaluator(argEvaluators.get(0)), 
toNumberEvaluator(argEvaluators.get(1))), "toRadix");
                 }
             }
             case MOD: {
-                return new ModEvaluator(toNumberEvaluator(subjectEvaluator), 
toNumberEvaluator(argEvaluators.get(0)));
+                return addToken(new 
ModEvaluator(toNumberEvaluator(subjectEvaluator), 
toNumberEvaluator(argEvaluators.get(0))), "mod");
             }
             case PLUS: {
-                return new PlusEvaluator(toNumberEvaluator(subjectEvaluator), 
toNumberEvaluator(argEvaluators.get(0)));
+                return addToken(new 
PlusEvaluator(toNumberEvaluator(subjectEvaluator), 
toNumberEvaluator(argEvaluators.get(0))), "plus");
             }
             case MINUS: {
-                return new MinusEvaluator(toNumberEvaluator(subjectEvaluator), 
toNumberEvaluator(argEvaluators.get(0)));
+                return addToken(new 
MinusEvaluator(toNumberEvaluator(subjectEvaluator), 
toNumberEvaluator(argEvaluators.get(0))), "minus");
             }
             case MULTIPLY: {
-                return new 
MultiplyEvaluator(toNumberEvaluator(subjectEvaluator), 
toNumberEvaluator(argEvaluators.get(0)));
+                return addToken(new 
MultiplyEvaluator(toNumberEvaluator(subjectEvaluator), 
toNumberEvaluator(argEvaluators.get(0))), "multiply");
             }
             case DIVIDE: {
-                return new 
DivideEvaluator(toNumberEvaluator(subjectEvaluator), 
toNumberEvaluator(argEvaluators.get(0)));
+                return addToken(new 
DivideEvaluator(toNumberEvaluator(subjectEvaluator), 
toNumberEvaluator(argEvaluators.get(0))), "divide");
             }
             case INDEX_OF: {
                 verifyArgCount(argEvaluators, 1, "indexOf");
-                return new 
IndexOfEvaluator(toStringEvaluator(subjectEvaluator),
-                    toStringEvaluator(argEvaluators.get(0), "first argument to 
indexOf"));
+                return addToken(new 
IndexOfEvaluator(toStringEvaluator(subjectEvaluator),
+                    toStringEvaluator(argEvaluators.get(0), "first argument to 
indexOf")), "indexOf");
             }
             case LAST_INDEX_OF: {
                 verifyArgCount(argEvaluators, 1, "lastIndexOf");
-                return new 
LastIndexOfEvaluator(toStringEvaluator(subjectEvaluator),
-                    toStringEvaluator(argEvaluators.get(0), "first argument to 
lastIndexOf"));
+                return addToken(new 
LastIndexOfEvaluator(toStringEvaluator(subjectEvaluator),
+                    toStringEvaluator(argEvaluators.get(0), "first argument to 
lastIndexOf")), "lastIndexOf");
             }
             case FORMAT: {
-                return new FormatEvaluator(toDateEvaluator(subjectEvaluator), 
toStringEvaluator(argEvaluators.get(0), "first argument of format"));
+                return addToken(new 
FormatEvaluator(toDateEvaluator(subjectEvaluator), 
toStringEvaluator(argEvaluators.get(0), "first argument of format")), "format");
             }
             case OR: {
-                return new OrEvaluator(toBooleanEvaluator(subjectEvaluator), 
toBooleanEvaluator(argEvaluators.get(0)));
+                return addToken(new 
OrEvaluator(toBooleanEvaluator(subjectEvaluator), 
toBooleanEvaluator(argEvaluators.get(0))), "or");
             }
             case AND: {
-                return new AndEvaluator(toBooleanEvaluator(subjectEvaluator), 
toBooleanEvaluator(argEvaluators.get(0)));
+                return addToken(new 
AndEvaluator(toBooleanEvaluator(subjectEvaluator), 
toBooleanEvaluator(argEvaluators.get(0))), "and");
             }
             case NOT: {
-                return new NotEvaluator(toBooleanEvaluator(subjectEvaluator));
+                return addToken(new 
NotEvaluator(toBooleanEvaluator(subjectEvaluator)), "not");
             }
             default:
                 throw new 
AttributeExpressionLanguageParsingException("Expected a Function-type 
expression but got " + tree.toString());

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c4c98fc4/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/BooleanEvaluator.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/BooleanEvaluator.java
 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/BooleanEvaluator.java
index 376ddfe..907ee95 100644
--- 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/BooleanEvaluator.java
+++ 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/BooleanEvaluator.java
@@ -19,6 +19,7 @@ package 
org.apache.nifi.attribute.expression.language.evaluation;
 import org.apache.nifi.expression.AttributeExpression.ResultType;
 
 public abstract class BooleanEvaluator implements Evaluator<Boolean> {
+    private String token;
 
     @Override
     public ResultType getResultType() {
@@ -29,4 +30,14 @@ public abstract class BooleanEvaluator implements 
Evaluator<Boolean> {
     public int getEvaluationsRemaining() {
         return 0;
     }
+
+    @Override
+    public String getToken() {
+        return token;
+    }
+
+    @Override
+    public void setToken(final String token) {
+        this.token = token;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c4c98fc4/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/DateEvaluator.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/DateEvaluator.java
 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/DateEvaluator.java
index 7474b60..caf3117 100644
--- 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/DateEvaluator.java
+++ 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/DateEvaluator.java
@@ -21,6 +21,7 @@ import java.util.Date;
 import org.apache.nifi.expression.AttributeExpression.ResultType;
 
 public abstract class DateEvaluator implements Evaluator<Date> {
+    private String token;
 
     @Override
     public ResultType getResultType() {
@@ -31,4 +32,14 @@ public abstract class DateEvaluator implements 
Evaluator<Date> {
     public int getEvaluationsRemaining() {
         return 0;
     }
+
+    @Override
+    public String getToken() {
+        return token;
+    }
+
+    @Override
+    public void setToken(final String token) {
+        this.token = token;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c4c98fc4/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/Evaluator.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/Evaluator.java
 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/Evaluator.java
index 6d164df..86f95a8 100644
--- 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/Evaluator.java
+++ 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/Evaluator.java
@@ -29,4 +29,16 @@ public interface Evaluator<T> {
     int getEvaluationsRemaining();
 
     Evaluator<?> getSubjectEvaluator();
+
+    /**
+     * Sets the token that was used in the query to cause this Evaluator to be 
created
+     *
+     * @param token the token that caused this Evaluator to be created
+     */
+    void setToken(String token);
+
+    /**
+     * @return the token that caused this Evaluator to be created
+     */
+    String getToken();
 }

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c4c98fc4/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/NumberEvaluator.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/NumberEvaluator.java
 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/NumberEvaluator.java
index 403bae3..ec3adac 100644
--- 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/NumberEvaluator.java
+++ 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/NumberEvaluator.java
@@ -19,6 +19,7 @@ package 
org.apache.nifi.attribute.expression.language.evaluation;
 import org.apache.nifi.expression.AttributeExpression.ResultType;
 
 public abstract class NumberEvaluator implements Evaluator<Long> {
+    private String token;
 
     @Override
     public ResultType getResultType() {
@@ -30,4 +31,13 @@ public abstract class NumberEvaluator implements 
Evaluator<Long> {
         return 0;
     }
 
+    @Override
+    public String getToken() {
+        return token;
+    }
+
+    @Override
+    public void setToken(final String token) {
+        this.token = token;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c4c98fc4/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/StringEvaluator.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/StringEvaluator.java
 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/StringEvaluator.java
index 1f4ff21..c6f2b79 100644
--- 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/StringEvaluator.java
+++ 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/StringEvaluator.java
@@ -19,6 +19,7 @@ package 
org.apache.nifi.attribute.expression.language.evaluation;
 import org.apache.nifi.expression.AttributeExpression.ResultType;
 
 public abstract class StringEvaluator implements Evaluator<String> {
+    private String token;
 
     @Override
     public ResultType getResultType() {
@@ -29,4 +30,14 @@ public abstract class StringEvaluator implements 
Evaluator<String> {
     public int getEvaluationsRemaining() {
         return 0;
     }
+
+    @Override
+    public String getToken() {
+        return token;
+    }
+
+    @Override
+    public void setToken(final String token) {
+        this.token = token;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c4c98fc4/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/AndEvaluator.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/AndEvaluator.java
 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/AndEvaluator.java
index 9ed8f06..232fc26 100644
--- 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/AndEvaluator.java
+++ 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/AndEvaluator.java
@@ -25,10 +25,10 @@ import 
org.apache.nifi.attribute.expression.language.evaluation.QueryResult;
 
 public class AndEvaluator extends BooleanEvaluator {
 
-    private final BooleanEvaluator subjectEvaluator;
-    private final BooleanEvaluator rhsEvaluator;
+    private final Evaluator<Boolean> subjectEvaluator;
+    private final Evaluator<Boolean> rhsEvaluator;
 
-    public AndEvaluator(final BooleanEvaluator subjectEvaluator, final 
BooleanEvaluator rhsEvaluator) {
+    public AndEvaluator(final Evaluator<Boolean> subjectEvaluator, final 
Evaluator<Boolean> rhsEvaluator) {
         this.subjectEvaluator = subjectEvaluator;
         this.rhsEvaluator = rhsEvaluator;
     }

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c4c98fc4/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/AppendEvaluator.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/AppendEvaluator.java
 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/AppendEvaluator.java
index bd5e81a..80f1974 100644
--- 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/AppendEvaluator.java
+++ 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/AppendEvaluator.java
@@ -25,10 +25,10 @@ import 
org.apache.nifi.attribute.expression.language.evaluation.StringQueryResul
 
 public class AppendEvaluator extends StringEvaluator {
 
-    private final StringEvaluator subject;
-    private final StringEvaluator appendEvaluator;
+    private final Evaluator<String> subject;
+    private final Evaluator<String> appendEvaluator;
 
-    public AppendEvaluator(final StringEvaluator subject, final 
StringEvaluator append) {
+    public AppendEvaluator(final Evaluator<String> subject, final 
Evaluator<String> append) {
         this.subject = subject;
         this.appendEvaluator = append;
     }

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c4c98fc4/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/AttributeEvaluator.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/AttributeEvaluator.java
 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/AttributeEvaluator.java
index 1b4b74e..a0695a9 100644
--- 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/AttributeEvaluator.java
+++ 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/AttributeEvaluator.java
@@ -25,9 +25,9 @@ import 
org.apache.nifi.attribute.expression.language.evaluation.StringQueryResul
 
 public class AttributeEvaluator extends StringEvaluator {
 
-    private final StringEvaluator nameEvaluator;
+    private final Evaluator<String> nameEvaluator;
 
-    public AttributeEvaluator(final StringEvaluator nameEvaluator) {
+    public AttributeEvaluator(final Evaluator<String> nameEvaluator) {
         this.nameEvaluator = nameEvaluator;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c4c98fc4/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/ContainsEvaluator.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/ContainsEvaluator.java
 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/ContainsEvaluator.java
index 99802f6..54170ba 100644
--- 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/ContainsEvaluator.java
+++ 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/ContainsEvaluator.java
@@ -22,14 +22,13 @@ import 
org.apache.nifi.attribute.expression.language.evaluation.BooleanEvaluator
 import 
org.apache.nifi.attribute.expression.language.evaluation.BooleanQueryResult;
 import org.apache.nifi.attribute.expression.language.evaluation.Evaluator;
 import org.apache.nifi.attribute.expression.language.evaluation.QueryResult;
-import 
org.apache.nifi.attribute.expression.language.evaluation.StringEvaluator;
 
 public class ContainsEvaluator extends BooleanEvaluator {
 
-    private final StringEvaluator subject;
-    private final StringEvaluator search;
+    private final Evaluator<String> subject;
+    private final Evaluator<String> search;
 
-    public ContainsEvaluator(final StringEvaluator subject, final 
StringEvaluator search) {
+    public ContainsEvaluator(final Evaluator<String> subject, final 
Evaluator<String> search) {
         this.subject = subject;
         this.search = search;
     }

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c4c98fc4/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/DivideEvaluator.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/DivideEvaluator.java
 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/DivideEvaluator.java
index c7583cb..12ab37f 100644
--- 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/DivideEvaluator.java
+++ 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/DivideEvaluator.java
@@ -25,10 +25,10 @@ import 
org.apache.nifi.attribute.expression.language.evaluation.QueryResult;
 
 public class DivideEvaluator extends NumberEvaluator {
 
-    private final NumberEvaluator subject;
-    private final NumberEvaluator divideValue;
+    private final Evaluator<Long> subject;
+    private final Evaluator<Long> divideValue;
 
-    public DivideEvaluator(final NumberEvaluator subject, final 
NumberEvaluator divideValue) {
+    public DivideEvaluator(final Evaluator<Long> subject, final 
Evaluator<Long> divideValue) {
         this.subject = subject;
         this.divideValue = divideValue;
     }

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c4c98fc4/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/EndsWithEvaluator.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/EndsWithEvaluator.java
 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/EndsWithEvaluator.java
index c31c2b1..13bc396 100644
--- 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/EndsWithEvaluator.java
+++ 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/EndsWithEvaluator.java
@@ -22,14 +22,13 @@ import 
org.apache.nifi.attribute.expression.language.evaluation.BooleanEvaluator
 import 
org.apache.nifi.attribute.expression.language.evaluation.BooleanQueryResult;
 import org.apache.nifi.attribute.expression.language.evaluation.Evaluator;
 import org.apache.nifi.attribute.expression.language.evaluation.QueryResult;
-import 
org.apache.nifi.attribute.expression.language.evaluation.StringEvaluator;
 
 public class EndsWithEvaluator extends BooleanEvaluator {
 
-    private final StringEvaluator subject;
-    private final StringEvaluator search;
+    private final Evaluator<String> subject;
+    private final Evaluator<String> search;
 
-    public EndsWithEvaluator(final StringEvaluator subject, final 
StringEvaluator search) {
+    public EndsWithEvaluator(final Evaluator<String> subject, final 
Evaluator<String> search) {
         this.subject = subject;
         this.search = search;
     }

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c4c98fc4/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/FindEvaluator.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/FindEvaluator.java
 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/FindEvaluator.java
index b377c4a..2a3f1ae 100644
--- 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/FindEvaluator.java
+++ 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/FindEvaluator.java
@@ -23,17 +23,16 @@ import 
org.apache.nifi.attribute.expression.language.evaluation.BooleanEvaluator
 import 
org.apache.nifi.attribute.expression.language.evaluation.BooleanQueryResult;
 import org.apache.nifi.attribute.expression.language.evaluation.Evaluator;
 import org.apache.nifi.attribute.expression.language.evaluation.QueryResult;
-import 
org.apache.nifi.attribute.expression.language.evaluation.StringEvaluator;
 import 
org.apache.nifi.attribute.expression.language.evaluation.literals.StringLiteralEvaluator;
 
 public class FindEvaluator extends BooleanEvaluator {
 
-    private final StringEvaluator subject;
-    private final StringEvaluator search;
+    private final Evaluator<String> subject;
+    private final Evaluator<String> search;
 
     private final Pattern compiledPattern;
 
-    public FindEvaluator(final StringEvaluator subject, final StringEvaluator 
search) {
+    public FindEvaluator(final Evaluator<String> subject, final 
Evaluator<String> search) {
         this.subject = subject;
         this.search = search;
 

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c4c98fc4/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/FormatEvaluator.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/FormatEvaluator.java
 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/FormatEvaluator.java
index 132b9e7..717cbd5 100644
--- 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/FormatEvaluator.java
+++ 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/FormatEvaluator.java
@@ -30,9 +30,9 @@ import 
org.apache.nifi.attribute.expression.language.evaluation.StringQueryResul
 public class FormatEvaluator extends StringEvaluator {
 
     private final DateEvaluator subject;
-    private final StringEvaluator format;
+    private final Evaluator<String> format;
 
-    public FormatEvaluator(final DateEvaluator subject, final StringEvaluator 
format) {
+    public FormatEvaluator(final DateEvaluator subject, final 
Evaluator<String> format) {
         this.subject = subject;
         this.format = format;
     }

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c4c98fc4/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/GreaterThanEvaluator.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/GreaterThanEvaluator.java
 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/GreaterThanEvaluator.java
index af1ee1d..8850225 100644
--- 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/GreaterThanEvaluator.java
+++ 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/GreaterThanEvaluator.java
@@ -21,15 +21,14 @@ import java.util.Map;
 import 
org.apache.nifi.attribute.expression.language.evaluation.BooleanEvaluator;
 import 
org.apache.nifi.attribute.expression.language.evaluation.BooleanQueryResult;
 import org.apache.nifi.attribute.expression.language.evaluation.Evaluator;
-import 
org.apache.nifi.attribute.expression.language.evaluation.NumberEvaluator;
 import org.apache.nifi.attribute.expression.language.evaluation.QueryResult;
 
 public class GreaterThanEvaluator extends BooleanEvaluator {
 
-    private final NumberEvaluator subject;
-    private final NumberEvaluator comparison;
+    private final Evaluator<Long> subject;
+    private final Evaluator<Long> comparison;
 
-    public GreaterThanEvaluator(final NumberEvaluator subject, final 
NumberEvaluator comparison) {
+    public GreaterThanEvaluator(final Evaluator<Long> subject, final 
Evaluator<Long> comparison) {
         this.subject = subject;
         this.comparison = comparison;
     }

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c4c98fc4/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/GreaterThanOrEqualEvaluator.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/GreaterThanOrEqualEvaluator.java
 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/GreaterThanOrEqualEvaluator.java
index 1269fc0..ff71335 100644
--- 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/GreaterThanOrEqualEvaluator.java
+++ 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/GreaterThanOrEqualEvaluator.java
@@ -21,15 +21,14 @@ import java.util.Map;
 import 
org.apache.nifi.attribute.expression.language.evaluation.BooleanEvaluator;
 import 
org.apache.nifi.attribute.expression.language.evaluation.BooleanQueryResult;
 import org.apache.nifi.attribute.expression.language.evaluation.Evaluator;
-import 
org.apache.nifi.attribute.expression.language.evaluation.NumberEvaluator;
 import org.apache.nifi.attribute.expression.language.evaluation.QueryResult;
 
 public class GreaterThanOrEqualEvaluator extends BooleanEvaluator {
 
-    private final NumberEvaluator subject;
-    private final NumberEvaluator comparison;
+    private final Evaluator<Long> subject;
+    private final Evaluator<Long> comparison;
 
-    public GreaterThanOrEqualEvaluator(final NumberEvaluator subject, final 
NumberEvaluator comparison) {
+    public GreaterThanOrEqualEvaluator(final Evaluator<Long> subject, final 
Evaluator<Long> comparison) {
         this.subject = subject;
         this.comparison = comparison;
     }

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c4c98fc4/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/IndexOfEvaluator.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/IndexOfEvaluator.java
 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/IndexOfEvaluator.java
index 80422cb..c4bc03e 100644
--- 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/IndexOfEvaluator.java
+++ 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/IndexOfEvaluator.java
@@ -22,14 +22,13 @@ import 
org.apache.nifi.attribute.expression.language.evaluation.Evaluator;
 import 
org.apache.nifi.attribute.expression.language.evaluation.NumberEvaluator;
 import 
org.apache.nifi.attribute.expression.language.evaluation.NumberQueryResult;
 import org.apache.nifi.attribute.expression.language.evaluation.QueryResult;
-import 
org.apache.nifi.attribute.expression.language.evaluation.StringEvaluator;
 
 public class IndexOfEvaluator extends NumberEvaluator {
 
-    private final StringEvaluator subject;
-    private final StringEvaluator indexEvaluator;
+    private final Evaluator<String> subject;
+    private final Evaluator<String> indexEvaluator;
 
-    public IndexOfEvaluator(final StringEvaluator subject, final 
StringEvaluator indexEvaluator) {
+    public IndexOfEvaluator(final Evaluator<String> subject, final 
Evaluator<String> indexEvaluator) {
         this.subject = subject;
         this.indexEvaluator = indexEvaluator;
     }

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c4c98fc4/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LastIndexOfEvaluator.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LastIndexOfEvaluator.java
 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LastIndexOfEvaluator.java
index 2b67093..3ebbee7 100644
--- 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LastIndexOfEvaluator.java
+++ 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LastIndexOfEvaluator.java
@@ -22,14 +22,13 @@ import 
org.apache.nifi.attribute.expression.language.evaluation.Evaluator;
 import 
org.apache.nifi.attribute.expression.language.evaluation.NumberEvaluator;
 import 
org.apache.nifi.attribute.expression.language.evaluation.NumberQueryResult;
 import org.apache.nifi.attribute.expression.language.evaluation.QueryResult;
-import 
org.apache.nifi.attribute.expression.language.evaluation.StringEvaluator;
 
 public class LastIndexOfEvaluator extends NumberEvaluator {
 
-    private final StringEvaluator subject;
-    private final StringEvaluator indexEvaluator;
+    private final Evaluator<String> subject;
+    private final Evaluator<String> indexEvaluator;
 
-    public LastIndexOfEvaluator(final StringEvaluator subject, final 
StringEvaluator indexEvaluator) {
+    public LastIndexOfEvaluator(final Evaluator<String> subject, final 
Evaluator<String> indexEvaluator) {
         this.subject = subject;
         this.indexEvaluator = indexEvaluator;
     }

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c4c98fc4/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LengthEvaluator.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LengthEvaluator.java
 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LengthEvaluator.java
index dec1f8f..46bc24c 100644
--- 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LengthEvaluator.java
+++ 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LengthEvaluator.java
@@ -22,20 +22,19 @@ import 
org.apache.nifi.attribute.expression.language.evaluation.Evaluator;
 import 
org.apache.nifi.attribute.expression.language.evaluation.NumberEvaluator;
 import 
org.apache.nifi.attribute.expression.language.evaluation.NumberQueryResult;
 import org.apache.nifi.attribute.expression.language.evaluation.QueryResult;
-import 
org.apache.nifi.attribute.expression.language.evaluation.StringEvaluator;
 
 public class LengthEvaluator extends NumberEvaluator {
 
-    private final StringEvaluator subject;
+    private final Evaluator<String> subject;
 
-    public LengthEvaluator(final StringEvaluator subject) {
+    public LengthEvaluator(final Evaluator<String> subject) {
         this.subject = subject;
     }
 
     @Override
     public QueryResult<Long> evaluate(final Map<String, String> attributes) {
         final String subjectValue = subject.evaluate(attributes).getValue();
-        return new NumberQueryResult((long) ((subjectValue == null) ? 0 : 
subjectValue.length()));
+        return new NumberQueryResult((long) (subjectValue == null ? 0 : 
subjectValue.length()));
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c4c98fc4/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LessThanEvaluator.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LessThanEvaluator.java
 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LessThanEvaluator.java
index 4b1beac..e9bf231 100644
--- 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LessThanEvaluator.java
+++ 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LessThanEvaluator.java
@@ -21,15 +21,14 @@ import java.util.Map;
 import 
org.apache.nifi.attribute.expression.language.evaluation.BooleanEvaluator;
 import 
org.apache.nifi.attribute.expression.language.evaluation.BooleanQueryResult;
 import org.apache.nifi.attribute.expression.language.evaluation.Evaluator;
-import 
org.apache.nifi.attribute.expression.language.evaluation.NumberEvaluator;
 import org.apache.nifi.attribute.expression.language.evaluation.QueryResult;
 
 public class LessThanEvaluator extends BooleanEvaluator {
 
-    private final NumberEvaluator subject;
-    private final NumberEvaluator comparison;
+    private final Evaluator<Long> subject;
+    private final Evaluator<Long> comparison;
 
-    public LessThanEvaluator(final NumberEvaluator subject, final 
NumberEvaluator comparison) {
+    public LessThanEvaluator(final Evaluator<Long> subject, final 
Evaluator<Long> comparison) {
         this.subject = subject;
         this.comparison = comparison;
     }

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c4c98fc4/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LessThanOrEqualEvaluator.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LessThanOrEqualEvaluator.java
 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LessThanOrEqualEvaluator.java
index a07e8be..5bf5ee5 100644
--- 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LessThanOrEqualEvaluator.java
+++ 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LessThanOrEqualEvaluator.java
@@ -21,15 +21,14 @@ import java.util.Map;
 import 
org.apache.nifi.attribute.expression.language.evaluation.BooleanEvaluator;
 import 
org.apache.nifi.attribute.expression.language.evaluation.BooleanQueryResult;
 import org.apache.nifi.attribute.expression.language.evaluation.Evaluator;
-import 
org.apache.nifi.attribute.expression.language.evaluation.NumberEvaluator;
 import org.apache.nifi.attribute.expression.language.evaluation.QueryResult;
 
 public class LessThanOrEqualEvaluator extends BooleanEvaluator {
 
-    private final NumberEvaluator subject;
-    private final NumberEvaluator comparison;
+    private final Evaluator<Long> subject;
+    private final Evaluator<Long> comparison;
 
-    public LessThanOrEqualEvaluator(final NumberEvaluator subject, final 
NumberEvaluator comparison) {
+    public LessThanOrEqualEvaluator(final Evaluator<Long> subject, final 
Evaluator<Long> comparison) {
         this.subject = subject;
         this.comparison = comparison;
     }

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c4c98fc4/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/MatchesEvaluator.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/MatchesEvaluator.java
 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/MatchesEvaluator.java
index 1bb86a5..6f017ea 100644
--- 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/MatchesEvaluator.java
+++ 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/MatchesEvaluator.java
@@ -23,17 +23,16 @@ import 
org.apache.nifi.attribute.expression.language.evaluation.BooleanEvaluator
 import 
org.apache.nifi.attribute.expression.language.evaluation.BooleanQueryResult;
 import org.apache.nifi.attribute.expression.language.evaluation.Evaluator;
 import org.apache.nifi.attribute.expression.language.evaluation.QueryResult;
-import 
org.apache.nifi.attribute.expression.language.evaluation.StringEvaluator;
 import 
org.apache.nifi.attribute.expression.language.evaluation.literals.StringLiteralEvaluator;
 
 public class MatchesEvaluator extends BooleanEvaluator {
 
-    private final StringEvaluator subject;
-    private final StringEvaluator search;
+    private final Evaluator<String> subject;
+    private final Evaluator<String> search;
 
     private final Pattern compiledPattern;
 
-    public MatchesEvaluator(final StringEvaluator subject, final 
StringEvaluator search) {
+    public MatchesEvaluator(final Evaluator<String> subject, final 
Evaluator<String> search) {
         this.subject = subject;
         this.search = search;
 

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c4c98fc4/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/MinusEvaluator.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/MinusEvaluator.java
 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/MinusEvaluator.java
index 0665979..0555187 100644
--- 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/MinusEvaluator.java
+++ 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/MinusEvaluator.java
@@ -25,10 +25,10 @@ import 
org.apache.nifi.attribute.expression.language.evaluation.QueryResult;
 
 public class MinusEvaluator extends NumberEvaluator {
 
-    private final NumberEvaluator subject;
-    private final NumberEvaluator minusValue;
+    private final Evaluator<Long> subject;
+    private final Evaluator<Long> minusValue;
 
-    public MinusEvaluator(final NumberEvaluator subject, final NumberEvaluator 
minusValue) {
+    public MinusEvaluator(final Evaluator<Long> subject, final Evaluator<Long> 
minusValue) {
         this.subject = subject;
         this.minusValue = minusValue;
     }

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c4c98fc4/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/ModEvaluator.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/ModEvaluator.java
 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/ModEvaluator.java
index 6b7b838..cf2121c 100644
--- 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/ModEvaluator.java
+++ 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/ModEvaluator.java
@@ -25,10 +25,10 @@ import 
org.apache.nifi.attribute.expression.language.evaluation.QueryResult;
 
 public class ModEvaluator extends NumberEvaluator {
 
-    private final NumberEvaluator subject;
-    private final NumberEvaluator modValue;
+    private final Evaluator<Long> subject;
+    private final Evaluator<Long> modValue;
 
-    public ModEvaluator(final NumberEvaluator subject, final NumberEvaluator 
modValue) {
+    public ModEvaluator(final Evaluator<Long> subject, final Evaluator<Long> 
modValue) {
         this.subject = subject;
         this.modValue = modValue;
     }

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c4c98fc4/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/MultiplyEvaluator.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/MultiplyEvaluator.java
 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/MultiplyEvaluator.java
index a3b03ed..4480c98 100644
--- 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/MultiplyEvaluator.java
+++ 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/MultiplyEvaluator.java
@@ -25,10 +25,10 @@ import 
org.apache.nifi.attribute.expression.language.evaluation.QueryResult;
 
 public class MultiplyEvaluator extends NumberEvaluator {
 
-    private final NumberEvaluator subject;
-    private final NumberEvaluator multiplyValue;
+    private final Evaluator<Long> subject;
+    private final Evaluator<Long> multiplyValue;
 
-    public MultiplyEvaluator(final NumberEvaluator subject, final 
NumberEvaluator multiplyValue) {
+    public MultiplyEvaluator(final Evaluator<Long> subject, final 
Evaluator<Long> multiplyValue) {
         this.subject = subject;
         this.multiplyValue = multiplyValue;
     }

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c4c98fc4/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/NotEvaluator.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/NotEvaluator.java
 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/NotEvaluator.java
index 327e620..2a09e33 100644
--- 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/NotEvaluator.java
+++ 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/NotEvaluator.java
@@ -25,9 +25,9 @@ import 
org.apache.nifi.attribute.expression.language.evaluation.QueryResult;
 
 public class NotEvaluator extends BooleanEvaluator {
 
-    private final BooleanEvaluator subjectEvaluator;
+    private final Evaluator<Boolean> subjectEvaluator;
 
-    public NotEvaluator(final BooleanEvaluator subjectEvaluator) {
+    public NotEvaluator(final Evaluator<Boolean> subjectEvaluator) {
         this.subjectEvaluator = subjectEvaluator;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c4c98fc4/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/NumberToDateEvaluator.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/NumberToDateEvaluator.java
 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/NumberToDateEvaluator.java
index 672d855..6867202 100644
--- 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/NumberToDateEvaluator.java
+++ 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/NumberToDateEvaluator.java
@@ -22,14 +22,13 @@ import java.util.Map;
 import org.apache.nifi.attribute.expression.language.evaluation.DateEvaluator;
 import 
org.apache.nifi.attribute.expression.language.evaluation.DateQueryResult;
 import org.apache.nifi.attribute.expression.language.evaluation.Evaluator;
-import 
org.apache.nifi.attribute.expression.language.evaluation.NumberEvaluator;
 import org.apache.nifi.attribute.expression.language.evaluation.QueryResult;
 
 public class NumberToDateEvaluator extends DateEvaluator {
 
-    private final NumberEvaluator subject;
+    private final Evaluator<Long> subject;
 
-    public NumberToDateEvaluator(final NumberEvaluator subject) {
+    public NumberToDateEvaluator(final Evaluator<Long> subject) {
         this.subject = subject;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c4c98fc4/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/OrEvaluator.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/OrEvaluator.java
 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/OrEvaluator.java
index ab3a16c..719fa11 100644
--- 
a/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/OrEvaluator.java
+++ 
b/nifi/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/OrEvaluator.java
@@ -25,10 +25,10 @@ import 
org.apache.nifi.attribute.expression.language.evaluation.QueryResult;
 
 public class OrEvaluator extends BooleanEvaluator {
 
-    private final BooleanEvaluator subjectEvaluator;
-    private final BooleanEvaluator rhsEvaluator;
+    private final Evaluator<Boolean> subjectEvaluator;
+    private final Evaluator<Boolean> rhsEvaluator;
 
-    public OrEvaluator(final BooleanEvaluator subjectEvaluator, final 
BooleanEvaluator rhsEvaluator) {
+    public OrEvaluator(final Evaluator<Boolean> subjectEvaluator, final 
Evaluator<Boolean> rhsEvaluator) {
         this.subjectEvaluator = subjectEvaluator;
         this.rhsEvaluator = rhsEvaluator;
     }

Reply via email to