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+INFNaN。FEEL 使用 null 来代表无效的数字。

Red Hat Decision Manager 扩展 DMN 规格并支持额外的数字标记:

  • Scientific: 您可以使用带有后缀 e<exp>E<exp> 的科学标记。例如,1.2e3 与编写表达式 1.2*10**3 相同,但是一个字面上的值,而不是表达式。
  • 十六进制 : 您可以使用带有前缀 0x 的十六进制数字。例如: 0xff 与十进制数字 255 相同。支持大写字母和小写字母。例如: 0XFF0xff 相同。
  • 类型后缀: 您可以使用类型后缀 fFdDlL。这些后缀会被忽略。
字符串

FEEL 中的字符串是任意字符序列,用双引号括起。

示例

"John Doe"
Copy to Clipboard Toggle word wrap

布尔值
FEEL 使用三值布尔逻辑,因此布尔值逻辑表达式可以有 truefalsenull 的值。
日期

FEEL 不支持日期字面量,但您可以使用内置的 date() 函数来构造日期值。FEEL 中的日期字符串遵循 XML 架构部分 2: Datatypes 文档中定义的格式。格式为 "YYYY-MM-DD",其中 YYYY 是包含四位数字的年份,MM 是带有两个数字的月份数,DD 是当天的数目。

例如:

date( "2017-06-23" )
Copy to Clipboard Toggle word wrap

日期对象的时间等于 "00:00:00",即午夜。日期被视为本地,不带时区。

Time

FEEL 不支持时间字面量,但您可以使用内置的 time() 函数来构造时间值。FEEL 中的时间字符串遵循 XML 架构部分 2: Datatypes 文档中定义的格式。格式为 " hh:mm:ss[.uu][(+-)h:mm]",h 是一天的小时数(从 0023),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" )
Copy to Clipboard Toggle word wrap

定义偏移或时区的时间值不能与未定义偏移或时区的本地时间进行比较。

日期和时间

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" )
Copy to Clipboard Toggle word wrap

定义偏移或时区的日期和时间值不能与未定义偏移或时区的本地日期和时间值进行比较。

重要

如果您的 DMN 规格的实现不支持 XML 架构中的空格,请使用关键字 dateTime 作为 日期和时间的同步

天数和时间持续时间

FEEL 不支持天和持续时间字面量,但您可以使用内置的 duration() 函数来构造天数和持续时间值。FEEL 中的天数和持续时间字符串遵循 XML 架构第 2 部分定义 的格式,但仅限于天、小时和秒。不支持数月和年时间。

示例:

duration( "P1DT23H12M30S" )
duration( "P23D" )
duration( "PT12H" )
duration( "PT35M" )
Copy to Clipboard Toggle word wrap
重要

如果您的 DMN 规格的实现不支持 XML 架构中的空格,请使用关键字 dayTimeDuration 作为 天数 和持续时间的同步

多年和月的时间

FEEL 不支持多年和月的字面量,但您可以使用内置的 duration() 函数来构造天数和持续时间值。FEEL 中的年和月字符串遵循 XML 架构第 2 部分定义的格式:数据类型 文档,但仅限于数年和月。不支持天、小时、分钟或秒。

示例:

duration( "P3Y5M" )
duration( "P2Y" )
duration( "P10M" )
duration( "P25M" )
Copy to Clipboard Toggle word wrap
重要

如果您的 DMN 规格的实现在 XML 模式中不支持空格,使用关键字 yearMonthDuration 作为年份 和月的时间

Functions

FEEL 具有 功能 文字(或匿名功能),可用于创建功能。DMN 规格目前不提供将变量声明为 功能 的一个明确方法,但红帽决策管理器扩展了 DMN 内置类型来支持功能变量。

例如:

function(a, b) a + b
Copy to Clipboard Toggle word wrap

在这个示例中,FEEL 表达式会创建一个功能,添加参数 ab,并返回结果。

上下文

FEEL 具有 上下文 文字,可用于创建上下文。FEEL 中的 上下文是 键值对列表,类似于 Java 等语言映射。DMN 规格目前不提供将变量声明为 上下文 的显式方式,但红帽决策管理器扩展了 DMN 内置类型来支持上下文变量。

例如:

{ x : 5, y : 3 }
Copy to Clipboard Toggle word wrap

在本例中,表达式会创建一个包含两个条目( xy )的上下文,代表 chart 中的协调。

在 DMN 1.2 中,创建上下文的另一个方法是创建包含键列表作为属性的项定义,然后将变量声明为具有项目定义类型。

Red Hat Decision Manager DMN API 以两种方式表示,在 DMNContext 中支持 DMN ItemDefinition structural 类型:

  • 用户定义的 Java 类型:Must 是定义属性的有效 JavaBeans 对象,为 DMN ItemDefinition 中的每个组件的 getters。如果需要,您也可以将 @FEELProperty 注释用于代表一个组件名称(这会导致无效的 Java 标识符)的 getter。
  • java.util.Map 接口:映射需要定义适当的条目,其键对应于 DMN ItemDefinition 中的组件名称。
范围(或间隔)

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
Copy to Clipboard Toggle word wrap

端点的表达式必须返回可比较的值,并且较低绑定端点必须小于上限的端点。

例如,以下字面表达式定义了 110 之间的间隔,包括边界(两个端点上的关闭间隔):

[ 1 .. 10 ]
Copy to Clipboard Toggle word wrap

以下字面表达式定义了 1 小时和 12 小时之间的间隔,其中包括下限(关闭间隔),但排除了上限(打开的时间间隔):

[ duration("PT1H") .. duration("PT12H") )
Copy to Clipboard Toggle word wrap

您可以使用决策表中的范围来测试值范围,或者在简单字面表达式中使用范围。例如,如果变量 x 的值介于 0100 之间,则以下字面表达式返回 true

x in [ 1 .. 100 ]
Copy to Clipboard Toggle word wrap
列表

FEEL 具有 列表 文字,可用于创建项目列表。FEEL 中的 列表 由以方括号括起的值列表来表示。DMN 规格目前不提供将变量声明为 列表 ()的显式方式,但 Red Hat Decision Manager 会将 DMN 内置类型扩展为支持列表变量。

例如:

[ 2, 3, 4, 5 ]
Copy to Clipboard Toggle word wrap

FEEL 中的所有列表都包含同一类型的元素,且不可变。列表中的元素可以通过索引来访问,其中第一个元素为 1。负索引可以访问从列表末尾开始的元素,以便 -1 是最后一个元素。

例如,以下表达式返回列表 x 的第二个元素:

x[2]
Copy to Clipboard Toggle word wrap

以下表达式返回列表 x 的 second-to-last 元素:

x[-2]
Copy to Clipboard Toggle word wrap

列表中的元素也可以按函数 数计算,后者将元素列表用作参数。

例如,以下表达式返回 4

count([ 2, 3, 4, 5 ])
Copy to Clipboard Toggle word wrap

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. 转换功能

以下功能支持在不同类型值之间进行转换。其中一些功能使用特定的字符串格式,如下例所示:

日期(从 中)- 使用日期

转换为 日期 值。

Expand
表 4.3. 参数
参数类型格式

from

字符串

日期字符串

示例

date( "2012-12-25" ) - date( "2012-12-24" ) = duration( "P1D" )
Copy to Clipboard Toggle word wrap

日期(从 中)- 使用日期和时间

转换为 日期 值,并将时间组件设置为 null。

Expand
表 4.4. 参数
参数类型

from

日期和时间

示例

date(date and time( "2012-12-25T11:00:00Z" )) = date( "2012-12-25" )
Copy to Clipboard Toggle word wrap

日期(年、月、日)

生成指定年份、月份和日期值 的日期

Expand
表 4.5. 参数
参数类型

year

number

month

number

day

number

示例

date( 2012, 12, 25 ) = date( "2012-12-25" )
Copy to Clipboard Toggle word wrap

日期和时间(日期、时间 )

从指定 日期 生成日期和时间,并忽略任何时间和指定时间。

Expand
表 4.6. 参数
参数类型

date

日期和时间

time

time

示例

date and time ( "2012-12-24T23:59:00" ) = date and time(date( "2012-12-24" ), time( "23:59:00" ))
Copy to Clipboard Toggle word wrap

日期和时间(从 )

从指定字符串生成 日期和时间

Expand
表 4.7. 参数
参数类型格式

from

字符串

日期字符串

示例

date and time( "2012-12-24T23:59:00" ) + duration( "PT1M" ) = date and time( "2012-12-25T00:00:00" )
Copy to Clipboard Toggle word wrap

time( from )

从指定字符串生成一个 时间

Expand
表 4.8. 参数
参数类型格式

from

字符串

时间字符串

示例

time( "23:59:00z" ) + duration( "PT2M" ) = time( "00:01:00@Etc/UTC" )
Copy to Clipboard Toggle word wrap

time( from )

从指定参数生成一个 时间,并忽略任何日期组件。

Expand
表 4.9. 参数
参数类型

from

时间日期和时间

示例

time(date and time( "2012-12-25T11:00:00Z" )) = time( "11:00:00Z" )
Copy to Clipboard Toggle word wrap

时间(小时、分钟、第二个、偏移?)

从指定小时、分钟和第二个组件值生成时间。

Expand
表 4.10. 参数
参数类型

hour

number

minute

number

second

number

offset (可选)

天和时间持续时间 或 null

示例

time( "23:59:00z" ) = time(23, 59, 0, duration( "PT0H" ))
Copy to Clipboard Toggle word wrap

(来自、分组分隔符、十进制分隔符)

使用指定的分隔符 转换为 数字

Expand
表 4.11. 参数
参数类型

from

代表有效数字的字符串

分组分隔符

空格()、comma()、period(.)或 null

十进制分隔符

分组分隔符 相同,但值无法匹配

示例

number( "1 000,0", " ", "," ) = number( "1,000.0", ",", "." )
Copy to Clipboard Toggle word wrap

string( from )

提供指定参数的字符串表示。

Expand
表 4.12. 参数
参数类型

from

非 null 值

例子

string( 1.1 ) = "1.1"
string( null ) = null
Copy to Clipboard Toggle word wrap

duration( from )

天和持续时间 值转换为 数年和月内的时间 值。

Expand
表 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" )
Copy to Clipboard Toggle word wrap

多年和月度(从 到 )

计算两个指定参数之间的 年和月时间

Expand
表 4.14. 参数
参数类型

from

日期和时间

日期和时间

示例

years and months duration( date( "2011-12-22" ), date( "2013-08-24" ) ) = duration( "P1Y8M" )
Copy to Clipboard Toggle word wrap

4.3.2.2. 布尔值功能

以下功能支持布尔值操作。

not( negand )

执行 negand 运算对象的逻辑命名。

Expand
表 4.15. 参数
参数类型

negand

布尔值

例子

not( true ) = false
not( null ) = null
Copy to Clipboard Toggle word wrap

4.3.2.3. 字符串功能

以下功能支持字符串操作。

注意

在 FEEL 中,Unicode 字符根据其代码点进行计算。

substring(字符串、开始位置、长度?)

返回指定长度开始位置的子字符串。第一个字符位于位置值 1

Expand
表 4.16. 参数
参数类型

字符串

字符串

开始位置

number

长度 (可选)

number

例子

substring( "testing",3 ) = "sting"
substring( "testing",3,3 ) = "sti"
substring( "testing", -2, 1 ) = "n"
substring( "\U01F40Eab", 2 ) = "ab"
Copy to Clipboard Toggle word wrap

注意

在 FEEL 中,字符串字面上的 "\U01F40Eab"sHistoryLimitab 字符串(horse 符号后跟 和 b)。

string length( string )

计算指定字符串的长度。

Expand
表 4.17. 参数
参数类型

字符串

字符串

例子

string length( "tes" ) = 3
string length( "\U01F40Eab" ) = 3
Copy to Clipboard Toggle word wrap

大写(字符串 )

生成指定字符串的大写版本。

Expand
表 4.18. 参数
参数类型

字符串

字符串

示例

upper case( "aBc4" ) = "ABC4"
Copy to Clipboard Toggle word wrap

小写(字符串 )

生成指定字符串的小写版本。

Expand
表 4.19. 参数
参数类型

字符串

字符串

示例

lower case( "aBc4" ) = "abc4"
Copy to Clipboard Toggle word wrap

子字符串前面(字符串,匹配 )

计算匹配项前的子字符串。

Expand
表 4.20. 参数
参数类型

字符串

字符串

匹配

字符串

例子

substring before( "testing", "ing" ) = "test"
substring before( "testing", "xyz" ) = ""
Copy to Clipboard Toggle word wrap

子字符串之后(字符串,匹配 )

计算匹配项后的子字符串。

Expand
表 4.21. 参数
参数类型

字符串

字符串

匹配

字符串

例子

substring after( "testing", "test" ) = "ing"
substring after( "", "a" ) = ""
Copy to Clipboard Toggle word wrap

replace(输入、模式、替换、标志?)

计算正则表达式替换。

Expand
表 4.22. 参数
参数类型

输入

字符串

pattern

字符串

替换

字符串

标记 (可选)

字符串

注意

此函数使用 XQuery 1.0 和 XPath 2.0 Functions 和 Operator 中定义的正则表达式参数。

示例

replace( "abcd", "(ab)|(a)", "[1=$1][2=$2]" ) = "[1=ab][2=]cd"
Copy to Clipboard Toggle word wrap

contains(字符串,匹配)

如果字符串包含匹配项,则返回 true

Expand
表 4.23. 参数
参数类型

字符串

字符串

匹配

字符串

示例

contains( "testing", "to" ) = false
Copy to Clipboard Toggle word wrap

以 (字符串)开头,匹配 .

如果字符串以匹配项开头,则返回 true

Expand
表 4.24. 参数
参数类型

字符串

字符串

匹配

字符串

示例

starts with( "testing", "te" ) = true
Copy to Clipboard Toggle word wrap

结束为 (字符串,匹配 )

如果字符串以匹配项结尾,则返回 true

Expand
表 4.25. 参数
参数类型

字符串

字符串

匹配

字符串

示例

ends with( "testing", "g" ) = true
Copy to Clipboard Toggle word wrap

匹配(输入、模式、标志?)

如果输入与正则表达式匹配,则返回 true

Expand
表 4.26. 参数
参数类型

输入

字符串

pattern

字符串

标记 (可选)

字符串

注意

此函数使用 XQuery 1.0 和 XPath 2.0 Functions 和 Operator 中定义的正则表达式参数。

示例

matches( "teeesting", "^te*sting" ) = true
Copy to Clipboard Toggle word wrap

split( string, delimiter )

返回原始字符串的列表,并将其分成分隔符正则表达式模式。

Expand
表 4.27. 参数
参数类型

字符串

字符串

delimiter

正则表达式模式匹配 字符串

注意

此函数使用 XQuery 1.0 和 XPath 2.0 Functions 和 Operator 中定义的正则表达式参数。

例子

split( "John Doe", "\\s" ) = ["John", "Doe"]
split( "a;b;c;;", ";" ) = ["a","b","c","",""]
Copy to Clipboard Toggle word wrap

4.3.2.4. 列出功能

以下功能支持列表操作。

注意

在 FEEL 中,列表中的第一个元素的索引是 1。列表中最后一个元素的索引可以识别为 -1

列表包含(list, 元素)

如果列表包含元素,则返回 true

Expand
表 4.28. 参数
参数类型

list

list

元素

任何类型,包括 null

示例

list contains( [1,2,3], 2 ) = true
Copy to Clipboard Toggle word wrap

count( list )

计算列表中的元素。

Expand
表 4.29. 参数
参数类型

list

list

例子

count( [1,2,3] ) = 3
count( [] ) = 0
count( [1,[2,3]] ) = 2
Copy to Clipboard Toggle word wrap

min( list )

返回列表中的最低可组合元素。

Expand
表 4.30. 参数
参数类型

list

list

其他签名

min( e1, e2, ..., eN )
Copy to Clipboard Toggle word wrap

例子

min( [1,2,3] ) = 1
min( 1 ) = 1
min( [1] ) = 1
Copy to Clipboard Toggle word wrap

max( list )

返回列表中的最大可组合元素。

Expand
表 4.31. 参数
参数类型

list

list

其他签名

max( e1, e2, ..., eN )
Copy to Clipboard Toggle word wrap

例子

max( 1,2,3 ) = 3
max( [] ) = null
Copy to Clipboard Toggle word wrap

sum( list )

返回列表中数字的总和。

Expand
表 4.32. 参数
参数类型

list

数字 元素 列表

其他签名

sum( n1, n2, ..., nN )
Copy to Clipboard Toggle word wrap

例子

sum( [1,2,3] ) = 6
sum( 1,2,3 ) = 6
sum( 1 ) = 1
sum( [] ) = null
Copy to Clipboard Toggle word wrap

平均(列表 )

计算列表中元素的平均平均值(通常平均值)。

Expand
表 4.33. 参数
参数类型

list

数字 元素 列表

其他签名

mean( n1, n2, ..., nN )
Copy to Clipboard Toggle word wrap

例子

mean( [1,2,3] ) = 2
mean( 1,2,3 ) = 2
mean( 1 ) = 1
mean( [] ) = null
Copy to Clipboard Toggle word wrap

all( list )

如果列表中的所有元素都为 true,则返回 true。

Expand
表 4.34. 参数
参数类型

list

布尔值 元素 列表

其他签名

all( b1, b2, ..., bN )
Copy to Clipboard Toggle word wrap

例子

all( [false,null,true] ) = false
all( true ) = true
all( [true] ) = true
all( [] ) = true
all( 0 ) = null
Copy to Clipboard Toggle word wrap

any( list )

如果列表中任何元素为 true,则返回 true。

Expand
表 4.35. 参数
参数类型

list

布尔值 元素 列表

其他签名

any( b1, b2, ..., bN )
Copy to Clipboard Toggle word wrap

例子

any( [false,null,true] ) = true
any( false ) = false
any( [] ) = false
any( 0 ) = null
Copy to Clipboard Toggle word wrap

子列表(列表、开始位置、长度?)

返回起始位置的子列表,限制为长度元素。

Expand
表 4.36. 参数
参数类型

list

list

开始位置

number

长度 (可选)

number

示例

sublist( [4,5,6], 1, 2 ) = [4,5]
Copy to Clipboard Toggle word wrap

append( list, item )

创建附加到项目或项目的列表。

Expand
表 4.37. 参数
参数类型

list

list

任何类型

示例

append( [1], 2, 3 ) = [1,2,3]
Copy to Clipboard Toggle word wrap

concatenate( list )

创建作为串联列表的结果的列表。

Expand
表 4.38. 参数
参数类型

list

list

示例

concatenate( [1,2],[3] ) = [1,2,3]
Copy to Clipboard Toggle word wrap

插入 before(list, position, newItem)

创建一个带有 newItem 在指定位置插入的列表。

Expand
表 4.39. 参数
参数类型

list

list

位置

number

newItem

任何类型

示例

insert before( [1,3],1,2 ) = [2,1,3]
Copy to Clipboard Toggle word wrap

删除(列表,位置 )

创建一个包含指定位置排除的元素的列表。

Expand
表 4.40. 参数
参数类型

list

list

位置

number

示例

remove( [1,2,3], 2 ) = [1,3]
Copy to Clipboard Toggle word wrap

反向(列出 )

返回反向列表。

Expand
表 4.41. 参数
参数类型

list

list

示例

reverse( [1,2,3] ) = [3,2,1]
Copy to Clipboard Toggle word wrap

(列表的索引,匹配 )

返回与 元素匹配的索引。

参数

  • 类型列表
  • 与任何类型匹配
Expand
表 4.42. 参数
参数类型

list

list

匹配

任何类型

示例

index of( [1,2,3,2],2 ) = [2,4]
Copy to Clipboard Toggle word wrap

union( list )

返回多个列表中所有元素的列表,并排除重复项。

Expand
表 4.43. 参数
参数类型

list

list

示例

union( [1,2],[2,3] ) = [1,2,3]
Copy to Clipboard Toggle word wrap

不同的值(列出)

返回单个列表中的元素列表,并排除重复项。

Expand
表 4.44. 参数
参数类型

list

list

示例

distinct values( [1,2,3,2,1] ) = [1,2,3]
Copy to Clipboard Toggle word wrap

flatten( list )

返回扁平化列表。

Expand
表 4.45. 参数
参数类型

list

list

示例

flatten( [[1,2],[[3]], 4] ) = [1,2,3,4]
Copy to Clipboard Toggle word wrap

product( list )

返回列表中数字的产品。

Expand
表 4.46. 参数
参数类型

list

数字 元素 列表

其他签名

product( n1, n2, ..., nN )
Copy to Clipboard Toggle word wrap

例子

product( [2, 3, 4] ) = 24
product( 2, 3, 4 ) = 24
Copy to Clipboard Toggle word wrap

median( list )

返回列表中数字的介质。如果元素的数量是奇数,则结果是中间元素。如果元素数量甚至是,则结果是两个中间元素的平均。

Expand
表 4.47. 参数
参数类型

list

数字 元素 列表

其他签名

median( n1, n2, ..., nN )
Copy to Clipboard Toggle word wrap

例子

median( 8, 2, 5, 3, 4 ) = 4
median( [6, 1, 2, 3] ) = 2.5
median( [ ] ) = null
Copy to Clipboard Toggle word wrap

stddev( list )

返回列表中数字的标准偏差。

Expand
表 4.48. 参数
参数类型

list

数字 元素 列表

其他签名

stddev( n1, n2, ..., nN )
Copy to Clipboard Toggle word wrap

例子

stddev( 2, 4, 7, 5 ) = 2.081665999466132735282297706979931
stddev( [47] ) = null
stddev( 47 ) = null
stddev( [ ] ) = null
Copy to Clipboard Toggle word wrap

mode( list )

返回列表中数字的模式。如果返回多个元素,则数字以升序排序。

Expand
表 4.49. 参数
参数类型

list

数字 元素 列表

其他签名

mode( n1, n2, ..., nN )
Copy to Clipboard Toggle word wrap

例子

mode( 6, 3, 9, 6, 6 ) = [6]
mode( [6, 1, 9, 6, 1] ) = [1, 6]
mode( [ ] ) = [ ]
Copy to Clipboard Toggle word wrap

4.3.2.4.1. 循环语句

loop 语句可以转换列表或验证某些元素是否满足特定条件:

for in (list)

迭代列表的元素。

Expand
表 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]
Copy to Clipboard Toggle word wrap

有些 in (list)满足(条件)

如果列表中的任何元素满足条件,则返回单个布尔值(true 或 false)。

Expand
表 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
Copy to Clipboard Toggle word wrap

每个 in (list)满足(条件)

如果列表中的每个元素满足条件,则返回单个布尔值(true 或 false)。

Expand
表 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
Copy to Clipboard Toggle word wrap

4.3.2.5. 数字功能

以下功能支持数字操作。

decimal( n, scale )

返回具有指定缩放的数字。

Expand
表 4.53. 参数
参数类型

n

number

scale

范围 [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
Copy to Clipboard Toggle word wrap

floor( n )

返回小于或等于指定数字的最大整数。

Expand
表 4.54. 参数
参数类型

n

number

例子

floor( 1.5 ) = 1
floor( -1.5 ) = -2
Copy to Clipboard Toggle word wrap

ceiling( n )

返回大于或等于指定数字的最小整数。

Expand
表 4.55. 参数
参数类型

n

number

例子

ceiling( 1.5 ) = 2
ceiling( -1.5 ) = -1
Copy to Clipboard Toggle word wrap

abs( n )

返回绝对值。

Expand
表 4.56. 参数
参数类型

n

天和时间持续时间年和月的时间

例子

abs( 10 ) = 10
abs( -10 ) = 10
abs( @"PT5H" ) = @"PT5H"
abs( @"-PT5H" ) = @"PT5H"
Copy to Clipboard Toggle word wrap

modulo( dividend, divisor )

返回除形器的划分的剩余部分。如果划分或 divisor 是负的,则结果是与 divisor 相同的符号。

注意

此函数也表示为 modul o(dividend, divisor)= 划分 - divisor*floor(dividen d/divisor)

Expand
表 4.57. 参数
参数类型

划分

number

divisor

number

例子

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
Copy to Clipboard Toggle word wrap

sqrt( number )

返回指定编号的方括号。

Expand
表 4.58. 参数
参数类型

n

number

示例

sqrt( 16 ) = 4
Copy to Clipboard Toggle word wrap

log( number )

返回指定数量的日志变化。

Expand
表 4.59. 参数
参数类型

n

number

示例

decimal( log( 10 ), 2 ) = 2.30
Copy to Clipboard Toggle word wrap

exp( number )

返回 Euler 的数字 提升至指定数目的电源。

Expand
表 4.60. 参数
参数类型

n

number

示例

decimal( exp( 5 ), 2 ) = 148.41
Copy to Clipboard Toggle word wrap

odd( number )

如果指定的数字为奇数,则返回 true

Expand
表 4.61. 参数
参数类型

n

number

例子

odd( 5 ) = true
odd( 2 ) = false
Copy to Clipboard Toggle word wrap

even( number )

如果指定号甚至是 true,则返回 true。

Expand
表 4.62. 参数
参数类型

n

number

例子

even( 5 ) = false
even ( 2 ) = true
Copy to Clipboard Toggle word wrap

4.3.2.6. 日期和时间功能

以下功能支持日期和时间操作。

is( value1, value2 )

如果两个值都为 FEEL 语义域中的相同元素,则返回 true

Expand
表 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
Copy to Clipboard Toggle word wrap

4.3.2.7. 范围功能

以下功能支持时序订购操作,以建立单个计算值和此类值范围之间的关系。这些功能与 Health Level Seven(HL7)国际 质量语言(CQL)1.4 语法中 的组件类似。

before( )

当一个元素 A 之前,并且满足评估到 true 的相关要求时,返回 true

签名

  1. before( point1 point2 )
  2. 在点范围 之前。)
  3. before(范围点)
  4. before( range1,range2 )

评估对 true的要求

  1. point1 < point2
  2. 点 < range.start or(point = range.start and not(range.start))
  3. range.end < point or(range.end = point, not(range.end))
  4. 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
Copy to Clipboard Toggle word wrap

after( )

当元素 A 在元素 B 之后并且满足评估为 true 的相关要求时,返回 true

签名

  1. 之后(点1点2)
  2. 后(点范围 )
  3. 在完成范围后,请点 .
  4. after( range1 range2 )

评估对 true的要求

  1. point1 > point2
  2. point > range.end or(point = range.end, not(range.end))
  3. range.start > point or(range.start = point, not(range.start included))
  4. 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
Copy to Clipboard Toggle word wrap

meets( )

当元素 A 满足一个元素 B 以及满足评估为 true 的相关要求时,返回 true

签名

  1. meets( range1, range2 )

评估对 true的要求

  1. 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
Copy to Clipboard Toggle word wrap

met by( )

当一个元素 A 满足元素 B 以及满足评估到 true 的相关要求时,返回 true

签名

  1. 因(范围1、范围2)满足.

评估对 true的要求

  1. 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
Copy to Clipboard Toggle word wrap

overlaps( )

当元素 A 重叠一个元素 B 以及满足评估到 true 的相关要求时,返回 true

签名

  1. overlaps( range1, range2 )

评估对 true的要求

  1. (范围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
Copy to Clipboard Toggle word wrap

overlaps before( )

当元素 A 在元素 B 之前以及满足评估为 true 的相关要求时,返回 true

签名

  1. overlaps before( range1 range2 )

评估对 true的要求

  1. ( 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
Copy to Clipboard Toggle word wrap

overlaps after( )

当元素 A 在元素 B 之后以及满足评估为 true 的相关要求时,返回 true

签名

  1. overlaps after( range1 range2 )

评估对 true的要求

  1. (范围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
Copy to Clipboard Toggle word wrap

finishes( )

当一个元素 A 完成一个元素 B 以及满足评估为 true 的相关要求时,返回 true

签名

  1. 完成(点,范围 )
  2. 完成(range1, range2)

评估对 true的要求

  1. range.end included 和 range.end = point
  2. 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
Copy to Clipboard Toggle word wrap

完成于。)

当一个元素 A 完成一个元素 B 以及满足评估为 true 的相关要求时,返回 true

签名

  1. 由 (范围结束,请点 )
  2. 完成按(范围1范围2)

评估对 true的要求

  1. range.end included 和 range.end = point
  2. 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
Copy to Clipboard Toggle word wrap

includes( )

当一个元素 A 包含一个元素 B 以及满足评估为 true 的相关要求时,返回 true

签名

  1. includes(range, point)
  2. includes(range1, range2)

评估对 true的要求

  1. (range.start < point 和 range.end > point)或(range.start = point and range.start included)或(range.end = point.end included)
  2. (范围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
Copy to Clipboard Toggle word wrap

during( )

当元素 A 在元素 B 期间并且满足评估为 true 的相关要求时,返回 true

签名

  1. 在(点中,范围)
  2. during( range1 range2 )

评估对 true的要求

  1. (range.start < point 和 range.end > point)或(range.start = point and range.start included)或(range.end = point.end included)
  2. (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
Copy to Clipboard Toggle word wrap

starts( )

当一个元素 A 启动一个元素 B 以及满足评估为 true 的相关要求时,返回 true

签名

  1. 开始(点,范围 )
  2. starts( range1, range2 )

评估对 true的要求

  1. range.start = 点和范围.start 包括
  2. 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
Copy to Clipboard Toggle word wrap

通过 启动()

当一个元素 A 由元素 B 启动,同时满足评估为 true 的相关要求时,返回 true

签名

  1. 由范围启动(范围,点 )
  2. 由范围1、范围2启动.

评估对 true的要求

  1. range.start = 点和范围.start 包括
  2. 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
Copy to Clipboard Toggle word wrap

coincides( )

当一个元素与元素 B 在一起以及满足评估为 true 的相关要求时,返回 true

签名

  1. coincides(1, point2)
  2. coincides( range1, range2 )

评估对 true的要求

  1. point1 = point2
  2. 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
Copy to Clipboard Toggle word wrap

4.3.2.8. 临时功能

以下功能支持一般的临时操作。

年天(日期 )

返回本年度当天的 Gregorian 编号。

Expand
表 4.64. 参数
参数类型

date

日期和时间

示例

day of year( date(2019, 9, 17) ) = 260
Copy to Clipboard Toggle word wrap

星期几(日期 )

返回星期几:" Monday"、"Tuesday" "Wednesday""Thursday""Friday""Saturday""Sunday"

Expand
表 4.65. 参数
参数类型

date

日期和时间

示例

day of week( date(2019, 9, 17) ) = "Tuesday"
Copy to Clipboard Toggle word wrap

年月(日期 )

返回一年的 Gregorian: "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "vember" , "vember", "December".

Expand
表 4.66. 参数
参数类型

date

日期和时间

示例

month of year( date(2019, 9, 17) ) = "September"
Copy to Clipboard Toggle word wrap

年月(日期 )

返回 ISO 8601 所定义年的 Gregorian 周。

Expand
表 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
Copy to Clipboard Toggle word wrap

4.3.2.9. 排序功能

以下功能支持排序操作。

sort(列表,在前面)

返回同一元素的列表,但根据排序函数排序。

Expand
表 4.68. 参数
参数类型

list

list

function

示例

sort( list: [3,1,4,5,2], precedes: function(x,y) x < y ) = [1,2,3,4,5]
Copy to Clipboard Toggle word wrap

4.3.2.10. 上下文功能

以下功能支持上下文操作。

get value( m, key )

从指定条目键的上下文返回值。

Expand
表 4.69. 参数
参数类型

m

context

key

字符串

例子

get value( {key1 : "value1"}, "key1" ) = "value1"
get value( {key1 : "value1"}, "unexistent-key" ) = null
Copy to Clipboard Toggle word wrap

get entries( m )

为指定上下文返回键值对列表。

Expand
表 4.70. 参数
参数类型

m

context

示例

get entries( {key1 : "value1", key2 : "value2"} ) = [ { key : "key1", value : "value1" }, {key : "key2", value : "value2"} ]
Copy to Clipboard Toggle word wrap

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 定义(每个某些 表达式结构)冲突。
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat