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 2016/10/24 14:34:09 UTC

[3/4] nifi git commit: NIFI-1662 adding Expression Language decimal support

NIFI-1662 adding Expression Language decimal support


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

Branch: refs/heads/master
Commit: 94ab99902602d20d53a63ac86bed7c99cf06c9c9
Parents: 9b08f23
Author: jpercivall <jo...@yahoo.com>
Authored: Tue Sep 13 17:40:58 2016 -0400
Committer: Matt Burgess <ma...@apache.org>
Committed: Mon Oct 24 10:20:21 2016 -0400

----------------------------------------------------------------------
 .../nifi/expression/AttributeExpression.java    |   2 +-
 .../language/antlr/AttributeExpressionLexer.g   |   3 +-
 .../language/antlr/AttributeExpressionParser.g  |   6 +-
 .../output/AttributeExpressionLexer.tokens      |  90 -------------
 .../attribute/expression/language/Query.java    | 118 ++++++++++++-----
 .../language/evaluation/DecimalEvaluator.java   |  43 +++++++
 .../language/evaluation/DecimalQueryResult.java |  43 +++++++
 .../language/evaluation/NumberEvaluator.java    |   2 +-
 .../language/evaluation/NumberQueryResult.java  |   8 +-
 .../evaluation/WholeNumberEvaluator.java        |  43 +++++++
 .../evaluation/WholeNumberQueryResult.java      |  43 +++++++
 .../evaluation/cast/DateCastEvaluator.java      |   9 +-
 .../evaluation/cast/DecimalCastEvaluator.java   |  86 +++++++++++++
 .../evaluation/cast/NumberCastEvaluator.java    |  33 +++--
 .../cast/WholeNumberCastEvaluator.java          |  85 +++++++++++++
 .../functions/DateToNumberEvaluator.java        |  50 --------
 .../evaluation/functions/DivideEvaluator.java   |  19 +--
 .../functions/GreaterThanEvaluator.java         |  16 ++-
 .../functions/GreaterThanOrEqualEvaluator.java  |  16 ++-
 .../evaluation/functions/IndexOfEvaluator.java  |  10 +-
 .../functions/LastIndexOfEvaluator.java         |  10 +-
 .../evaluation/functions/LengthEvaluator.java   |   8 +-
 .../evaluation/functions/LessThanEvaluator.java |  16 ++-
 .../functions/LessThanOrEqualEvaluator.java     |  16 ++-
 .../evaluation/functions/MinusEvaluator.java    |  19 +--
 .../evaluation/functions/ModEvaluator.java      |  19 +--
 .../evaluation/functions/MultiplyEvaluator.java |  19 +--
 .../functions/OneUpSequenceEvaluator.java       |   8 +-
 .../evaluation/functions/PlusEvaluator.java     |  19 +--
 .../RandomNumberGeneratorEvaluator.java         |   8 +-
 .../evaluation/functions/ToNumberEvaluator.java |  45 -------
 .../literals/NumberLiteralEvaluator.java        |  44 -------
 .../literals/WholeNumberLiteralEvaluator.java   |  44 +++++++
 .../evaluation/reduce/CountEvaluator.java       |  12 +-
 .../language/evaluation/util/NumberParsing.java |  84 +++++++++++++
 .../expression/language/TestQuery.java          | 126 +++++++++++++++++--
 .../asciidoc/expression-language-guide.adoc     |  62 +++++----
 37 files changed, 888 insertions(+), 396 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/nifi/blob/94ab9990/nifi-api/src/main/java/org/apache/nifi/expression/AttributeExpression.java
----------------------------------------------------------------------
diff --git a/nifi-api/src/main/java/org/apache/nifi/expression/AttributeExpression.java b/nifi-api/src/main/java/org/apache/nifi/expression/AttributeExpression.java
index 2c77aaa..d0568ff 100644
--- a/nifi-api/src/main/java/org/apache/nifi/expression/AttributeExpression.java
+++ b/nifi-api/src/main/java/org/apache/nifi/expression/AttributeExpression.java
@@ -77,6 +77,6 @@ public interface AttributeExpression {
 
     public static enum ResultType {
 
-        STRING, BOOLEAN, NUMBER, DATE;
+        STRING, BOOLEAN, WHOLE_NUMBER, DATE, DECIMAL, NUMBER;
     }
 }

http://git-wip-us.apache.org/repos/asf/nifi/blob/94ab9990/nifi-commons/nifi-expression-language/src/main/antlr3/org/apache/nifi/attribute/expression/language/antlr/AttributeExpressionLexer.g
----------------------------------------------------------------------
diff --git a/nifi-commons/nifi-expression-language/src/main/antlr3/org/apache/nifi/attribute/expression/language/antlr/AttributeExpressionLexer.g b/nifi-commons/nifi-expression-language/src/main/antlr3/org/apache/nifi/attribute/expression/language/antlr/AttributeExpressionLexer.g
index 8841375..31dfe90 100644
--- a/nifi-commons/nifi-expression-language/src/main/antlr3/org/apache/nifi/attribute/expression/language/antlr/AttributeExpressionLexer.g
+++ b/nifi-commons/nifi-expression-language/src/main/antlr3/org/apache/nifi/attribute/expression/language/antlr/AttributeExpressionLexer.g
@@ -77,7 +77,7 @@ COLON	: ':';
 COMMA	: ',';
 DOT		: '.';
 SEMICOLON : ';';
-NUMBER	: ('0'..'9')+;
+WHOLE_NUMBER	: ('0'..'9')+;
 
 TRUE	: 'true';
 FALSE	: 'false';
@@ -112,6 +112,7 @@ IS_NULL	: 'isNull';
 IS_EMPTY : 'isEmpty';
 NOT_NULL : 'notNull';
 TO_NUMBER : 'toNumber';
+TO_DECIMAL : 'toDecimal';
 URL_ENCODE : 'urlEncode';
 URL_DECODE : 'urlDecode';
 NOT : 'not';

http://git-wip-us.apache.org/repos/asf/nifi/blob/94ab9990/nifi-commons/nifi-expression-language/src/main/antlr3/org/apache/nifi/attribute/expression/language/antlr/AttributeExpressionParser.g
----------------------------------------------------------------------
diff --git a/nifi-commons/nifi-expression-language/src/main/antlr3/org/apache/nifi/attribute/expression/language/antlr/AttributeExpressionParser.g b/nifi-commons/nifi-expression-language/src/main/antlr3/org/apache/nifi/attribute/expression/language/antlr/AttributeExpressionParser.g
index 01a0495..2eb8e7b 100644
--- a/nifi-commons/nifi-expression-language/src/main/antlr3/org/apache/nifi/attribute/expression/language/antlr/AttributeExpressionParser.g
+++ b/nifi-commons/nifi-expression-language/src/main/antlr3/org/apache/nifi/attribute/expression/language/antlr/AttributeExpressionParser.g
@@ -90,8 +90,8 @@ oneArgBool	: ((FIND | MATCHES | EQUALS_IGNORE_CASE) LPAREN! anyArg RPAREN!) |
 multiArgBool : (IN) LPAREN! anyArg (COMMA! anyArg)* RPAREN!;
 
 
-// functions that return Numbers
-zeroArgNum	: (LENGTH | TO_NUMBER | COUNT) LPAREN! RPAREN!;
+// functions that return Numbers (whole or decimal)
+zeroArgNum	: (LENGTH | TO_NUMBER | TO_DECIMAL | COUNT) LPAREN! RPAREN!;
 oneArgNum	: ((INDEX_OF | LAST_INDEX_OF) LPAREN! anyArg RPAREN!) |
 			  (TO_DATE LPAREN! anyArg? RPAREN!) |
 			  ((MOD | PLUS | MINUS | MULTIPLY | DIVIDE) LPAREN! anyArg RPAREN!);
@@ -100,7 +100,7 @@ stringFunctionRef : zeroArgString | oneArgString | twoArgString | fiveArgString;
 booleanFunctionRef : zeroArgBool | oneArgBool | multiArgBool;
 numberFunctionRef : zeroArgNum | oneArgNum;
 
-anyArg : NUMBER | numberFunctionRef | STRING_LITERAL | zeroArgString | oneArgString | twoArgString | fiveArgString | booleanLiteral | zeroArgBool | oneArgBool | multiArgBool | expression;
+anyArg : WHOLE_NUMBER | numberFunctionRef | STRING_LITERAL | zeroArgString | oneArgString | twoArgString | fiveArgString | booleanLiteral | zeroArgBool | oneArgBool | multiArgBool | expression;
 stringArg : STRING_LITERAL | zeroArgString | oneArgString | twoArgString | expression;
 functionRef : stringFunctionRef | booleanFunctionRef | numberFunctionRef;
 

http://git-wip-us.apache.org/repos/asf/nifi/blob/94ab9990/nifi-commons/nifi-expression-language/src/main/antlr3/org/apache/nifi/attribute/expression/language/antlr/output/AttributeExpressionLexer.tokens
----------------------------------------------------------------------
diff --git a/nifi-commons/nifi-expression-language/src/main/antlr3/org/apache/nifi/attribute/expression/language/antlr/output/AttributeExpressionLexer.tokens b/nifi-commons/nifi-expression-language/src/main/antlr3/org/apache/nifi/attribute/expression/language/antlr/output/AttributeExpressionLexer.tokens
deleted file mode 100755
index e370eb6..0000000
--- a/nifi-commons/nifi-expression-language/src/main/antlr3/org/apache/nifi/attribute/expression/language/antlr/output/AttributeExpressionLexer.tokens
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-ALL_ATTRIBUTES=4
-ALL_DELINEATED_VALUES=5
-ALL_MATCHING_ATTRIBUTES=6
-AND=7
-ANY_ATTRIBUTE=8
-ANY_DELINEATED_VALUE=9
-ANY_MATCHING_ATTRIBUTE=10
-APPEND=11
-ATTRIBUTE_NAME=12
-CEIL=13
-COLON=14
-COMMA=15
-CONTAINS=16
-DIVIDE=17
-DOLLAR=18
-DOT=19
-ENDS_WITH=20
-EQUALS=21
-EQUALS_IGNORE_CASE=22
-FALSE=23
-FIND=24
-FLOOR=25
-FORMAT=26
-GREATER_THAN=27
-GREATER_THAN_OR_EQUAL=28
-HOSTNAME=29
-INDEX_OF=30
-IP=31
-IS_NULL=32
-LAST_INDEX_OF=33
-LBRACE=34
-LENGTH=35
-LESS_THAN=36
-LESS_THAN_OR_EQUAL=37
-LPAREN=38
-MATCHES=39
-MINUS=40
-MOD=41
-MULTIPLY=42
-NEXT_INT=43
-NOT=44
-NOT_NULL=45
-NOW=46
-NUMBER=47
-OR=48
-PLUS=49
-PREPEND=50
-RBRACE=51
-REPLACE=52
-REPLACE_ALL=53
-REPLACE_NULL=54
-RPAREN=55
-SEMICOLON=56
-STARTS_WITH=57
-STRING_LITERAL=58
-SUBSTRING=59
-SUBSTRING_AFTER=60
-SUBSTRING_AFTER_LAST=61
-SUBSTRING_BEFORE=62
-SUBSTRING_BEFORE_LAST=63
-TO_DATE=64
-TO_LOWER=65
-TO_NUMBER=66
-TO_RADIX=67
-TO_STRING=68
-TO_UPPER=69
-TRIM=70
-TRUE=71
-URL_DECODE=72
-URL_ENCODE=73
-UUID=74
-WHITESPACE=75
-BASE64_ENCODE=76
-BASE64_DECODE=77

http://git-wip-us.apache.org/repos/asf/nifi/blob/94ab9990/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/Query.java
----------------------------------------------------------------------
diff --git a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/Query.java b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/Query.java
index 49c2a05..b0c2ab6 100644
--- a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/Query.java
+++ b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/Query.java
@@ -28,18 +28,18 @@ import org.apache.nifi.attribute.expression.language.antlr.AttributeExpressionPa
 import org.apache.nifi.attribute.expression.language.evaluation.BooleanEvaluator;
 import org.apache.nifi.attribute.expression.language.evaluation.DateEvaluator;
 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;
 import org.apache.nifi.attribute.expression.language.evaluation.StringEvaluator;
 import org.apache.nifi.attribute.expression.language.evaluation.cast.BooleanCastEvaluator;
 import org.apache.nifi.attribute.expression.language.evaluation.cast.DateCastEvaluator;
+import org.apache.nifi.attribute.expression.language.evaluation.cast.DecimalCastEvaluator;
 import org.apache.nifi.attribute.expression.language.evaluation.cast.NumberCastEvaluator;
 import org.apache.nifi.attribute.expression.language.evaluation.cast.StringCastEvaluator;
+import org.apache.nifi.attribute.expression.language.evaluation.cast.WholeNumberCastEvaluator;
 import org.apache.nifi.attribute.expression.language.evaluation.functions.AndEvaluator;
 import org.apache.nifi.attribute.expression.language.evaluation.functions.AppendEvaluator;
 import org.apache.nifi.attribute.expression.language.evaluation.functions.AttributeEvaluator;
 import org.apache.nifi.attribute.expression.language.evaluation.functions.ContainsEvaluator;
-import org.apache.nifi.attribute.expression.language.evaluation.functions.DateToNumberEvaluator;
 import org.apache.nifi.attribute.expression.language.evaluation.functions.DivideEvaluator;
 import org.apache.nifi.attribute.expression.language.evaluation.functions.EndsWithEvaluator;
 import org.apache.nifi.attribute.expression.language.evaluation.functions.EqualsEvaluator;
@@ -87,7 +87,6 @@ import org.apache.nifi.attribute.expression.language.evaluation.functions.Substr
 import org.apache.nifi.attribute.expression.language.evaluation.functions.SubstringBeforeLastEvaluator;
 import org.apache.nifi.attribute.expression.language.evaluation.functions.SubstringEvaluator;
 import org.apache.nifi.attribute.expression.language.evaluation.functions.ToLowerEvaluator;
-import org.apache.nifi.attribute.expression.language.evaluation.functions.ToNumberEvaluator;
 import org.apache.nifi.attribute.expression.language.evaluation.functions.ToRadixEvaluator;
 import org.apache.nifi.attribute.expression.language.evaluation.functions.ToStringEvaluator;
 import org.apache.nifi.attribute.expression.language.evaluation.functions.ToUpperEvaluator;
@@ -98,9 +97,9 @@ import org.apache.nifi.attribute.expression.language.evaluation.functions.Base64
 import org.apache.nifi.attribute.expression.language.evaluation.functions.Base64EncodeEvaluator;
 import org.apache.nifi.attribute.expression.language.evaluation.functions.UuidEvaluator;
 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.literals.WholeNumberLiteralEvaluator;
 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;
@@ -166,7 +165,8 @@ import static org.apache.nifi.attribute.expression.language.antlr.AttributeExpre
 import static org.apache.nifi.attribute.expression.language.antlr.AttributeExpressionParser.NOT;
 import static org.apache.nifi.attribute.expression.language.antlr.AttributeExpressionParser.NOT_NULL;
 import static org.apache.nifi.attribute.expression.language.antlr.AttributeExpressionParser.NOW;
-import static org.apache.nifi.attribute.expression.language.antlr.AttributeExpressionParser.NUMBER;
+import static org.apache.nifi.attribute.expression.language.antlr.AttributeExpressionParser.TO_DECIMAL;
+import static org.apache.nifi.attribute.expression.language.antlr.AttributeExpressionParser.WHOLE_NUMBER;
 import static org.apache.nifi.attribute.expression.language.antlr.AttributeExpressionParser.OR;
 import static org.apache.nifi.attribute.expression.language.antlr.AttributeExpressionParser.PLUS;
 import static org.apache.nifi.attribute.expression.language.antlr.AttributeExpressionParser.PREPEND;
@@ -674,8 +674,8 @@ public class Query {
             case ATTR_NAME: {
                 return newStringLiteralEvaluator(tree.getChild(0).getText());
             }
-            case NUMBER: {
-                return new NumberLiteralEvaluator(tree.getText());
+            case WHOLE_NUMBER: {
+                return new WholeNumberLiteralEvaluator(tree.getText());
             }
             case STRING_LITERAL: {
                 return newStringLiteralEvaluator(tree.getText());
@@ -880,25 +880,66 @@ public class Query {
         return toBooleanEvaluator(evaluator, null);
     }
 
-    private static Evaluator<Long> toNumberEvaluator(final Evaluator<?> evaluator) {
-        return toNumberEvaluator(evaluator, null);
+    private static Evaluator<Long> toWholeNumberEvaluator(final Evaluator<?> evaluator) {
+        return toWholeNumberEvaluator(evaluator, null);
     }
 
     @SuppressWarnings("unchecked")
-    private static Evaluator<Long> toNumberEvaluator(final Evaluator<?> evaluator, final String location) {
+    private static Evaluator<Long> toWholeNumberEvaluator(final Evaluator<?> evaluator, final String location) {
         switch (evaluator.getResultType()) {
-            case NUMBER:
+            case WHOLE_NUMBER:
                 return (Evaluator<Long>) evaluator;
             case STRING:
-                return addToken(new NumberCastEvaluator(evaluator), evaluator.getToken());
             case DATE:
-                return addToken(new DateToNumberEvaluator((DateEvaluator) evaluator), evaluator.getToken());
+            case DECIMAL:
+            case NUMBER:
+                return addToken(new WholeNumberCastEvaluator(evaluator), evaluator.getToken());
             default:
-                throw new AttributeExpressionLanguageParsingException("Cannot implicitly convert Data Type " + evaluator.getResultType() + " to " + ResultType.NUMBER
+                throw new AttributeExpressionLanguageParsingException("Cannot implicitly convert Data Type " + evaluator.getResultType() + " to " + ResultType.WHOLE_NUMBER
                     + (location == null ? "" : " at location [" + location + "]"));
         }
     }
 
+    private static Evaluator<Double> toDecimalEvaluator(final Evaluator<?> evaluator) {
+        return toDecimalEvaluator(evaluator, null);
+    }
+
+    @SuppressWarnings("unchecked")
+    private static Evaluator<Double> toDecimalEvaluator(final Evaluator<?> evaluator, final String location) {
+        switch (evaluator.getResultType()) {
+            case DECIMAL:
+                return (Evaluator<Double>) evaluator;
+            case WHOLE_NUMBER:
+            case STRING:
+            case DATE:
+            case NUMBER:
+                return addToken(new DecimalCastEvaluator(evaluator), evaluator.getToken());
+            default:
+                throw new AttributeExpressionLanguageParsingException("Cannot implicitly convert Data Type " + evaluator.getResultType() + " to " + ResultType.DECIMAL
+                        + (location == null ? "" : " at location [" + location + "]"));
+        }
+    }
+
+    private static Evaluator<Number> toNumberEvaluator(final Evaluator<?> evaluator) {
+        return toNumberEvaluator(evaluator, null);
+    }
+
+    @SuppressWarnings("unchecked")
+    private static Evaluator<Number> toNumberEvaluator(final Evaluator<?> evaluator, final String location) {
+        switch (evaluator.getResultType()) {
+            case NUMBER:
+                return (Evaluator<Number>) evaluator;
+            case STRING:
+            case DATE:
+            case DECIMAL:
+            case WHOLE_NUMBER:
+                return addToken(new NumberCastEvaluator(evaluator), evaluator.getToken());
+            default:
+                throw new AttributeExpressionLanguageParsingException("Cannot implicitly convert Data Type " + evaluator.getResultType() + " to " + ResultType.WHOLE_NUMBER
+                        + (location == null ? "" : " at location [" + location + "]"));
+        }
+    }
+
     private static DateEvaluator toDateEvaluator(final Evaluator<?> evaluator) {
         return toDateEvaluator(evaluator, null);
     }
@@ -1046,11 +1087,11 @@ public class Query {
                 final int numArgs = argEvaluators.size();
                 if (numArgs == 1) {
                     return addToken(new SubstringEvaluator(toStringEvaluator(subjectEvaluator),
-                        toNumberEvaluator(argEvaluators.get(0), "first argument to substring")), "substring");
+                        toWholeNumberEvaluator(argEvaluators.get(0), "first argument to substring")), "substring");
                 } else if (numArgs == 2) {
                     return addToken(new SubstringEvaluator(toStringEvaluator(subjectEvaluator),
-                        toNumberEvaluator(argEvaluators.get(0), "first argument to substring"),
-                        toNumberEvaluator(argEvaluators.get(1), "second argument to substring")), "substring");
+                        toWholeNumberEvaluator(argEvaluators.get(0), "first argument to substring"),
+                        toWholeNumberEvaluator(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");
                 }
@@ -1142,29 +1183,48 @@ public class Query {
             }
             case TO_DATE: {
                 if (argEvaluators.isEmpty()) {
-                    return addToken(new NumberToDateEvaluator(toNumberEvaluator(subjectEvaluator)), "toDate");
+                    return addToken(new NumberToDateEvaluator(toWholeNumberEvaluator(subjectEvaluator)), "toDate");
                 } else if (subjectEvaluator.getResultType() == ResultType.STRING) {
                     return addToken(new StringToDateEvaluator(toStringEvaluator(subjectEvaluator), toStringEvaluator(argEvaluators.get(0))), "toDate");
                 } else {
-                    return addToken(new NumberToDateEvaluator(toNumberEvaluator(subjectEvaluator)), "toDate");
+                    return addToken(new NumberToDateEvaluator(toWholeNumberEvaluator(subjectEvaluator)), "toDate");
                 }
             }
             case TO_NUMBER: {
                 verifyArgCount(argEvaluators, 0, "toNumber");
                 switch (subjectEvaluator.getResultType()) {
                     case STRING:
-                        return addToken(new ToNumberEvaluator((StringEvaluator) subjectEvaluator), "toNumber");
+                    case WHOLE_NUMBER:
+                    case DECIMAL:
+                    case NUMBER:
+                    case DATE:
+                        return addToken(toWholeNumberEvaluator(subjectEvaluator), "toNumber");
+                    default:
+                        throw new AttributeExpressionLanguageParsingException(subjectEvaluator + " returns type " + subjectEvaluator.getResultType() + " but expected to get " + ResultType.STRING +
+                                ", " + ResultType.DECIMAL + ", or " + ResultType.DATE);
+                }
+            }
+            case TO_DECIMAL: {
+                verifyArgCount(argEvaluators, 0, "toDecimal");
+                switch (subjectEvaluator.getResultType()) {
+                    case WHOLE_NUMBER:
+                    case DECIMAL:
+                    case STRING:
+                    case NUMBER:
                     case DATE:
-                        return addToken(new DateToNumberEvaluator((DateEvaluator) subjectEvaluator), "toNumber");
+                        return addToken(toDecimalEvaluator(subjectEvaluator), "toDecimal");
                     default:
-                        throw new AttributeExpressionLanguageParsingException(subjectEvaluator + " returns type " + subjectEvaluator.getResultType() + " but expected to get " + ResultType.STRING);
+                        throw new AttributeExpressionLanguageParsingException(subjectEvaluator + " returns type " + subjectEvaluator.getResultType() + " but expected to get " + ResultType.STRING +
+                                ", " + ResultType.WHOLE_NUMBER + ", or " + ResultType.DATE);
                 }
             }
             case TO_RADIX: {
                 if (argEvaluators.size() == 1) {
-                    return addToken(new ToRadixEvaluator((NumberEvaluator) subjectEvaluator, toNumberEvaluator(argEvaluators.get(0))), "toRadix");
+                    return addToken(new ToRadixEvaluator(toWholeNumberEvaluator(subjectEvaluator),
+                            toWholeNumberEvaluator(argEvaluators.get(0))), "toRadix");
                 } else {
-                    return addToken(new ToRadixEvaluator((NumberEvaluator) subjectEvaluator, toNumberEvaluator(argEvaluators.get(0)), toNumberEvaluator(argEvaluators.get(1))), "toRadix");
+                    return addToken(new ToRadixEvaluator(toWholeNumberEvaluator(subjectEvaluator),
+                            toWholeNumberEvaluator(argEvaluators.get(0)), toWholeNumberEvaluator(argEvaluators.get(1))), "toRadix");
                 }
             }
             case MOD: {
@@ -1211,24 +1271,24 @@ public class Query {
                 if (argEvaluators.size() == 1) {
                     // Only a single argument - the index to return.
                     return addToken(new GetDelimitedFieldEvaluator(toStringEvaluator(subjectEvaluator),
-                        toNumberEvaluator(argEvaluators.get(0), "first argument of getDelimitedField")), "getDelimitedField");
+                        toWholeNumberEvaluator(argEvaluators.get(0), "first argument of getDelimitedField")), "getDelimitedField");
                 } else if (argEvaluators.size() == 2) {
                     // two arguments - index and delimiter.
                     return addToken(new GetDelimitedFieldEvaluator(toStringEvaluator(subjectEvaluator),
-                        toNumberEvaluator(argEvaluators.get(0), "first argument of getDelimitedField"),
+                        toWholeNumberEvaluator(argEvaluators.get(0), "first argument of getDelimitedField"),
                         toStringEvaluator(argEvaluators.get(1), "second argument of getDelimitedField")),
                         "getDelimitedField");
                 } else if (argEvaluators.size() == 3) {
                     // 3 arguments - index, delimiter, quote char.
                     return addToken(new GetDelimitedFieldEvaluator(toStringEvaluator(subjectEvaluator),
-                        toNumberEvaluator(argEvaluators.get(0), "first argument of getDelimitedField"),
+                        toWholeNumberEvaluator(argEvaluators.get(0), "first argument of getDelimitedField"),
                         toStringEvaluator(argEvaluators.get(1), "second argument of getDelimitedField"),
                         toStringEvaluator(argEvaluators.get(2), "third argument of getDelimitedField")),
                         "getDelimitedField");
                 } else if (argEvaluators.size() == 4) {
                     // 4 arguments - index, delimiter, quote char, escape char
                     return addToken(new GetDelimitedFieldEvaluator(toStringEvaluator(subjectEvaluator),
-                        toNumberEvaluator(argEvaluators.get(0), "first argument of getDelimitedField"),
+                        toWholeNumberEvaluator(argEvaluators.get(0), "first argument of getDelimitedField"),
                         toStringEvaluator(argEvaluators.get(1), "second argument of getDelimitedField"),
                         toStringEvaluator(argEvaluators.get(2), "third argument of getDelimitedField"),
                         toStringEvaluator(argEvaluators.get(3), "fourth argument of getDelimitedField")),
@@ -1236,7 +1296,7 @@ public class Query {
                 } else {
                     // 5 arguments - index, delimiter, quote char, escape char, strip escape/quote chars flag
                     return addToken(new GetDelimitedFieldEvaluator(toStringEvaluator(subjectEvaluator),
-                        toNumberEvaluator(argEvaluators.get(0), "first argument of getDelimitedField"),
+                        toWholeNumberEvaluator(argEvaluators.get(0), "first argument of getDelimitedField"),
                         toStringEvaluator(argEvaluators.get(1), "second argument of getDelimitedField"),
                         toStringEvaluator(argEvaluators.get(2), "third argument of getDelimitedField"),
                         toStringEvaluator(argEvaluators.get(3), "fourth argument of getDelimitedField"),

http://git-wip-us.apache.org/repos/asf/nifi/blob/94ab9990/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/DecimalEvaluator.java
----------------------------------------------------------------------
diff --git a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/DecimalEvaluator.java b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/DecimalEvaluator.java
new file mode 100644
index 0000000..f41b965
--- /dev/null
+++ b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/DecimalEvaluator.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.nifi.attribute.expression.language.evaluation;
+
+import org.apache.nifi.expression.AttributeExpression.ResultType;
+
+public abstract class DecimalEvaluator implements Evaluator<Double> {
+    private String token;
+
+    @Override
+    public ResultType getResultType() {
+        return ResultType.DECIMAL;
+    }
+
+    @Override
+    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/nifi/blob/94ab9990/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/DecimalQueryResult.java
----------------------------------------------------------------------
diff --git a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/DecimalQueryResult.java b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/DecimalQueryResult.java
new file mode 100644
index 0000000..b7980a8
--- /dev/null
+++ b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/DecimalQueryResult.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.nifi.attribute.expression.language.evaluation;
+
+import org.apache.nifi.expression.AttributeExpression.ResultType;
+
+public class DecimalQueryResult implements QueryResult<Double> {
+
+    private final Double value;
+
+    public DecimalQueryResult(final Double value) {
+        this.value = value;
+    }
+
+    @Override
+    public Double getValue() {
+        return value;
+    }
+
+    @Override
+    public ResultType getResultType() {
+        return ResultType.DECIMAL;
+    }
+
+    @Override
+    public String toString() {
+        return String.valueOf(getValue());
+    }
+}

http://git-wip-us.apache.org/repos/asf/nifi/blob/94ab9990/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/NumberEvaluator.java
----------------------------------------------------------------------
diff --git a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/NumberEvaluator.java b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/NumberEvaluator.java
index ec3adac..1faf533 100644
--- a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/NumberEvaluator.java
+++ b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/NumberEvaluator.java
@@ -18,7 +18,7 @@ package org.apache.nifi.attribute.expression.language.evaluation;
 
 import org.apache.nifi.expression.AttributeExpression.ResultType;
 
-public abstract class NumberEvaluator implements Evaluator<Long> {
+public abstract class NumberEvaluator implements Evaluator<Number> {
     private String token;
 
     @Override

http://git-wip-us.apache.org/repos/asf/nifi/blob/94ab9990/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/NumberQueryResult.java
----------------------------------------------------------------------
diff --git a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/NumberQueryResult.java b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/NumberQueryResult.java
index fc3c961..2c9a6e8 100644
--- a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/NumberQueryResult.java
+++ b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/NumberQueryResult.java
@@ -18,16 +18,16 @@ package org.apache.nifi.attribute.expression.language.evaluation;
 
 import org.apache.nifi.expression.AttributeExpression.ResultType;
 
-public class NumberQueryResult implements QueryResult<Long> {
+public class NumberQueryResult implements QueryResult<Number> {
 
-    private final Long value;
+    private final Number value;
 
-    public NumberQueryResult(final Long value) {
+    public NumberQueryResult(final Number value) {
         this.value = value;
     }
 
     @Override
-    public Long getValue() {
+    public Number getValue() {
         return value;
     }
 

http://git-wip-us.apache.org/repos/asf/nifi/blob/94ab9990/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/WholeNumberEvaluator.java
----------------------------------------------------------------------
diff --git a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/WholeNumberEvaluator.java b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/WholeNumberEvaluator.java
new file mode 100644
index 0000000..a8d189f
--- /dev/null
+++ b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/WholeNumberEvaluator.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.nifi.attribute.expression.language.evaluation;
+
+import org.apache.nifi.expression.AttributeExpression.ResultType;
+
+public abstract class WholeNumberEvaluator implements Evaluator<Long> {
+    private String token;
+
+    @Override
+    public ResultType getResultType() {
+        return ResultType.WHOLE_NUMBER;
+    }
+
+    @Override
+    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/nifi/blob/94ab9990/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/WholeNumberQueryResult.java
----------------------------------------------------------------------
diff --git a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/WholeNumberQueryResult.java b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/WholeNumberQueryResult.java
new file mode 100644
index 0000000..63be84a
--- /dev/null
+++ b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/WholeNumberQueryResult.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.nifi.attribute.expression.language.evaluation;
+
+import org.apache.nifi.expression.AttributeExpression.ResultType;
+
+public class WholeNumberQueryResult implements QueryResult<Long> {
+
+    private final Long value;
+
+    public WholeNumberQueryResult(final Long value) {
+        this.value = value;
+    }
+
+    @Override
+    public Long getValue() {
+        return value;
+    }
+
+    @Override
+    public ResultType getResultType() {
+        return ResultType.WHOLE_NUMBER;
+    }
+
+    @Override
+    public String toString() {
+        return String.valueOf(getValue());
+    }
+}

http://git-wip-us.apache.org/repos/asf/nifi/blob/94ab9990/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/cast/DateCastEvaluator.java
----------------------------------------------------------------------
diff --git a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/cast/DateCastEvaluator.java b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/cast/DateCastEvaluator.java
index 96e74ef..c2754d3 100644
--- a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/cast/DateCastEvaluator.java
+++ b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/cast/DateCastEvaluator.java
@@ -27,6 +27,7 @@ import java.util.regex.Pattern;
 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.NumberQueryResult;
 import org.apache.nifi.attribute.expression.language.evaluation.QueryResult;
 import org.apache.nifi.attribute.expression.language.evaluation.StringQueryResult;
 import org.apache.nifi.attribute.expression.language.exception.AttributeExpressionLanguageException;
@@ -102,8 +103,14 @@ public class DateCastEvaluator extends DateEvaluator {
                         throw new AttributeExpressionLanguageException("Could not implicitly convert input to DATE: " + value);
                     }
                 }
-            case NUMBER:
+            case WHOLE_NUMBER:
                 return new DateQueryResult(new Date((Long) result.getValue()));
+            case DECIMAL:
+                Double resultDouble = (Double) result.getValue();
+                return new DateQueryResult(new Date(resultDouble.longValue()));
+            case NUMBER:
+                final Number numberValue = ((NumberQueryResult) result).getValue();
+                return new DateQueryResult(new Date(numberValue.longValue()));
             default:
                 return new DateQueryResult(null);
         }

http://git-wip-us.apache.org/repos/asf/nifi/blob/94ab9990/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/cast/DecimalCastEvaluator.java
----------------------------------------------------------------------
diff --git a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/cast/DecimalCastEvaluator.java b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/cast/DecimalCastEvaluator.java
new file mode 100644
index 0000000..9418028
--- /dev/null
+++ b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/cast/DecimalCastEvaluator.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.nifi.attribute.expression.language.evaluation.cast;
+
+import org.apache.nifi.attribute.expression.language.evaluation.DateQueryResult;
+import org.apache.nifi.attribute.expression.language.evaluation.DecimalEvaluator;
+import org.apache.nifi.attribute.expression.language.evaluation.DecimalQueryResult;
+import org.apache.nifi.attribute.expression.language.evaluation.Evaluator;
+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.StringQueryResult;
+import org.apache.nifi.attribute.expression.language.evaluation.WholeNumberQueryResult;
+import org.apache.nifi.attribute.expression.language.evaluation.util.NumberParsing;
+import org.apache.nifi.attribute.expression.language.exception.AttributeExpressionLanguageParsingException;
+import org.apache.nifi.expression.AttributeExpression.ResultType;
+
+import java.util.Map;
+
+public class DecimalCastEvaluator extends DecimalEvaluator {
+
+    private final Evaluator<?> subjectEvaluator;
+
+    public DecimalCastEvaluator(final Evaluator<?> subjectEvaluator) {
+        if (subjectEvaluator.getResultType() == ResultType.BOOLEAN) {
+            throw new AttributeExpressionLanguageParsingException("Cannot implicitly convert Data Type " + subjectEvaluator.getResultType() + " to " + ResultType.DECIMAL);
+        }
+        this.subjectEvaluator = subjectEvaluator;
+    }
+
+    @Override
+    public QueryResult<Double> evaluate(final Map<String, String> attributes) {
+        final QueryResult<?> result = subjectEvaluator.evaluate(attributes);
+        if (result.getValue() == null) {
+            return new DecimalQueryResult(null);
+        }
+
+        switch (result.getResultType()) {
+            case DECIMAL:
+                return (DecimalQueryResult) result;
+            case STRING:
+                final String trimmed = ((StringQueryResult) result).getValue().trim();
+                NumberParsing.ParseResultType parseType = NumberParsing.parse(trimmed);
+                switch (parseType){
+                    case DECIMAL:
+                        return new DecimalQueryResult(Double.valueOf(trimmed));
+                    case WHOLE_NUMBER:
+                        final Long resultValue = Long.valueOf(trimmed);
+                        return new DecimalQueryResult(resultValue.doubleValue());
+                    case NOT_NUMBER:
+                    default:
+                        return new DecimalQueryResult(null);
+                }
+            case DATE:
+                Long timestamp = ((DateQueryResult) result).getValue().getTime();
+                return new DecimalQueryResult(timestamp.doubleValue());
+            case WHOLE_NUMBER:
+                final Long resultValue = ((WholeNumberQueryResult) result).getValue();
+                return new DecimalQueryResult(resultValue.doubleValue());
+            case NUMBER:
+                final Number numberValue = ((NumberQueryResult) result).getValue();
+                return new DecimalQueryResult(numberValue.doubleValue());
+            default:
+                return new DecimalQueryResult(null);
+        }
+    }
+
+    @Override
+    public Evaluator<?> getSubjectEvaluator() {
+        return subjectEvaluator;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/nifi/blob/94ab9990/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/cast/NumberCastEvaluator.java
----------------------------------------------------------------------
diff --git a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/cast/NumberCastEvaluator.java b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/cast/NumberCastEvaluator.java
index 0447d48..4073dc4 100644
--- a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/cast/NumberCastEvaluator.java
+++ b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/cast/NumberCastEvaluator.java
@@ -16,32 +16,33 @@
  */
 package org.apache.nifi.attribute.expression.language.evaluation.cast;
 
-import java.util.Map;
-import java.util.regex.Pattern;
-
 import org.apache.nifi.attribute.expression.language.evaluation.DateQueryResult;
+import org.apache.nifi.attribute.expression.language.evaluation.DecimalQueryResult;
 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.StringQueryResult;
+import org.apache.nifi.attribute.expression.language.evaluation.WholeNumberQueryResult;
+import org.apache.nifi.attribute.expression.language.evaluation.util.NumberParsing;
 import org.apache.nifi.attribute.expression.language.exception.AttributeExpressionLanguageParsingException;
 import org.apache.nifi.expression.AttributeExpression.ResultType;
 
+import java.util.Map;
+
 public class NumberCastEvaluator extends NumberEvaluator {
 
     private final Evaluator<?> subjectEvaluator;
-    private static final Pattern NUMBER_PATTERN = Pattern.compile("-?\\d+");
 
     public NumberCastEvaluator(final Evaluator<?> subjectEvaluator) {
         if (subjectEvaluator.getResultType() == ResultType.BOOLEAN) {
-            throw new AttributeExpressionLanguageParsingException("Cannot implicitly convert Data Type " + subjectEvaluator.getResultType() + " to " + ResultType.NUMBER);
+            throw new AttributeExpressionLanguageParsingException("Cannot implicitly convert Data Type " + subjectEvaluator.getResultType() + " to " + ResultType.WHOLE_NUMBER);
         }
         this.subjectEvaluator = subjectEvaluator;
     }
 
     @Override
-    public QueryResult<Long> evaluate(final Map<String, String> attributes) {
+    public QueryResult<Number> evaluate(final Map<String, String> attributes) {
         final QueryResult<?> result = subjectEvaluator.evaluate(attributes);
         if (result.getValue() == null) {
             return new NumberQueryResult(null);
@@ -50,12 +51,24 @@ public class NumberCastEvaluator extends NumberEvaluator {
         switch (result.getResultType()) {
             case NUMBER:
                 return (NumberQueryResult) result;
+            case WHOLE_NUMBER:
+                Long longValue = ((WholeNumberQueryResult) result).getValue();
+                return new NumberQueryResult(longValue);
+            case DECIMAL:
+                Double doubleValue = ((DecimalQueryResult) result).getValue();
+                return new NumberQueryResult(doubleValue);
             case STRING:
                 final String trimmed = ((StringQueryResult) result).getValue().trim();
-                if (NUMBER_PATTERN.matcher(trimmed).matches()) {
-                    return new NumberQueryResult(Long.valueOf(trimmed));
-                } else {
-                    return new NumberQueryResult(null);
+                NumberParsing.ParseResultType parseType = NumberParsing.parse(trimmed);
+                switch (parseType){
+                    case DECIMAL:
+                        return new NumberQueryResult(Double.valueOf(trimmed));
+                    case WHOLE_NUMBER:
+                        final Long resultValue = Long.valueOf(trimmed);
+                        return new NumberQueryResult(Long.valueOf(trimmed));
+                    case NOT_NUMBER:
+                    default:
+                        return new NumberQueryResult(null);
                 }
             case DATE:
                 return new NumberQueryResult(((DateQueryResult) result).getValue().getTime());

http://git-wip-us.apache.org/repos/asf/nifi/blob/94ab9990/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/cast/WholeNumberCastEvaluator.java
----------------------------------------------------------------------
diff --git a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/cast/WholeNumberCastEvaluator.java b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/cast/WholeNumberCastEvaluator.java
new file mode 100644
index 0000000..024fb44
--- /dev/null
+++ b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/cast/WholeNumberCastEvaluator.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.nifi.attribute.expression.language.evaluation.cast;
+
+import java.util.Map;
+
+import org.apache.nifi.attribute.expression.language.evaluation.DateQueryResult;
+import org.apache.nifi.attribute.expression.language.evaluation.DecimalQueryResult;
+import org.apache.nifi.attribute.expression.language.evaluation.Evaluator;
+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.StringQueryResult;
+import org.apache.nifi.attribute.expression.language.evaluation.WholeNumberEvaluator;
+import org.apache.nifi.attribute.expression.language.evaluation.WholeNumberQueryResult;
+import org.apache.nifi.attribute.expression.language.evaluation.util.NumberParsing;
+import org.apache.nifi.attribute.expression.language.exception.AttributeExpressionLanguageParsingException;
+import org.apache.nifi.expression.AttributeExpression.ResultType;
+
+public class WholeNumberCastEvaluator extends WholeNumberEvaluator {
+
+    private final Evaluator<?> subjectEvaluator;
+
+    public WholeNumberCastEvaluator(final Evaluator<?> subjectEvaluator) {
+        if (subjectEvaluator.getResultType() == ResultType.BOOLEAN) {
+            throw new AttributeExpressionLanguageParsingException("Cannot implicitly convert Data Type " + subjectEvaluator.getResultType() + " to " + ResultType.WHOLE_NUMBER);
+        }
+        this.subjectEvaluator = subjectEvaluator;
+    }
+
+    @Override
+    public QueryResult<Long> evaluate(final Map<String, String> attributes) {
+        final QueryResult<?> result = subjectEvaluator.evaluate(attributes);
+        if (result.getValue() == null) {
+            return new WholeNumberQueryResult(null);
+        }
+
+        switch (result.getResultType()) {
+            case WHOLE_NUMBER:
+                return (WholeNumberQueryResult) result;
+            case STRING:
+                final String trimmed = ((StringQueryResult) result).getValue().trim();
+                NumberParsing.ParseResultType parseType = NumberParsing.parse(trimmed);
+                switch (parseType){
+                    case DECIMAL:
+                        final Double resultValue = Double.valueOf(trimmed);
+                        return new WholeNumberQueryResult(resultValue.longValue());
+                    case WHOLE_NUMBER:
+                        return new WholeNumberQueryResult(Long.valueOf(trimmed));
+                    case NOT_NUMBER:
+                    default:
+                        return new WholeNumberQueryResult(null);
+                }
+            case DATE:
+                return new WholeNumberQueryResult(((DateQueryResult) result).getValue().getTime());
+            case DECIMAL:
+                final Double resultValue = ((DecimalQueryResult) result).getValue();
+                return new WholeNumberQueryResult(resultValue.longValue());
+            case NUMBER:
+                final Number numberValue = ((NumberQueryResult) result).getValue();
+                return new WholeNumberQueryResult(numberValue.longValue());
+            default:
+                return new WholeNumberQueryResult(null);
+        }
+    }
+
+    @Override
+    public Evaluator<?> getSubjectEvaluator() {
+        return subjectEvaluator;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/nifi/blob/94ab9990/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/DateToNumberEvaluator.java
----------------------------------------------------------------------
diff --git a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/DateToNumberEvaluator.java b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/DateToNumberEvaluator.java
deleted file mode 100644
index 0594c4a..0000000
--- a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/DateToNumberEvaluator.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.nifi.attribute.expression.language.evaluation.functions;
-
-import java.util.Date;
-import java.util.Map;
-
-import org.apache.nifi.attribute.expression.language.evaluation.DateEvaluator;
-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;
-
-public class DateToNumberEvaluator extends NumberEvaluator {
-
-    private final DateEvaluator subjectEvaluator;
-
-    public DateToNumberEvaluator(final DateEvaluator subjectEvaluator) {
-        this.subjectEvaluator = subjectEvaluator;
-    }
-
-    @Override
-    public QueryResult<Long> evaluate(final Map<String, String> attributes) {
-        final QueryResult<Date> subjectResult = subjectEvaluator.evaluate(attributes);
-        if (subjectResult.getValue() == null) {
-            return new NumberQueryResult(null);
-        }
-
-        return new NumberQueryResult(subjectResult.getValue().getTime());
-    }
-
-    @Override
-    public Evaluator<?> getSubjectEvaluator() {
-        return subjectEvaluator;
-    }
-}

http://git-wip-us.apache.org/repos/asf/nifi/blob/94ab9990/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/DivideEvaluator.java
----------------------------------------------------------------------
diff --git a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/DivideEvaluator.java b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/DivideEvaluator.java
index 12ab37f..711ca98 100644
--- a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/DivideEvaluator.java
+++ b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/DivideEvaluator.java
@@ -25,27 +25,32 @@ import org.apache.nifi.attribute.expression.language.evaluation.QueryResult;
 
 public class DivideEvaluator extends NumberEvaluator {
 
-    private final Evaluator<Long> subject;
-    private final Evaluator<Long> divideValue;
+    private final Evaluator<Number> subject;
+    private final Evaluator<Number> divideValue;
 
-    public DivideEvaluator(final Evaluator<Long> subject, final Evaluator<Long> divideValue) {
+    public DivideEvaluator(final Evaluator<Number> subject, final Evaluator<Number> divideValue) {
         this.subject = subject;
         this.divideValue = divideValue;
     }
 
     @Override
-    public QueryResult<Long> evaluate(final Map<String, String> attributes) {
-        final Long subjectValue = subject.evaluate(attributes).getValue();
+    public QueryResult<Number> evaluate(final Map<String, String> attributes) {
+        final Number subjectValue = subject.evaluate(attributes).getValue();
         if (subjectValue == null) {
             return new NumberQueryResult(null);
         }
 
-        final Long divide = divideValue.evaluate(attributes).getValue();
+        final Number divide = divideValue.evaluate(attributes).getValue();
         if (divide == null) {
             return new NumberQueryResult(null);
         }
 
-        final long result = subjectValue / divide;
+        final Number result;
+        if (subjectValue instanceof Double || divide instanceof Double){
+            result = subjectValue.doubleValue() / divide.doubleValue();
+        } else {
+            result = subjectValue.longValue() / divide.longValue();
+        }
         return new NumberQueryResult(result);
     }
 

http://git-wip-us.apache.org/repos/asf/nifi/blob/94ab9990/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/GreaterThanEvaluator.java
----------------------------------------------------------------------
diff --git a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/GreaterThanEvaluator.java b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/GreaterThanEvaluator.java
index 8850225..26d3ea9 100644
--- a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/GreaterThanEvaluator.java
+++ b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/GreaterThanEvaluator.java
@@ -25,27 +25,31 @@ import org.apache.nifi.attribute.expression.language.evaluation.QueryResult;
 
 public class GreaterThanEvaluator extends BooleanEvaluator {
 
-    private final Evaluator<Long> subject;
-    private final Evaluator<Long> comparison;
+    private final Evaluator<Number> subject;
+    private final Evaluator<Number> comparison;
 
-    public GreaterThanEvaluator(final Evaluator<Long> subject, final Evaluator<Long> comparison) {
+    public GreaterThanEvaluator(final Evaluator<Number> subject, final Evaluator<Number> comparison) {
         this.subject = subject;
         this.comparison = comparison;
     }
 
     @Override
     public QueryResult<Boolean> evaluate(final Map<String, String> attributes) {
-        final Long subjectValue = subject.evaluate(attributes).getValue();
+        final Number subjectValue = subject.evaluate(attributes).getValue();
         if (subjectValue == null) {
             return new BooleanQueryResult(false);
         }
 
-        final Long comparisonValue = comparison.evaluate(attributes).getValue();
+        final Number comparisonValue = comparison.evaluate(attributes).getValue();
         if (comparisonValue == null) {
             return new BooleanQueryResult(false);
         }
 
-        return new BooleanQueryResult(subjectValue > comparisonValue);
+        if (subjectValue instanceof Double || comparisonValue instanceof Double){
+            return new BooleanQueryResult(subjectValue.doubleValue() > comparisonValue.doubleValue());
+        } else {
+            return new BooleanQueryResult(subjectValue.longValue() > comparisonValue.longValue());
+        }
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/nifi/blob/94ab9990/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/GreaterThanOrEqualEvaluator.java
----------------------------------------------------------------------
diff --git a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/GreaterThanOrEqualEvaluator.java b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/GreaterThanOrEqualEvaluator.java
index ff71335..4b6eb5f 100644
--- a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/GreaterThanOrEqualEvaluator.java
+++ b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/GreaterThanOrEqualEvaluator.java
@@ -25,27 +25,31 @@ import org.apache.nifi.attribute.expression.language.evaluation.QueryResult;
 
 public class GreaterThanOrEqualEvaluator extends BooleanEvaluator {
 
-    private final Evaluator<Long> subject;
-    private final Evaluator<Long> comparison;
+    private final Evaluator<Number> subject;
+    private final Evaluator<Number> comparison;
 
-    public GreaterThanOrEqualEvaluator(final Evaluator<Long> subject, final Evaluator<Long> comparison) {
+    public GreaterThanOrEqualEvaluator(final Evaluator<Number> subject, final Evaluator<Number> comparison) {
         this.subject = subject;
         this.comparison = comparison;
     }
 
     @Override
     public QueryResult<Boolean> evaluate(final Map<String, String> attributes) {
-        final Long subjectValue = subject.evaluate(attributes).getValue();
+        final Number subjectValue = subject.evaluate(attributes).getValue();
         if (subjectValue == null) {
             return new BooleanQueryResult(false);
         }
 
-        final Long comparisonValue = comparison.evaluate(attributes).getValue();
+        final Number comparisonValue = comparison.evaluate(attributes).getValue();
         if (comparisonValue == null) {
             return new BooleanQueryResult(false);
         }
 
-        return new BooleanQueryResult(subjectValue >= comparisonValue);
+        if (subjectValue instanceof Double || comparisonValue instanceof Double){
+            return new BooleanQueryResult(subjectValue.doubleValue() >= comparisonValue.doubleValue());
+        } else {
+            return new BooleanQueryResult(subjectValue.longValue() >= comparisonValue.longValue());
+        }
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/nifi/blob/94ab9990/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/IndexOfEvaluator.java
----------------------------------------------------------------------
diff --git a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/IndexOfEvaluator.java b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/IndexOfEvaluator.java
index c4bc03e..073570c 100644
--- a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/IndexOfEvaluator.java
+++ b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/IndexOfEvaluator.java
@@ -19,11 +19,11 @@ package org.apache.nifi.attribute.expression.language.evaluation.functions;
 import java.util.Map;
 
 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.WholeNumberEvaluator;
+import org.apache.nifi.attribute.expression.language.evaluation.WholeNumberQueryResult;
 
-public class IndexOfEvaluator extends NumberEvaluator {
+public class IndexOfEvaluator extends WholeNumberEvaluator {
 
     private final Evaluator<String> subject;
     private final Evaluator<String> indexEvaluator;
@@ -37,11 +37,11 @@ public class IndexOfEvaluator extends NumberEvaluator {
     public QueryResult<Long> evaluate(final Map<String, String> attributes) {
         final String subjectValue = subject.evaluate(attributes).getValue();
         if (subjectValue == null) {
-            return new NumberQueryResult(-1L);
+            return new WholeNumberQueryResult(-1L);
         }
         final String indexEvalValue = indexEvaluator.evaluate(attributes).getValue();
 
-        return new NumberQueryResult((long) subjectValue.indexOf(indexEvalValue));
+        return new WholeNumberQueryResult((long) subjectValue.indexOf(indexEvalValue));
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/nifi/blob/94ab9990/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LastIndexOfEvaluator.java
----------------------------------------------------------------------
diff --git a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LastIndexOfEvaluator.java b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LastIndexOfEvaluator.java
index 3ebbee7..c8bb2b0 100644
--- a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LastIndexOfEvaluator.java
+++ b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LastIndexOfEvaluator.java
@@ -19,11 +19,11 @@ package org.apache.nifi.attribute.expression.language.evaluation.functions;
 import java.util.Map;
 
 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.WholeNumberEvaluator;
+import org.apache.nifi.attribute.expression.language.evaluation.WholeNumberQueryResult;
 
-public class LastIndexOfEvaluator extends NumberEvaluator {
+public class LastIndexOfEvaluator extends WholeNumberEvaluator {
 
     private final Evaluator<String> subject;
     private final Evaluator<String> indexEvaluator;
@@ -37,11 +37,11 @@ public class LastIndexOfEvaluator extends NumberEvaluator {
     public QueryResult<Long> evaluate(final Map<String, String> attributes) {
         final String subjectValue = subject.evaluate(attributes).getValue();
         if (subjectValue == null) {
-            return new NumberQueryResult(-1L);
+            return new WholeNumberQueryResult(-1L);
         }
         final String indexEvalValue = indexEvaluator.evaluate(attributes).getValue();
 
-        return new NumberQueryResult((long) subjectValue.lastIndexOf(indexEvalValue));
+        return new WholeNumberQueryResult((long) subjectValue.lastIndexOf(indexEvalValue));
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/nifi/blob/94ab9990/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LengthEvaluator.java
----------------------------------------------------------------------
diff --git a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LengthEvaluator.java b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LengthEvaluator.java
index 46bc24c..27a70ad 100644
--- a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LengthEvaluator.java
+++ b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LengthEvaluator.java
@@ -19,11 +19,11 @@ package org.apache.nifi.attribute.expression.language.evaluation.functions;
 import java.util.Map;
 
 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.WholeNumberEvaluator;
+import org.apache.nifi.attribute.expression.language.evaluation.WholeNumberQueryResult;
 
-public class LengthEvaluator extends NumberEvaluator {
+public class LengthEvaluator extends WholeNumberEvaluator {
 
     private final Evaluator<String> subject;
 
@@ -34,7 +34,7 @@ public class LengthEvaluator extends NumberEvaluator {
     @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 WholeNumberQueryResult((long) (subjectValue == null ? 0 : subjectValue.length()));
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/nifi/blob/94ab9990/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LessThanEvaluator.java
----------------------------------------------------------------------
diff --git a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LessThanEvaluator.java b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LessThanEvaluator.java
index e9bf231..4b614fb 100644
--- a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LessThanEvaluator.java
+++ b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LessThanEvaluator.java
@@ -25,27 +25,31 @@ import org.apache.nifi.attribute.expression.language.evaluation.QueryResult;
 
 public class LessThanEvaluator extends BooleanEvaluator {
 
-    private final Evaluator<Long> subject;
-    private final Evaluator<Long> comparison;
+    private final Evaluator<Number> subject;
+    private final Evaluator<Number> comparison;
 
-    public LessThanEvaluator(final Evaluator<Long> subject, final Evaluator<Long> comparison) {
+    public LessThanEvaluator(final Evaluator<Number> subject, final Evaluator<Number> comparison) {
         this.subject = subject;
         this.comparison = comparison;
     }
 
     @Override
     public QueryResult<Boolean> evaluate(final Map<String, String> attributes) {
-        final Long subjectValue = subject.evaluate(attributes).getValue();
+        final Number subjectValue = subject.evaluate(attributes).getValue();
         if (subjectValue == null) {
             return new BooleanQueryResult(false);
         }
 
-        final Long comparisonValue = comparison.evaluate(attributes).getValue();
+        final Number comparisonValue = comparison.evaluate(attributes).getValue();
         if (comparisonValue == null) {
             return new BooleanQueryResult(false);
         }
 
-        return new BooleanQueryResult(subjectValue < comparisonValue);
+        if (subjectValue instanceof Double || comparisonValue instanceof Double){
+            return new BooleanQueryResult(subjectValue.doubleValue() < comparisonValue.doubleValue());
+        } else {
+            return new BooleanQueryResult(subjectValue.longValue() < comparisonValue.longValue());
+        }
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/nifi/blob/94ab9990/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LessThanOrEqualEvaluator.java
----------------------------------------------------------------------
diff --git a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LessThanOrEqualEvaluator.java b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LessThanOrEqualEvaluator.java
index 5bf5ee5..eea4820 100644
--- a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LessThanOrEqualEvaluator.java
+++ b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/LessThanOrEqualEvaluator.java
@@ -25,27 +25,31 @@ import org.apache.nifi.attribute.expression.language.evaluation.QueryResult;
 
 public class LessThanOrEqualEvaluator extends BooleanEvaluator {
 
-    private final Evaluator<Long> subject;
-    private final Evaluator<Long> comparison;
+    private final Evaluator<Number> subject;
+    private final Evaluator<Number> comparison;
 
-    public LessThanOrEqualEvaluator(final Evaluator<Long> subject, final Evaluator<Long> comparison) {
+    public LessThanOrEqualEvaluator(final Evaluator<Number> subject, final Evaluator<Number> comparison) {
         this.subject = subject;
         this.comparison = comparison;
     }
 
     @Override
     public QueryResult<Boolean> evaluate(final Map<String, String> attributes) {
-        final Long subjectValue = subject.evaluate(attributes).getValue();
+        final Number subjectValue = subject.evaluate(attributes).getValue();
         if (subjectValue == null) {
             return new BooleanQueryResult(false);
         }
 
-        final Long comparisonValue = comparison.evaluate(attributes).getValue();
+        final Number comparisonValue = comparison.evaluate(attributes).getValue();
         if (comparisonValue == null) {
             return new BooleanQueryResult(false);
         }
 
-        return new BooleanQueryResult(subjectValue <= comparisonValue);
+        if (subjectValue instanceof Double || comparisonValue instanceof Double){
+            return new BooleanQueryResult(subjectValue.doubleValue() <= comparisonValue.doubleValue());
+        } else {
+            return new BooleanQueryResult(subjectValue.longValue() <= comparisonValue.longValue());
+        }
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/nifi/blob/94ab9990/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/MinusEvaluator.java
----------------------------------------------------------------------
diff --git a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/MinusEvaluator.java b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/MinusEvaluator.java
index 0555187..2940252 100644
--- a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/MinusEvaluator.java
+++ b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/MinusEvaluator.java
@@ -25,27 +25,32 @@ import org.apache.nifi.attribute.expression.language.evaluation.QueryResult;
 
 public class MinusEvaluator extends NumberEvaluator {
 
-    private final Evaluator<Long> subject;
-    private final Evaluator<Long> minusValue;
+    private final Evaluator<Number> subject;
+    private final Evaluator<Number> minusValue;
 
-    public MinusEvaluator(final Evaluator<Long> subject, final Evaluator<Long> minusValue) {
+    public MinusEvaluator(final Evaluator<Number> subject, final Evaluator<Number> minusValue) {
         this.subject = subject;
         this.minusValue = minusValue;
     }
 
     @Override
-    public QueryResult<Long> evaluate(final Map<String, String> attributes) {
-        final Long subjectValue = subject.evaluate(attributes).getValue();
+    public QueryResult<Number> evaluate(final Map<String, String> attributes) {
+        final Number subjectValue = subject.evaluate(attributes).getValue();
         if (subjectValue == null) {
             return new NumberQueryResult(null);
         }
 
-        final Long minus = minusValue.evaluate(attributes).getValue();
+        final Number minus = minusValue.evaluate(attributes).getValue();
         if (minus == null) {
             return new NumberQueryResult(null);
         }
 
-        final long result = subjectValue - minus;
+        final Number result;
+        if (subjectValue instanceof Double || minus instanceof Double){
+            result = subjectValue.doubleValue() - minus.doubleValue();
+        } else {
+            result = subjectValue.longValue() - minus.longValue();
+        }
         return new NumberQueryResult(result);
     }
 

http://git-wip-us.apache.org/repos/asf/nifi/blob/94ab9990/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/ModEvaluator.java
----------------------------------------------------------------------
diff --git a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/ModEvaluator.java b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/ModEvaluator.java
index cf2121c..eb42b3d 100644
--- a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/ModEvaluator.java
+++ b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/ModEvaluator.java
@@ -25,27 +25,32 @@ import org.apache.nifi.attribute.expression.language.evaluation.QueryResult;
 
 public class ModEvaluator extends NumberEvaluator {
 
-    private final Evaluator<Long> subject;
-    private final Evaluator<Long> modValue;
+    private final Evaluator<Number> subject;
+    private final Evaluator<Number> modValue;
 
-    public ModEvaluator(final Evaluator<Long> subject, final Evaluator<Long> modValue) {
+    public ModEvaluator(final Evaluator<Number> subject, final Evaluator<Number> modValue) {
         this.subject = subject;
         this.modValue = modValue;
     }
 
     @Override
-    public QueryResult<Long> evaluate(final Map<String, String> attributes) {
-        final Long subjectValue = subject.evaluate(attributes).getValue();
+    public QueryResult<Number> evaluate(final Map<String, String> attributes) {
+        final Number subjectValue = subject.evaluate(attributes).getValue();
         if (subjectValue == null) {
             return new NumberQueryResult(null);
         }
 
-        final Long mod = modValue.evaluate(attributes).getValue();
+        final Number mod = modValue.evaluate(attributes).getValue();
         if (mod == null) {
             return new NumberQueryResult(null);
         }
 
-        final long result = subjectValue % mod;
+        final Number result;
+        if (subjectValue instanceof Double || mod instanceof Double){
+            result = subjectValue.doubleValue() % mod.doubleValue();
+        } else {
+            result = subjectValue.longValue() % mod.longValue();
+        }
         return new NumberQueryResult(result);
     }
 

http://git-wip-us.apache.org/repos/asf/nifi/blob/94ab9990/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/MultiplyEvaluator.java
----------------------------------------------------------------------
diff --git a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/MultiplyEvaluator.java b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/MultiplyEvaluator.java
index 4480c98..3d98ddd 100644
--- a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/MultiplyEvaluator.java
+++ b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/MultiplyEvaluator.java
@@ -25,27 +25,32 @@ import org.apache.nifi.attribute.expression.language.evaluation.QueryResult;
 
 public class MultiplyEvaluator extends NumberEvaluator {
 
-    private final Evaluator<Long> subject;
-    private final Evaluator<Long> multiplyValue;
+    private final Evaluator<Number> subject;
+    private final Evaluator<Number> multiplyValue;
 
-    public MultiplyEvaluator(final Evaluator<Long> subject, final Evaluator<Long> multiplyValue) {
+    public MultiplyEvaluator(final Evaluator<Number> subject, final Evaluator<Number> multiplyValue) {
         this.subject = subject;
         this.multiplyValue = multiplyValue;
     }
 
     @Override
-    public QueryResult<Long> evaluate(final Map<String, String> attributes) {
-        final Long subjectValue = subject.evaluate(attributes).getValue();
+    public QueryResult<Number> evaluate(final Map<String, String> attributes) {
+        final Number subjectValue = subject.evaluate(attributes).getValue();
         if (subjectValue == null) {
             return new NumberQueryResult(null);
         }
 
-        final Long multiply = multiplyValue.evaluate(attributes).getValue();
+        final Number multiply = multiplyValue.evaluate(attributes).getValue();
         if (multiply == null) {
             return new NumberQueryResult(null);
         }
 
-        final long result = subjectValue * multiply;
+        final Number result;
+        if (subjectValue instanceof Double || multiply instanceof Double){
+            result = subjectValue.doubleValue() * multiply.doubleValue();
+        } else {
+            result = subjectValue.longValue() * multiply.longValue();
+        }
         return new NumberQueryResult(result);
     }
 

http://git-wip-us.apache.org/repos/asf/nifi/blob/94ab9990/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/OneUpSequenceEvaluator.java
----------------------------------------------------------------------
diff --git a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/OneUpSequenceEvaluator.java b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/OneUpSequenceEvaluator.java
index 11d3fa9..5c507d6 100644
--- a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/OneUpSequenceEvaluator.java
+++ b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/evaluation/functions/OneUpSequenceEvaluator.java
@@ -20,17 +20,17 @@ import java.util.Map;
 import java.util.concurrent.atomic.AtomicLong;
 
 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.WholeNumberEvaluator;
+import org.apache.nifi.attribute.expression.language.evaluation.WholeNumberQueryResult;
 
-public class OneUpSequenceEvaluator extends NumberEvaluator {
+public class OneUpSequenceEvaluator extends WholeNumberEvaluator {
 
     private static final AtomicLong value = new AtomicLong(0L);
 
     @Override
     public QueryResult<Long> evaluate(final Map<String, String> attributes) {
-        return new NumberQueryResult(value.getAndIncrement());
+        return new WholeNumberQueryResult(value.getAndIncrement());
     }
 
     @Override