10. 表达语言(FEEL)
10.1. 介绍
在 DMN 中,所有的 decision logic 都是用 boxed expression 展现的。Clause 7.2 介绍了 boxed
expression 的概念并且定义了两个简单类:boxed literal expressions 和 boxed invacations。
Clause 8 中定义的 decision tables 就是一种非常重要的 boxed expression。此章节通过定义其
他种类的 boxed expression,完善了 decision logic 的图形符号(graphical notation)。
Box 中的表达式都是 FEEL 表达式。FEEL 是 Friendly Enough Expression Language 的缩写,
具有以下特点:
没有副作用
简单的数据模型(通过 numbers, dates, strings, lists, contexts 搭建)
大众化的语法设计
基于 SQL 和 PMML 的三值逻辑(true,false,null)
此章节完整的规范了 FEEL 的语法和语义。语法被指定为 grammar (10.3.1)。一部分为了
被展现成 boxed expression 的语法被指定为 meta-model (10.5)。
在 DMN 中,FEEL 扮演了两个角色:
1.1 Boxed expression(比如 decision table)中的文字符号
1.2 作为一个稍大的语言来展现表达式和 DRG 的逻辑,为了统一简单的表达语义
10.2. 符号
10.2.1. Boxed Expressions
此章节是建立在 decision logic 和 boxed expressions(clause 7.2)的一般符号之上。
我们把一个 decision logic 的图形符号定义为 boxed expressions。这个符号可以将 decision logic
模型分解成能和 DRG artifacts 关联的小模块。DRG 加上来自完善的图形化的语言的 boxed
expressions 共同定义了 decision models.
一个 boxed expression 是
一个 decision table,
一个 boxed FEEL expression,
一个 boxed invocation,
一个 boxed context,
一个 boxed list,
一个 relation, 或者
一个 boxed function.
Boxed expressions是被循环的定义的,也就是,boxed expressions可以包含其他的
boxed expressions。顶层的boxed expression对应了一个DRG artifact的decision logic。
这个boxed expression必须包含一个name box,其中含有对应DRG artifact的名字。
Name box可以被附加在一个Box的顶部,如图38:
图38:Boxed expression
或者,可以用虚线来连接name box和expression box,如图39:
图 39:Name box 和 expression box 分离的 Boxed expression
Name 是DRG元素和decision logic元素之间唯一的联系。图形化工具是用来支持图形化联系
的,比如,点击一个decision shape可以打开一个decision table。
10.2.1.1. Decision tables
这里的可执行的 decision table 和 Clause 8 中定义的 decision table 使用相同的符号。执行语
义在 Clause 10.3.2.7 中定义了。
10.2.1.2. Boxed FEEL expression
Boxed Feel expression 是在表单元格中的 FEEL 表达式 e,(定义在 Clause 10.3.1),如图 40:
图 40:Boxed Feel expression
一个包含 e 的 boxed expression 的意义是 FEEL(e, s),s 是范围。这个范围包括了 DRD 推导出
的 context(见 10.4)和任何包含 e 的 boxed context。
实际操作中,我们会用一个相对简单的 e,然后通过小的 boxed expression 组合成较大的 boxed
expression。
10.2.1.3. Boxed Invocation
Boxed invation 的语法的定义在 Clause 7.2.3。次语法可以用在调用各种函数(比如:
business knowledge model, FEEL builtin function, boxed function definition)。
标有“invoked business knowledge model”的 box 可以是任何值是函数的 boxed
expression,如图 41:
图 41:Boxed invocation
这个盒子化的语法(boxed syntax)对应了文本语法(定义在 grammar rules 40, 41, 42, 43)。
Boxed invocation 使 用 了 named parameters 。 包 含 positional invocation 文 本 的 Boxed
expression 可以实现 Positional invocation。
这个盒子化的语法(boxed syntax)需要至少一个参数。没有参数的函数必须通过文本语法
调用,比如:
Boxed invovation 的 正 规 意 义 是 通 过 等 价 的 文 本 invocaiton 的 语 义 给 出 的 , 比 如 :
function-valued expression(parameter: binding expression, parameter: binding
expression, …)。
10.2.1.4. Boxed Context
Boxed context 是 n 个(name,value)组合的集合,选择性的可以有一个 result value。每个
组合是一个 context entry。Context entry 可以通过空格分开,用虚线来连接(在顶部或者左
侧)。这样通过看纵向 context 的左侧边缘或者看横向 context 的顶部边缘就可以轻松的分辨
出所有的 entry。 单元格必须按一下方式排列(图 42,43):
图 42:纵向 context
图 43:横向 context
Context 中的 context entry 常用于把复杂的 expression 分解成多个较简单的 expression,每
个分解后的 expression 都有命名。可以把这些 context entry 当做中间结果。比如,没有最终
结果的 box 可以用来展现案例数据(图 44)。
图 44:context entry 的用途
有最终结果的 box 用来展现计算过程(图 45)。
图 45:最终结果 box 的使用
当 decision table 是(没结果)的 context entry,输出单元格可以用来命名 entry,从而节省空
间。任何格式的 decision table (format decision table???)都可以用在纵向 context。右
侧边缘不用对齐。Context entry 之间可以用空格隔开。
图 46:有 decision table entry 的纵向 context
建议使用不同颜色。
Name 必须是合法的 FEEL name。 Value 和 result 都是 boxed expression。
Boxed context 可以把 decision table 作为 result, 是命名好的 context entry 计算输入并给输入
命名。例(图 47):
图 47:有 decision table 的 boxed expression 的用法
如果没有 result,Boxed context 的意义是{ “Name 1”: Value 1, “Name 2”: Value 2, …,
“Name n”: Value n }。如果有,则是{ “Name 1”: Value 1, “Name 2”: Value 2, …, “Name
n”: Value n, “result”: Result }.result。粗体代表了都是 FEEL 语义定义域里的元素。范
围包括了 containing DRG 推导出的 context(见 10.4)。
10.2.1.5. Boxed List
Boxed list 是 n 个 item 的列表。单元格必须按一下方式排列(图 48,49)。
图 48:纵向列表
图 49:横向列表
线的样式是标准的。Item 是 boxed expression。Boxed list 的意义和 list 的意义相同:[ Item 1,
Item 2, …, Item n ]。范围包括了 containing DRG 推导出的 context(见 10.4)。
10.2.1.6. Relation
一个同类 context(没有 result 单元格)的纵列表可以被显示成如图 50,名字只在列表顶部
出现一次,像关系表一样。
图 50:Relation
10.2.1.7. Boxed Function
关联一个 Business Knowledge Model 的 boxed expression 必须是一个 boxed function。
一个 boxed function 有 3 个单元格:
1. Kind,包含了以下其中之一的首字母:
FEEL
PMML
Java
在 Feel Function 中,包括 decision table,Kind box 可以被省略。
2. Parameters:0 个或以上逗号隔开的 name,在圆括号内。
3. Body:一个 boxed expression
这 3 个单元格必须按一下方式排列,图 51:
图 51:Boxed function
在 FEEL function 中,Body 是一个应用了 parameter 的 expression。在外部定义的 function 中,
Body 是一个 context(见 10.3.2.10.2)。
如果 Kind 是 FEEL, Boxed function 的意义和 function 的意义相同:FEEL(function(Parameter1,
Parameter2, …) Body),如果是其他:FEEL(function(Parameter1, Parameter2, …) external
Body)。范围包括了 containing DRG 推导出的 context(见 10.4)。
10.2.2. FEEL
下一章中定义的一部分 FEEL 是为了 boxed expression 服务的。FEEL 扩展了 JSON 对象。一个
JSON 对象是一个 number,一个 string,一个 context(JSON 中称作 maps)或者是一个 JSON
对象的列表。FEEL 添加了 date,time 和 duration 对象,函数,对于文本值更友好的语法,
并且不需要引用 context key。(does not require the context keys to be quoted???)
我们从几个简单的例子开始接触这个语言。
10.2.2.1. range 的比较
range 和 range 列表会出现在 decision table 的 test 单元格。在表 27 中,这部分语法都用了粗
体显示。
表 27:FEEL range 比较
FEEL
Expression
5 in <=5
5 in (5..10]
5 in [5..10]
5 in [ 4,5,6 ]
Value
true
false
true
true
5 in [ <5,>5 ]
false
也可以比较 String。但 Date,time 和 duration 只有在被命名后(变成 context entry 后)才能
进行比较。例如,假设如下 context entry:
Christmas 2012: date("2012-12-25"),
New Year's Eve 2012: date("2012-12-31"),
Valentine's Day 2013: date("2013-02-14"),
下面的表达式为 true: