根据DMN规范,FEEL语言提供了一系列标准的内置函数库,旨在促进决策模型的可移植性和互操作性。这些函数主要分布在转换、布尔、字符串、列表、数值、日期时间及上下文等多个类别中。
以下是DMN内置函数的详细分类详解:
1.转换函数(Conversion Functions)
用于在不同数据类型之间进行转换,特别是将字符串解析为数值或日期时间。
l date(from):将日期字符串或日期时间值转换为日期(忽略时间部分)。
示例:date("2012-12-25")。
l time(from):从字符串、日期时间或具体参数(时、分、秒、偏移量)创建时间。
示例:time("23:59:00z")。
l number(from,grouping,decimal):将字符串转换为数值。需指定分组分隔符和小数点分隔符以处理特定格式(如1000,0)。
l string(from):将非空值(如数值、布尔值)转换为字符串。
l duration(from):将符合ISO8601标准的字符串转换为持续时间。
l range(from):根据规范将范围字符串转换为范围对象。
2.布尔函数(Boolean Functions)
not(negand):逻辑取反。遵循三值逻辑:not(true)为false,not(null)仍为null。
3.字符串函数(String Functions)
用于文本的处理与匹配。
l substring(string,start,length?):从指定位置开始截取长度为$n$的子串。位置为1表示首字符,-1表示最后一个字符。
l string length(string):返回字符串中的字符数或Unicode代码点数量。
l upper case(string)/lowercase(string):进行大小写转换。
l contains(string,match):判断字符串是否包含匹配项。
l start swith/endswith:判断字符串的开头或结尾是否匹配。
l string join(list,delimiter?):将列表中的字符串元素用分隔符连接。
l replace(input,pattern,replacement):使用正则表达式进行模式匹配并替换。
4.列表函数(ListFunctions)
列表函数支持对集合数据的聚合、筛选和转换。
l 聚合函数:
count(list):返回列表的大小,空列表返回0。
min(list)/max(list):返回列表中最小或最大的可比较项。
sum(list):计算数值列表的总和。
mean(list):计算数值列表的算术平均值。
all(list)/any(list):对布尔列表进行逻辑“与”或“或”的聚合。
l 结构操作:
append(list,item...):向列表末尾添加元素。
concatenate(list...):连接多个列表。
distinctvalues(list):去除列表中的重复项。
flatten(list):平整嵌套列表。
reverse(list):翻转列表元素顺序。
sort(list,precedes):使用排序函数对列表进行排序。
l 统计函数:包括stddev(标准差)、mode(众数)和median(中位数)。
5.数值函数(NumericFunctions)
l decimal(n,scale):将数值$n$四舍五入到指定的小数位数。
l floor(n)/ceiling(n):向下或向上取整。
l roundup/rounddown/roundhalfup/roundhalfdown:提供多种细分的舍入模式。
l abs(n):返回绝对值,支持数值、持续时间。
l modulo(dividend,divisor):计算除法的余数。
l sqrt/log/exp:开平方、自然对数(以$e$为底)和指数函数。
6.范围与时间属性函数
l 范围函数:受HL7CQL标准启发,提供before、after、overlaps、includes、during、starts、finishes等函数,用于判断点与范围或范围与范围之间的关系。
l 时间分量获取:
dayofyear、dayofweek、monthofyear、weekofyear。
7.上下文函数(ContextFunctions)
l get value(m,key):从上下文$m$中提取指定键的值。
l get entries(m):将上下文转换为键值对(Key-ValuePair)列表。
l context(entries):从键值对列表创建新的上下文。
l context put(context,key,value):在现有上下文中更新或添加条目。
l context merge(contexts):合并多个上下文,若键冲突则后者覆盖前者。
8.杂项函数(Miscellaneous)
l now():返回当前的日期和时间。
l today():返回当前的日期。
特别注意:B-FEEL的差异
在DMN1.6引入的B-FEEL方言中,为了对业务人员更友好,许多原本在FEEL中返回null(代表错误)的内置函数被修改为返回默认值:
l 数值类:出错时返回0(如sum([]))。
l 布尔类:出错时通常返回false(如matches("badpattern","[0-9"))。
l 字符串类:出错时返回空字符串""(如lowercase(12))。
集合类:出错时返回空集合[]。