4.3. FEEL 中的规则表达式
友好的表达式语言(FEEL)是对象管理组(OMG)DMN 规范定义的表达式语言。FEEL 表达式在 DMN 模型中定义决策的逻辑。FEEL 旨在通过为决策模型构造分配语义来促进决策建模和执行。FEEL 表达式在决策要求图(DRDs)中占用表单元单元格,用于决策节点和商业知识模型。
有关 DMN 中的 FEEL 的更多信息,请参阅 OMG Decision Model 和 Notation 规格。
4.3.1. FEEL 中的数据类型
友好的表达式语言(FEEL)支持以下数据类型:
- 数字
- 字符串
- 布尔值
- 日期
- Time
- 日期和时间
- 天数和时间持续时间
- 多年和月的时间
- Functions
- 上下文
- 范围(或间隔)
- 列表
DMN 规范目前不提供将变量声明为 功能、 列表的显式方法,但 Red Hat Decision Manager 会将 DMN 内置类型扩展为支持这些类型的变量。上下文、范围或
以下列表描述了每种数据类型:
- 数字
FEEL 中的数字基于 IEEE 754-2008 年 12 月 128 格式,有 34 个数字的精度。在内部,数字在 Java 中表示为
MathContext DECIMAL128。https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.htmlFEEL 只支持一个数字数据类型,因此同一类型用于表示整数和浮点号。FEEL 编号使用点(
.)作为十进制分隔符。FEEL 不支持-INF、+INF或NaN。FEEL 使用null来代表无效的数字。Red Hat Decision Manager 扩展 DMN 规格并支持额外的数字标记:
-
Scientific: 您可以使用带有后缀
e<exp>或E<exp>的科学标记。例如,1.2e3与编写表达式1.2*10**3相同,但是一个字面上的值,而不是表达式。 -
十六进制 : 您可以使用带有前缀
0x的十六进制数字。例如:0xff与十进制数字255相同。支持大写字母和小写字母。例如:0XFF与0xff相同。 -
类型后缀: 您可以使用类型后缀
f、F、d、D、l和L。这些后缀会被忽略。
-
Scientific: 您可以使用带有后缀
- 字符串
FEEL 中的字符串是任意字符序列,用双引号括起。
示例
"John Doe"
- 布尔值
-
FEEL 使用三值布尔逻辑,因此布尔值逻辑表达式可以有
true、false或null的值。 - 日期
FEEL 不支持日期字面量,但您可以使用内置的
date()函数来构造日期值。FEEL 中的日期字符串遵循 XML 架构部分 2: Datatypes 文档中定义的格式。格式为"YYYY-MM-DD",其中YYYY是包含四位数字的年份,MM是带有两个数字的月份数,DD是当天的数目。例如:
date( "2017-06-23" )
日期对象的时间等于
"00:00:00",即午夜。日期被视为本地,不带时区。- Time
FEEL 不支持时间字面量,但您可以使用内置的
time()函数来构造时间值。FEEL 中的时间字符串遵循 XML 架构部分 2: Datatypes 文档中定义的格式。格式为",h 是一天的小时数(从hh:mm:ss[.uu][(+-)h:mm]"00到23),mm是小时内分钟,ss 是分钟的几秒。(可选)字符串可在第二之内定义毫秒(uuu)的数量,并包含正数(+)或从 UTC 时间起的负值(-)误差来定义其时区。您可以使用字母z来表示 UTC 时间,这与偏移-00:00相同。如果没有定义偏移,时间将被视为 local。示例:
time( "04:25:12" ) time( "14:10:00+02:00" ) time( "22:35:40.345-05:00" ) time( "15:00:30z" )
定义偏移或时区的时间值不能与未定义偏移或时区的本地时间进行比较。
- 日期和时间
FEEL 不支持日期和时间字面量,但您可以使用内置
的日期和时间(date 和 time()函数)来构造日期和时间值。FEEL 中的日期和时间字符串遵循 XML 架构部分 2: Datatypes 文档中定义的格式。格式为 "<date>T<time>",其中<date> 和 <time> 遵循预定义的 XML 模式格式,由T添加。示例:
date and time( "2017-10-22T23:59:00" ) date and time( "2017-06-13T14:10:00+02:00" ) date and time( "2017-02-05T22:35:40.345-05:00" ) date and time( "2017-06-13T15:00:30z" )
定义偏移或时区的日期和时间值不能与未定义偏移或时区的本地日期和时间值进行比较。
重要如果您的 DMN 规格的实现不支持 XML 架构中的空格,请使用关键字
dateTime作为日期和时间的同步。- 天数和时间持续时间
FEEL 不支持天和持续时间字面量,但您可以使用内置的
duration()函数来构造天数和持续时间值。FEEL 中的天数和持续时间字符串遵循 XML 架构第 2 部分定义 的格式,但仅限于天、小时和秒。不支持数月和年时间。示例:
duration( "P1DT23H12M30S" ) duration( "P23D" ) duration( "PT12H" ) duration( "PT35M" )
重要如果您的 DMN 规格的实现不支持 XML 架构中的空格,请使用关键字
dayTimeDuration作为天数 和持续时间的同步。- 多年和月的时间
FEEL 不支持多年和月的字面量,但您可以使用内置的
duration()函数来构造天数和持续时间值。FEEL 中的年和月字符串遵循 XML 架构第 2 部分定义的格式:数据类型 文档,但仅限于数年和月。不支持天、小时、分钟或秒。示例:
duration( "P3Y5M" ) duration( "P2Y" ) duration( "P10M" ) duration( "P25M" )
重要如果您的 DMN 规格的实现在 XML 模式中不支持空格,使用关键字
yearMonthDuration作为年份和月的时间。- Functions
FEEL 具有
功能文字(或匿名功能),可用于创建功能。DMN 规格目前不提供将变量声明为功能的一个明确方法,但红帽决策管理器扩展了 DMN 内置类型来支持功能变量。例如:
function(a, b) a + b
在这个示例中,FEEL 表达式会创建一个功能,添加参数
a和b,并返回结果。- 上下文
FEEL 具有
上下文文字,可用于创建上下文。FEEL 中的上下文是键值对列表,类似于 Java 等语言映射。DMN 规格目前不提供将变量声明为上下文的显式方式,但红帽决策管理器扩展了 DMN 内置类型来支持上下文变量。例如:
{ x : 5, y : 3 }在本例中,表达式会创建一个包含两个条目(
x和y)的上下文,代表 chart 中的协调。在 DMN 1.2 中,创建上下文的另一个方法是创建包含键列表作为属性的项定义,然后将变量声明为具有项目定义类型。
Red Hat Decision Manager DMN API 以两种方式表示,在
DMNContext中支持 DMNItemDefinitionstructural 类型:-
用户定义的 Java 类型:Must 是定义属性的有效 JavaBeans 对象,为 DMN
ItemDefinition中的每个组件的 getters。如果需要,您也可以将@FEELProperty注释用于代表一个组件名称(这会导致无效的 Java 标识符)的 getter。 -
java.util.Map接口:映射需要定义适当的条目,其键对应于 DMNItemDefinition中的组件名称。
-
用户定义的 Java 类型:Must 是定义属性的有效 JavaBeans 对象,为 DMN
- 范围(或间隔)
FEEL 有
范围文字,可用于创建范围或间隔。FEEL 中的范围是一个定义较低和上限的值,可在其中打开或关闭它们。DMN 规格目前不提供将变量声明为范围的方法,但 Red Hat Decision Manager 会将 DMN 内置类型扩展为支持范围变量。范围语法以以下格式定义:
range := interval_start endpoint '..' endpoint interval_end interval_start := open_start | closed_start open_start := '(' | ']' closed_start := '[' interval_end := open_end | closed_end open_end := ')' | '[' closed_end := ']' endpoint := expression端点的表达式必须返回可比较的值,并且较低绑定端点必须小于上限的端点。
例如,以下字面表达式定义了
1到10之间的间隔,包括边界(两个端点上的关闭间隔):[ 1 .. 10 ]
以下字面表达式定义了 1 小时和 12 小时之间的间隔,其中包括下限(关闭间隔),但排除了上限(打开的时间间隔):
[ duration("PT1H") .. duration("PT12H") )您可以使用决策表中的范围来测试值范围,或者在简单字面表达式中使用范围。例如,如果变量
x的值介于0到100之间,则以下字面表达式返回true:x in [ 1 .. 100 ]
- 列表
FEEL 具有
列表文字,可用于创建项目列表。FEEL 中的列表由以方括号括起的值列表来表示。DMN 规格目前不提供将变量声明为列表()的显式方式,但 Red Hat Decision Manager 会将 DMN 内置类型扩展为支持列表变量。例如:
[ 2, 3, 4, 5 ]
FEEL 中的所有列表都包含同一类型的元素,且不可变。列表中的元素可以通过索引来访问,其中第一个元素为
1。负索引可以访问从列表末尾开始的元素,以便-1是最后一个元素。例如,以下表达式返回列表
x的第二个元素:x[2]
以下表达式返回列表
x的 second-to-last 元素:x[-2]
列表中的元素也可以按函数
数计算,后者将元素列表用作参数。例如,以下表达式返回
4:count([ 2, 3, 4, 5 ])
4.3.2. FEEL 中的内置功能
为促进与其他平台和系统间的互操作性,Friendly Enoendly Enough Expression Language(FEEL)包括了一个内置功能库。内置的 FEEL 功能在 Drools Decision Model 和 Notation(DMN)引擎中实施,以便您可以使用 DMN 决策服务中的功能。
以下小节描述了每个内置 FEEL 功能,它的格式是 NAME( PARAMETERS )。有关 DMN 中的 FEEL 功能的更多信息,请参阅 OMG Decision Model 和 Notation 规格。
4.3.2.1. 转换功能
以下功能支持在不同类型值之间进行转换。其中一些功能使用特定的字符串格式,如下例所示:
-
日期字符串:遵循 XML 架构部分 2: 数据类型 文档中定义的格式,如2020-06-01 时间字符串:遵循以下格式之一:-
XML 架构第 2 部分定义的格式:数据类型 文档,如
23:59:00z -
由 ISO 8601 定义的本地时间格式,后跟
@和 IANA Timezone,如00:01:00@Etc/UTC
-
XML 架构第 2 部分定义的格式:数据类型 文档,如
-
日期字符串:遵循日期字符串的格式,后跟T和时间字符串,如2012-12-25T11:00:00Z -
duration string:遵循 XQuery 1.0 和 XPath 2.0 Data Model 中定义的天数和时间持续时间,如P1Y2M
- 日期(从 中)- 使用日期
从转换为日期值。表 4.3. 参数
参数 类型 格式 from字符串日期字符串示例
date( "2012-12-25" ) - date( "2012-12-24" ) = duration( "P1D" )
- 日期(从 中)- 使用日期和时间
从转换为日期值,并将时间组件设置为 null。表 4.4. 参数
参数 类型 from日期和时间示例
date(date and time( "2012-12-25T11:00:00Z" )) = date( "2012-12-25" )
- 日期(年、月、日)
生成指定年份、月份和日期值
的日期。表 4.5. 参数
参数 类型 yearnumbermonthnumberdaynumber示例
date( 2012, 12, 25 ) = date( "2012-12-25" )
- 日期和时间(日期、时间 )
从指定
日期生成日期和时间,并忽略任何时间和指定时间。表 4.6. 参数
参数 类型 date日期和时间timetime示例
date and time ( "2012-12-24T23:59:00" ) = date and time(date( "2012-12-24" ), time( "23:59:00" ))
- 日期和时间(从 )
从指定字符串生成
日期和时间。表 4.7. 参数
参数 类型 格式 from字符串日期字符串示例
date and time( "2012-12-24T23:59:00" ) + duration( "PT1M" ) = date and time( "2012-12-25T00:00:00" )
- time( from )
从指定字符串生成一个
时间。表 4.8. 参数
参数 类型 格式 from字符串时间字符串示例
time( "23:59:00z" ) + duration( "PT2M" ) = time( "00:01:00@Etc/UTC" )
- time( from )
从指定参数生成一个
时间,并忽略任何日期组件。表 4.9. 参数
参数 类型 from时间或日期和时间示例
time(date and time( "2012-12-25T11:00:00Z" )) = time( "11:00:00Z" )
- 时间(小时、分钟、第二个、偏移?)
从指定小时、分钟和第二个组件值生成时间。
表 4.10. 参数
参数 类型 hournumberminutenumbersecondnumberoffset(可选)天和时间持续时间或 null示例
time( "23:59:00z" ) = time(23, 59, 0, duration( "PT0H" ))
- (来自、分组分隔符、十进制分隔符)
使用指定的分隔符
从转换为数字。表 4.11. 参数
参数 类型 from代表有效数字的字符串
分组分隔符空格()、comma(
、)、period(.)或 null十进制分隔符与
分组分隔符相同,但值无法匹配示例
number( "1 000,0", " ", "," ) = number( "1,000.0", ",", "." )
- string( from )
提供指定参数的字符串表示。
表 4.12. 参数
参数 类型 from非 null 值
例子
string( 1.1 ) = "1.1" string( null ) = null
- duration( from )
从天和持续时间值转换为数年和月内的时间值。表 4.13. 参数
参数 类型 格式 from字符串duration string例子
date and time( "2012-12-24T23:59:00" ) - date and time( "2012-12-22T03:45:00" ) = duration( "P2DT20H14M" ) duration( "P2Y2M" ) = duration( "P26M" )
- 多年和月度(从 到 )
计算两个指定参数之间的
年和月时间。表 4.14. 参数
参数 类型 from日期和时间至日期和时间示例
years and months duration( date( "2011-12-22" ), date( "2013-08-24" ) ) = duration( "P1Y8M" )
4.3.2.2. 布尔值功能
以下功能支持布尔值操作。
- not( negand )
执行
negand运算对象的逻辑命名。表 4.15. 参数
参数 类型 negand布尔值例子
not( true ) = false not( null ) = null
4.3.2.3. 字符串功能
以下功能支持字符串操作。
在 FEEL 中,Unicode 字符根据其代码点进行计算。
- substring(字符串、开始位置、长度?)
返回指定长度开始位置的子字符串。第一个字符位于位置值
1。表 4.16. 参数
参数 类型 字符串字符串开始位置number长度(可选)number例子
substring( "testing",3 ) = "sting" substring( "testing",3,3 ) = "sti" substring( "testing", -2, 1 ) = "n" substring( "\U01F40Eab", 2 ) = "ab"
注意在 FEEL 中,字符串字面上的
"\U01F40Eab"是sHistoryLimitab字符串(horse 符号后跟 和b)。
- string length( string )
计算指定字符串的长度。
表 4.17. 参数
参数 类型 字符串字符串例子
string length( "tes" ) = 3 string length( "\U01F40Eab" ) = 3
- 大写(字符串 )
生成指定字符串的大写版本。
表 4.18. 参数
参数 类型 字符串字符串示例
upper case( "aBc4" ) = "ABC4"
- 小写(字符串 )
生成指定字符串的小写版本。
表 4.19. 参数
参数 类型 字符串字符串示例
lower case( "aBc4" ) = "abc4"
- 子字符串前面(字符串,匹配 )
计算匹配项前的子字符串。
表 4.20. 参数
参数 类型 字符串字符串匹配字符串例子
substring before( "testing", "ing" ) = "test" substring before( "testing", "xyz" ) = ""
- 子字符串之后(字符串,匹配 )
计算匹配项后的子字符串。
表 4.21. 参数
参数 类型 字符串字符串匹配字符串例子
substring after( "testing", "test" ) = "ing" substring after( "", "a" ) = ""
- replace(输入、模式、替换、标志?)
计算正则表达式替换。
表 4.22. 参数
参数 类型 输入字符串pattern字符串替换字符串标记(可选)字符串注意此函数使用 XQuery 1.0 和 XPath 2.0 Functions 和 Operator 中定义的正则表达式参数。
示例
replace( "abcd", "(ab)|(a)", "[1=$1][2=$2]" ) = "[1=ab][2=]cd"
- contains(字符串,匹配)
如果字符串包含匹配项,则返回
true。表 4.23. 参数
参数 类型 字符串字符串匹配字符串示例
contains( "testing", "to" ) = false
- 以 (字符串)开头,匹配 .
如果字符串以匹配项开头,则返回
true表 4.24. 参数
参数 类型 字符串字符串匹配字符串示例
starts with( "testing", "te" ) = true
- 结束为 (字符串,匹配 )
如果字符串以匹配项结尾,则返回
true。表 4.25. 参数
参数 类型 字符串字符串匹配字符串示例
ends with( "testing", "g" ) = true
- 匹配(输入、模式、标志?)
如果输入与正则表达式匹配,则返回
true。表 4.26. 参数
参数 类型 输入字符串pattern字符串标记(可选)字符串注意此函数使用 XQuery 1.0 和 XPath 2.0 Functions 和 Operator 中定义的正则表达式参数。
示例
matches( "teeesting", "^te*sting" ) = true
- split( string, delimiter )
返回原始字符串的列表,并将其分成分隔符正则表达式模式。
表 4.27. 参数
参数 类型 字符串字符串delimiter正则表达式模式匹配
字符串注意此函数使用 XQuery 1.0 和 XPath 2.0 Functions 和 Operator 中定义的正则表达式参数。
例子
split( "John Doe", "\\s" ) = ["John", "Doe"] split( "a;b;c;;", ";" ) = ["a","b","c","",""]
4.3.2.4. 列出功能
以下功能支持列表操作。
在 FEEL 中,列表中的第一个元素的索引是 1。列表中最后一个元素的索引可以识别为 -1。
- 列表包含(list, 元素)
如果列表包含元素,则返回
true。表 4.28. 参数
参数 类型 listlist元素任何类型,包括 null
示例
list contains( [1,2,3], 2 ) = true
- count( list )
计算列表中的元素。
表 4.29. 参数
参数 类型 listlist例子
count( [1,2,3] ) = 3 count( [] ) = 0 count( [1,[2,3]] ) = 2
- min( list )
返回列表中的最低可组合元素。
表 4.30. 参数
参数 类型 listlist其他签名
min( e1, e2, ..., eN )
例子
min( [1,2,3] ) = 1 min( 1 ) = 1 min( [1] ) = 1
- max( list )
返回列表中的最大可组合元素。
表 4.31. 参数
参数 类型 listlist其他签名
max( e1, e2, ..., eN )
例子
max( 1,2,3 ) = 3 max( [] ) = null
- sum( list )
返回列表中数字的总和。
表 4.32. 参数
参数 类型 list数字元素列表其他签名
sum( n1, n2, ..., nN )
例子
sum( [1,2,3] ) = 6 sum( 1,2,3 ) = 6 sum( 1 ) = 1 sum( [] ) = null
- 平均(列表 )
计算列表中元素的平均平均值(通常平均值)。
表 4.33. 参数
参数 类型 list数字元素列表其他签名
mean( n1, n2, ..., nN )
例子
mean( [1,2,3] ) = 2 mean( 1,2,3 ) = 2 mean( 1 ) = 1 mean( [] ) = null
- all( list )
如果列表中的所有元素都为
true,则返回 true。表 4.34. 参数
参数 类型 list布尔值元素列表其他签名
all( b1, b2, ..., bN )
例子
all( [false,null,true] ) = false all( true ) = true all( [true] ) = true all( [] ) = true all( 0 ) = null
- any( list )
如果列表中任何元素为
true,则返回 true。表 4.35. 参数
参数 类型 list布尔值元素列表其他签名
any( b1, b2, ..., bN )
例子
any( [false,null,true] ) = true any( false ) = false any( [] ) = false any( 0 ) = null
- 子列表(列表、开始位置、长度?)
返回起始位置的子列表,限制为长度元素。
表 4.36. 参数
参数 类型 listlist开始位置number长度(可选)number示例
sublist( [4,5,6], 1, 2 ) = [4,5]
- append( list, item )
创建附加到项目或项目的列表。
表 4.37. 参数
参数 类型 listlist项任何类型
示例
append( [1], 2, 3 ) = [1,2,3]
- concatenate( list )
创建作为串联列表的结果的列表。
表 4.38. 参数
参数 类型 listlist示例
concatenate( [1,2],[3] ) = [1,2,3]
- 插入 before(list, position, newItem)
创建一个带有
newItem在指定位置插入的列表。表 4.39. 参数
参数 类型 listlist位置numbernewItem任何类型
示例
insert before( [1,3],1,2 ) = [2,1,3]
- 删除(列表,位置 )
创建一个包含指定位置排除的元素的列表。
表 4.40. 参数
参数 类型 listlist位置number示例
remove( [1,2,3], 2 ) = [1,3]
- 反向(列出 )
返回反向列表。
表 4.41. 参数
参数 类型 listlist示例
reverse( [1,2,3] ) = [3,2,1]
- (列表的索引,匹配 )
返回与 元素匹配的索引。
参数
-
类型列表 -
与任何类型匹配
表 4.42. 参数
参数 类型 listlist匹配任何类型
示例
index of( [1,2,3,2],2 ) = [2,4]
-
- union( list )
返回多个列表中所有元素的列表,并排除重复项。
表 4.43. 参数
参数 类型 listlist示例
union( [1,2],[2,3] ) = [1,2,3]
- 不同的值(列出)
返回单个列表中的元素列表,并排除重复项。
表 4.44. 参数
参数 类型 listlist示例
distinct values( [1,2,3,2,1] ) = [1,2,3]
- flatten( list )
返回扁平化列表。
表 4.45. 参数
参数 类型 listlist示例
flatten( [[1,2],[[3]], 4] ) = [1,2,3,4]
- product( list )
返回列表中数字的产品。
表 4.46. 参数
参数 类型 list数字元素列表其他签名
product( n1, n2, ..., nN )
例子
product( [2, 3, 4] ) = 24 product( 2, 3, 4 ) = 24
- median( list )
返回列表中数字的介质。如果元素的数量是奇数,则结果是中间元素。如果元素数量甚至是,则结果是两个中间元素的平均。
表 4.47. 参数
参数 类型 list数字元素列表其他签名
median( n1, n2, ..., nN )
例子
median( 8, 2, 5, 3, 4 ) = 4 median( [6, 1, 2, 3] ) = 2.5 median( [ ] ) = null
- stddev( list )
返回列表中数字的标准偏差。
表 4.48. 参数
参数 类型 list数字元素列表其他签名
stddev( n1, n2, ..., nN )
例子
stddev( 2, 4, 7, 5 ) = 2.081665999466132735282297706979931 stddev( [47] ) = null stddev( 47 ) = null stddev( [ ] ) = null
- mode( list )
返回列表中数字的模式。如果返回多个元素,则数字以升序排序。
表 4.49. 参数
参数 类型 list数字元素列表其他签名
mode( n1, n2, ..., nN )
例子
mode( 6, 3, 9, 6, 6 ) = [6] mode( [6, 1, 9, 6, 1] ) = [1, 6] mode( [ ] ) = [ ]
4.3.2.4.1. 循环语句
loop 语句可以转换列表或验证某些元素是否满足特定条件:
- for in (list)
迭代列表的元素。
表 4.50. 参数
参数 类型 list任何元素列表例子
for i in [1, 2, 3] return i * i = [1, 4, 9] for i in [1,2,3], j in [1,2,3] return i*j = [1, 2, 3, 2, 4, 6, 3, 6, 9]
- 有些 in (list)满足(条件)
如果列表中的任何元素满足条件,则返回单个布尔值(true 或 false)。
表 4.51. 参数
参数 类型 list任何元素列表条件布尔值表达式被评估为 true 或 false
例子
some i in [1, 2, 3] satisfies i > 3 = true some i in [1, 2, 3] satisfies i > 4 = false
- 每个 in (list)满足(条件)
如果列表中的每个元素满足条件,则返回单个布尔值(true 或 false)。
表 4.52. 参数
参数 类型 list任何元素列表条件布尔值表达式被评估为 true 或 false
例子
every i in [1, 2, 3] satisfies i > 1 = false every i in [1, 2, 3] satisfies i > 0 = true
4.3.2.5. 数字功能
以下功能支持数字操作。
- decimal( n, scale )
返回具有指定缩放的数字。
表 4.53. 参数
参数 类型 nnumberscale范围
[leveloffset6111.6176]范围中的数字注意这个功能被实施为与
FEEL:number定义相一致,用于十进制十进制数字到最接近的十进制数。例子
decimal( 1/3, 2 ) = .33 decimal( 1.5, 0 ) = 2 decimal( 2.5, 0 ) = 2 decimal( 1.035, 2 ) = 1.04 decimal( 1.045, 2 ) = 1.04 decimal( 1.055, 2 ) = 1.06 decimal( 1.065, 2 ) = 1.06
- floor( n )
返回小于或等于指定数字的最大整数。
表 4.54. 参数
参数 类型 nnumber例子
floor( 1.5 ) = 1 floor( -1.5 ) = -2
- ceiling( n )
返回大于或等于指定数字的最小整数。
表 4.55. 参数
参数 类型 nnumber例子
ceiling( 1.5 ) = 2 ceiling( -1.5 ) = -1
- abs( n )
返回绝对值。
表 4.56. 参数
参数 类型 n、天和时间持续时间、年和月的时间例子
abs( 10 ) = 10 abs( -10 ) = 10 abs( @"PT5H" ) = @"PT5H" abs( @"-PT5H" ) = @"PT5H"
- modulo( dividend, divisor )
返回除形器的划分的剩余部分。如果划分或 divisor 是负的,则结果是与 divisor 相同的符号。
注意此函数也表示为 modul
o(dividend, divisor)= 划分 - divisor*floor(dividen d/divisor)。表 4.57. 参数
参数 类型 划分numberdivisornumber例子
modulo( 12, 5 ) = 2 modulo( -12,5 )= 3 modulo( 12,-5 )= -3 modulo( -12,-5 )= -2 modulo( 10.1, 4.5 )= 1.1 modulo( -10.1, 4.5 )= 3.4 modulo( 10.1, -4.5 )= -3.4 modulo( -10.1, -4.5 )= -1.1
- sqrt( number )
返回指定编号的方括号。
表 4.58. 参数
参数 类型 nnumber示例
sqrt( 16 ) = 4
- log( number )
返回指定数量的日志变化。
表 4.59. 参数
参数 类型 nnumber示例
decimal( log( 10 ), 2 ) = 2.30
- exp( number )
返回 Euler
的数字提升至指定数目的电源。表 4.60. 参数
参数 类型 nnumber示例
decimal( exp( 5 ), 2 ) = 148.41
- odd( number )
如果指定的数字为奇数,则返回
true。表 4.61. 参数
参数 类型 nnumber例子
odd( 5 ) = true odd( 2 ) = false
- even( number )
如果指定号甚至是
true,则返回 true。表 4.62. 参数
参数 类型 nnumber例子
even( 5 ) = false even ( 2 ) = true
4.3.2.6. 日期和时间功能
以下功能支持日期和时间操作。
- is( value1, value2 )
如果两个值都为 FEEL 语义域中的相同元素,则返回
true。表 4.63. 参数
参数 类型 value1任何类型
value2任何类型
例子
is( date( "2012-12-25" ), time( "23:00:50" ) ) = false is( date( "2012-12-25" ), date( "2012-12-25" ) ) = true is( time( "23:00:50z" ), time( "23:00:50" ) ) = false
4.3.2.7. 范围功能
以下功能支持时序订购操作,以建立单个计算值和此类值范围之间的关系。这些功能与 Health Level Seven(HL7)国际 质量语言(CQL)1.4 语法中 的组件类似。
- before( )
当一个元素
A之前,并且满足评估到true的相关要求时,返回true。签名
-
before( point1 point2 ) -
在点范围 之前。) -
before(范围点) -
before( range1,range2 )
评估对
true的要求-
point1 < point2 -
点 < range.start or(point = range.start and not(range.start)) -
range.end < point or(range.end = point, not(range.end)) -
range1.end < range2.start or or(not(range1.end included)or not(range2.start included)和 range1.end = range2.start)
例子
before( 1, 10 ) = true before( 10, 1 ) = false before( 1, [1..10] ) = false before( 1, (1..10] ) = true before( 1, [5..10] ) = true before( [1..10], 10 ) = false before( [1..10), 10 ) = true before( [1..10], 15 ) = true before( [1..10], [15..20] ) = true before( [1..10], [10..20] ) = false before( [1..10), [10..20] ) = true before( [1..10], (10..20] ) = true
-
- after( )
当元素
A在元素B之后并且满足评估为true的相关要求时,返回true。签名
-
之后(点1点2) -
后(点范围 ) -
在完成范围后,请点 . -
after( range1 range2 )
评估对
true的要求-
point1 > point2 -
point > range.end or(point = range.end, not(range.end)) -
range.start > point or(range.start = point, not(range.start included)) -
range1.start > range2.end or((not(range1.start included)or not(range2.end)和 range1.start = range2.end)
例子
after( 10, 5 ) = true after( 5, 10 ) = false after( 12, [1..10] ) = true after( 10, [1..10) ) = true after( 10, [1..10] ) = false after( [11..20], 12 ) = false after( [11..20], 10 ) = true after( (11..20], 11 ) = true after( [11..20], 11 ) = false after( [11..20], [1..10] ) = true after( [1..10], [11..20] ) = false after( [11..20], [1..11) ) = true after( (11..20], [1..11] ) = true
-
- meets( )
当元素
A满足一个元素B以及满足评估为true的相关要求时,返回true。签名
-
meets( range1, range2 )
评估对
true的要求-
range1.end included 和 range2.start 包括和范围1.end = range2.start
例子
meets( [1..5], [5..10] ) = true meets( [1..5), [5..10] ) = false meets( [1..5], (5..10] ) = false meets( [1..5], [6..10] ) = false
-
- met by( )
当一个元素
A满足元素B以及满足评估到true的相关要求时,返回true。签名
-
因(范围1、范围2)满足.
评估对
true的要求-
range1.start included 和 range2.end 包括和 range1.start = range2.end
例子
met by( [5..10], [1..5] ) = true met by( [5..10], [1..5) ) = false met by( (5..10], [1..5] ) = false met by( [6..10], [1..5] ) = false
-
- overlaps( )
当元素
A重叠一个元素B以及满足评估到true的相关要求时,返回true。签名
-
overlaps( range1, range2 )
评估对
true的要求-
(范围1.end > range2.start 或(range1.end = range2.start and(range1.end included))和 (范围1.start < range2.end or(range1.start =2.end, and range1.start = range1.start included and range2.end included)
例子
overlaps( [1..5], [3..8] ) = true overlaps( [3..8], [1..5] ) = true overlaps( [1..8], [3..5] ) = true overlaps( [3..5], [1..8] ) = true overlaps( [1..5], [6..8] ) = false overlaps( [6..8], [1..5] ) = false overlaps( [1..5], [5..8] ) = true overlaps( [1..5], (5..8] ) = false overlaps( [1..5), [5..8] ) = false overlaps( [1..5), (5..8] ) = false overlaps( [5..8], [1..5] ) = true overlaps( (5..8], [1..5] ) = false overlaps( [5..8], [1..5) ) = false overlaps( (5..8], [1..5) ) = false
-
- overlaps before( )
当元素
A在元素B之前以及满足评估为true的相关要求时,返回true。签名
-
overlaps before( range1 range2 )
评估对
true的要求-
( range1.start < range2.start or(range1.start = range2.start and range1.start included)and range2.start included)和 (范围1.end > range2.start or(range1.end = range2.start and range1.end included)和 range2.start included)和 (1.end < range2.end or(range1.end = range2.end = range2.end = range2.end)或 2.start included)和 .
例子
overlaps before( [1..5], [3..8] ) = true overlaps before( [1..5], [6..8] ) = false overlaps before( [1..5], [5..8] ) = true overlaps before( [1..5], (5..8] ) = false overlaps before( [1..5), [5..8] ) = false overlaps before( [1..5), (1..5] ) = true overlaps before( [1..5], (1..5] ) = true overlaps before( [1..5), [1..5] ) = false overlaps before( [1..5], [1..5] ) = false
-
- overlaps after( )
当元素
A在元素B之后以及满足评估为true的相关要求时,返回true。签名
-
overlaps after( range1 range2 )
评估对
true的要求-
(范围2.start 或范围2.start = range1.start 和 range2.start(包括范围2.start included)和 (范围1.start included)和 (范围2.end > range1.start or(range2.end = range1.start and range2.end included)和范围1.start included)和 (范围2.end < range1.end or(range2.end = 1 和(range2.end = 1end)或包括范围)
例子
overlaps after( [3..8], [1..5] )= true overlaps after( [6..8], [1..5] )= false overlaps after( [5..8], [1..5] )= true overlaps after( (5..8], [1..5] )= false overlaps after( [5..8], [1..5) )= false overlaps after( (1..5], [1..5) )= true overlaps after( (1..5], [1..5] )= true overlaps after( [1..5], [1..5) )= false overlaps after( [1..5], [1..5] )= false overlaps after( (1..5), [1..5] )= false overlaps after( (1..5], [1..6] )= false overlaps after( (1..5], (1..5] )= false overlaps after( (1..5], [2..5] )= false
-
- finishes( )
当一个元素
A完成一个元素B以及满足评估为true的相关要求时,返回true。签名
-
完成(点,范围 ) -
完成(range1, range2)
评估对
true的要求-
range.end included 和 range.end = point -
range1.end included = range2.end = range1.end = range2.end, and(range1.start > range2.start or(range1.start = range2.start,)或 range2.start included)或 range2.start included)
例子
finishes( 10, [1..10] ) = true finishes( 10, [1..10) ) = false finishes( [5..10], [1..10] ) = true finishes( [5..10), [1..10] ) = false finishes( [5..10), [1..10) ) = true finishes( [1..10], [1..10] ) = true finishes( (1..10], [1..10] ) = true
-
- 完成于。)
当一个元素
A完成一个元素B以及满足评估为true的相关要求时,返回true。签名
-
由 (范围结束,请点 ) -
完成按(范围1范围2)
评估对
true的要求-
range.end included 和 range.end = point -
range1.end included = range2.end = range1.end = range2.end,(range1.start < range2.start or(range1.start = range2.start and(range1.start included or not(range2.start))
例子
finished by( [1..10], 10 ) = true finished by( [1..10), 10 ) = false finished by( [1..10], [5..10] ) = true finished by( [1..10], [5..10) ) = false finished by( [1..10), [5..10) ) = true finished by( [1..10], [1..10] ) = true finished by( [1..10], (1..10] ) = true
-
- includes( )
当一个元素
A包含一个元素B以及满足评估为true的相关要求时,返回true。签名
-
includes(range, point) -
includes(range1, range2)
评估对
true的要求-
(range.start < point 和 range.end > point)或(range.start = point and range.start included)或(range.end = point.end included) -
(范围1.start < range2.start 或(range1.start = range2.start and(range1.start included))和 (范围1.end > range2.end or(range1.end = range2.end = range2.end = range2.end, orrange1.end included))
例子
includes( [1..10], 5 ) = true includes( [1..10], 12 ) = false includes( [1..10], 1 ) = true includes( [1..10], 10 ) = true includes( (1..10], 1 ) = false includes( [1..10), 10 ) = false includes( [1..10], [4..6] ) = true includes( [1..10], [1..5] ) = true includes( (1..10], (1..5] ) = true includes( [1..10], (1..10) ) = true includes( [1..10), [5..10) ) = true includes( [1..10], [1..10) ) = true includes( [1..10], (1..10] ) = true includes( [1..10], [1..10] ) = true
-
- during( )
当元素
A在元素B期间并且满足评估为true的相关要求时,返回true。签名
-
在(点中,范围) -
during( range1 range2 )
评估对
true的要求-
(range.start < point 和 range.end > point)或(range.start = point and range.start included)或(range.end = point.end included) -
(range2.end > range1.start or(range2.start = range1.start and(range2.start included))和(包括range1.start included)和 (范围2.end > range1.end or(range2.end = range1.end = range1.end and(range2.end included)))
例子
during( 5, [1..10] ) = true during( 12, [1..10] ) = false during( 1, [1..10] ) = true during( 10, [1..10] ) = true during( 1, (1..10] ) = false during( 10, [1..10) ) = false during( [4..6], [1..10] ) = true during( [1..5], [1..10] ) = true during( (1..5], (1..10] ) = true during( (1..10), [1..10] ) = true during( [5..10), [1..10) ) = true during( [1..10), [1..10] ) = true during( (1..10], [1..10] ) = true during( [1..10], [1..10] ) = true
-
- starts( )
当一个元素
A启动一个元素B以及满足评估为true的相关要求时,返回true。签名
-
开始(点,范围 ) -
starts( range1, range2 )
评估对
true的要求-
range.start = 点和范围.start 包括 -
range1.start = range2.start 和 range1.start included = range2.start includes and(range1.end < range2.end or(range1.end = range2.end, not(range1.end included)或 range2.end included)
例子
starts( 1, [1..10] ) = true starts( 1, (1..10] ) = false starts( 2, [1..10] ) = false starts( [1..5], [1..10] ) = true starts( (1..5], (1..10] ) = true starts( (1..5], [1..10] ) = false starts( [1..5], (1..10] ) = false starts( [1..10], [1..10] ) = true starts( [1..10), [1..10] ) = true starts( (1..10), (1..10) ) = true
-
- 通过 启动()
当一个元素
A由元素B启动,同时满足评估为true的相关要求时,返回true。签名
-
由范围启动(范围,点 ) -
由范围1、范围2启动.
评估对
true的要求-
range.start = 点和范围.start 包括 -
range1.start = range2.start 和 range1.start included = range2.start includes and(range2.end < range1.end = range1.end = range1.end, not(range2.end included)或 range1.end included)
例子
started by( [1..10], 1 ) = true started by( (1..10], 1 ) = false started by( [1..10], 2 ) = false started by( [1..10], [1..5] ) = true started by( (1..10], (1..5] ) = true started by( [1..10], (1..5] ) = false started by( (1..10], [1..5] ) = false started by( [1..10], [1..10] ) = true started by( [1..10], [1..10) ) = true started by( (1..10), (1..10) ) = true
-
- coincides( )
当一个元素与元素
B在一起以及满足评估为true的相关要求时,返回true。签名
-
coincides(1, point2) -
coincides( range1, range2 )
评估对
true的要求-
point1 = point2 -
range1.start = range2.start 和 range1.start included = range2.start includes and range1.end = range2.end = included = range2.end = included
例子
coincides( 5, 5 ) = true coincides( 3, 4 ) = false coincides( [1..5], [1..5] ) = true coincides( (1..5), [1..5] ) = false coincides( [1..5], [2..6] ) = false
-
4.3.2.8. 临时功能
以下功能支持一般的临时操作。
- 年天(日期 )
返回本年度当天的 Gregorian 编号。
表 4.64. 参数
参数 类型 date日期和时间示例
day of year( date(2019, 9, 17) ) = 260
- 星期几(日期 )
返回星期几:"
Monday"、、"Tuesday""Wednesday"、"Thursday"、"Friday"、"Saturday"或"Sunday"。表 4.65. 参数
参数 类型 date日期和时间示例
day of week( date(2019, 9, 17) ) = "Tuesday"
- 年月(日期 )
返回一年的 Gregorian:
"January","February","March","April","May","June","July","August","September","October", "vember", "vember","December".表 4.66. 参数
参数 类型 date日期和时间示例
month of year( date(2019, 9, 17) ) = "September"
- 年月(日期 )
返回 ISO 8601 所定义年的 Gregorian 周。
表 4.67. 参数
参数 类型 date日期和时间例子
week of year( date(2019, 9, 17) ) = 38 week of year( date(2003, 12, 29) ) = 1 week of year( date(2004, 1, 4) ) = 1 week of year( date(2005, 1, 1) ) = 53 week of year( date(2005, 1, 3) ) = 1 week of year( date(2005, 1, 9) ) = 1
4.3.2.9. 排序功能
以下功能支持排序操作。
- sort(列表,在前面)
返回同一元素的列表,但根据排序函数排序。
表 4.68. 参数
参数 类型 listlist前function示例
sort( list: [3,1,4,5,2], precedes: function(x,y) x < y ) = [1,2,3,4,5]
4.3.2.10. 上下文功能
以下功能支持上下文操作。
- get value( m, key )
从指定条目键的上下文返回值。
表 4.69. 参数
参数 类型 mcontextkey字符串例子
get value( {key1 : "value1"}, "key1" ) = "value1" get value( {key1 : "value1"}, "unexistent-key" ) = null- get entries( m )
为指定上下文返回键值对列表。
表 4.70. 参数
参数 类型 mcontext示例
get entries( {key1 : "value1", key2 : "value2"} ) = [ { key : "key1", value : "value1" }, {key : "key2", value : "value2"} ]
4.3.3. FEEL 中的变量和功能名称
与许多传统的表达式语言不同,Friendly Enough Expression Language(FEEL)支持空格和几个特殊字符,作为变量和功能名称的一部分。FEEL 名称必须以 字母 ? 或 _ 元素开头。还允许使用 unicode 字母字符。变量名称不能以语言关键字开头,如 和、true 或 每个。变量名称中的剩余字符可以是起始字符的任意字符,以及 数字、空格和特殊字符,如 +、--、/、、*、' 和 。
例如,以下名称是所有有效的 FEEL 名称:
- age
- 十三日期
- 动态 234 预检查过程
FEEL 中的变量和功能名称有几个限制:
- 不确定性
-
使用空格、关键字和其他特殊字符,因为名称的一部分可使 FEEL 模糊。在表达式的上下文中解决了混淆,与从左到右的顺序匹配名称。解析器解析变量名称,作为范围中匹配最长的名称。如果需要,您可以使用
()来混淆名称。 - 名称中的空格
DMN 规格限制在 FEEL 名称中使用空格。根据 DMN 规格,名称可以包含多个空格,但不能包含两个连续的空格。
为了便于使用语言并避免由于空格导致的常见错误,红帽决策管理器消除了连续使用空间的限制。Red Hat Decision Manager 支持变量名,包含任意数量的连续空格,但将其规范化为单一空间。例如,Red Hat Decision Manager 中可以接受一个空格和第一个
名称(带有两个空格)的名字。Red Hat Decision Manager 还规范化了使用其它空格,如网页、标签页和换行符中的不可破的空白。从 Red Hat Decision Manager FEEL 引擎视角,所有这些字符在处理前被规范化为一个空白。
中的关键字-
中的关键字是语言中唯一不能用作变量名称一部分的关键字。虽然规格允许在变量名称中间使用关键字,但变量名称中的用法与 的 getmmar 定义(每个和某些表达式结构)冲突。