NIFI-1662 Adding proper UI regex support for decimals in EL This closes #1018
Project: http://git-wip-us.apache.org/repos/asf/nifi/repo Commit: http://git-wip-us.apache.org/repos/asf/nifi/commit/e4a3e096 Tree: http://git-wip-us.apache.org/repos/asf/nifi/tree/e4a3e096 Diff: http://git-wip-us.apache.org/repos/asf/nifi/diff/e4a3e096 Branch: refs/heads/master Commit: e4a3e096432f43087c499d69bcbb4f2a013269a7 Parents: 557e0b9 Author: jpercivall <joeperciv...@yahoo.com> Authored: Wed Oct 19 14:29:28 2016 -0400 Committer: Matt Burgess <mattyb...@apache.org> Committed: Mon Oct 24 10:31:16 2016 -0400 ---------------------------------------------------------------------- .../language/antlr/AttributeExpressionLexer.g | 3 +-- .../attribute/expression/language/TestQuery.java | 1 + .../main/asciidoc/expression-language-guide.adoc | 11 ++++++++--- .../webapp/js/jquery/nfeditor/languages/nfel.js | 19 ++++++++++++++++++- 4 files changed, 28 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/nifi/blob/e4a3e096/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 34ef48b..12704dd 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 @@ -81,8 +81,7 @@ WHOLE_NUMBER : ('0'..'9')+; DECIMAL : ('0'..'9')+ '.' ('0'..'9')* EXP? | '.' ('0'..'9')+ EXP? - | ('0'..'9')+ EXP - | ('0'..'9')+ ; + | ('0'..'9')+ EXP; fragment EXP : ('e'|'E') ('+'|'-')? ('0'..'9')+ ; http://git-wip-us.apache.org/repos/asf/nifi/blob/e4a3e096/nifi-commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestQuery.java ---------------------------------------------------------------------- diff --git a/nifi-commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestQuery.java b/nifi-commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestQuery.java index 01183ec..eee88f7 100644 --- a/nifi-commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestQuery.java +++ b/nifi-commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestQuery.java @@ -821,6 +821,7 @@ public class TestQuery { // The expected resulted is calculated instead of a set number due to the inaccuracy of double arithmetic verifyEquals("${literal(5):toNumber():multiply(${two:plus(1)})}", attributes, 5*3.2); + verifyEquals("${literal(5.5E-1):toDecimal():plus(${literal(.5E1)}):multiply(${two:plus(1)})}", attributes, (0.55+5)*3.2); } @Test http://git-wip-us.apache.org/repos/asf/nifi/blob/e4a3e096/nifi-docs/src/main/asciidoc/expression-language-guide.adoc ---------------------------------------------------------------------- diff --git a/nifi-docs/src/main/asciidoc/expression-language-guide.adoc b/nifi-docs/src/main/asciidoc/expression-language-guide.adoc index 75290f6..1f296f6 100644 --- a/nifi-docs/src/main/asciidoc/expression-language-guide.adoc +++ b/nifi-docs/src/main/asciidoc/expression-language-guide.adoc @@ -194,15 +194,20 @@ Language supports four different data types: - *Decimal*: A Decimal is a numeric value that can support decimals and larger values with minimal loss of precision. More precisely it is a double-precision 64-bit IEEE 754 floating point. Due to this minimal loss of precision this data type should not be used for very precise values, such as currency. For more documentation on the range of values stored in this data type - refer to this https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.3[link]. Decimals cannot be expressed as un-quoted characters - when inputting a literal Decimal to an Expression Language function. They must be input as Strings using quotes, like so: "1.1". + refer to this https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.3[link]. The following are some examples of the forms of + literal decimals that are supported in expression language (the "E" can also be lower-case): + + * 1.1 + * .1E1 + * 1.11E-12 + - *Date*: A Date is an object that holds a Date and Time. Utilizing the <<dates>> and <<type_cast>> functions this data type can be converted to/from Strings and numbers. If the whole Expression Language expression is evaluated to be a date then it will be converted to a String with the format: "<Day of Week> <Month> <Day of Month> <Hour>:<Minute>:<Second> <Time Zone> <Year>". Also expressed as "E MMM dd HH:mm:ss z yyyy" in Java SimpleDateFormat format. For example: "Wed Dec 31 12:00:04 UTC 2016". - *Boolean*: A Boolean is one of either `true` or `false`. -After evaluating expression language functions, all attributes are stored as of type String. +After evaluating expression language functions, all attributes are stored as type String. The Expression Language is generally able to automatically coerce a value of one data type to the appropriate data type for a function. However, functions do exist to manually coerce a value into a specific data type. http://git-wip-us.apache.org/repos/asf/nifi/blob/e4a3e096/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/jquery/nfeditor/languages/nfel.js ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/jquery/nfeditor/languages/nfel.js b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/jquery/nfeditor/languages/nfel.js index a73003f..dc4cc68 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/jquery/nfeditor/languages/nfel.js +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/jquery/nfeditor/languages/nfel.js @@ -658,7 +658,24 @@ nf.nfel = (function() { } return argumentStringResult; - } else if (stream.match(/^[0-9]+/)) { + } else if (stream.match(/^(([0-9]+\.[0-9]*)([eE][+-]?([0-9])+)?)|((\.[0-9]+)([eE][+-]?([0-9])+)?)|(([0-9]+)([eE][+-]?([0-9])+))/)) { + // ------------- + // Decimal value + // ------------- + // This matches the following ANTLR spec for deciamls + // + // DECIMAL : ('0'..'9')+ '.' ('0'..'9')* EXP? ^([0-9]+\.[0-9]*)([eE][+-]?([0-9])+)? + // | '.' ('0'..'9')+ EXP? + // | ('0'..'9')+ EXP; + // + // fragment EXP : ('e'|'E') ('+'|'-')? ('0'..'9')+ ; + + // change context back to arguments + state.context = ARGUMENTS; + + // style for decimal (use same as number) + return 'number'; + } else if (stream.match(/^-?[0-9]+/)) { // ------------- // integer value // -------------