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 <joeperciv...@yahoo.com> Authored: Tue Sep 13 17:40:58 2016 -0400 Committer: Matt Burgess <mattyb...@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