# package.json
package.json
文件包含两部分信息:
- 扩展的基本信息,包含扩展名称、描述文字、作者、组件的npm依赖等。npm配置参考npm package.json (opens new window)。
- 组件扩展点的配置,包括组件的类名、分组、模板等。
组件扩展点中包含通用扩展点配置的所有属性,并额外增加了下面的属性,可以配置一个或若干个表达式函数的信息。
{
"contributes": {
"expressionFunction": [{
"name": "<function name>",
"description": "<函数的简短描述>",
"manURL": "<帮助文档,指向一个当前扩展目录下的md文件,如`GENDER.md`>",
"group": "<函数在函数列表中所在的分组,如string, math, others...>"
"arguments": [{
"name": "<参数名>",
"desc": "<参数描述>",
"type": "<参数类型,如C, N...>",
"optional": <参数是否可选>,
"repeatable": <参数是否可重复>
}],
"argumentsCount": <参数个数>,
"returnType" : "<返回类型,如C, N...>",
"returnArgType": <以第几个参数作为返回值类型,0开始>,
"expTemplate": "<表达式模板>",
"sqlTemplate": [{
"MySQL":"<在特定数据库使用的对应的SQL模板>"
}],
"jsScript": "<指定一个相对于当前扩展目录的前端脚本文件>",
"serverScript": "<指定一个相对于当前扩展目录的后端脚本文件>",
"scriptFunc": "<指定表达式在前端浏览器和后端运算时使用的脚本函数的函数名>",
"checkArgsFunc": "<指定一个js函数,用于检查函数参数的正确性>",
"renderSQLFunc": "<用于将表达式函数转换为可以执行的SQL表达式>",
"javaClass": "<指定一个java的实现类>"
},
{
...
}]
}
}
# 表达式函数扩展点配置选项
下面是expressionFunction
扩展点的配置选项。
# name
函数名,通常大写,用于唯一标识一个函数,不能和其他扩展函数或系统函数重名。
# description
函数的一句话简短描述,用于在表达式编辑器的函数列表中简要的提示函数的功能,如:SM3加密函数
。
# manURL
帮助文档,指向一个当前扩展目录下的md文件,如FUNC1.md
,用于在表达式编辑器的函数列表中现实函数的帮助信息,md文件的章节必须符合下面示例的规范(以函数名为FUNC1
为示例):
# **<FUNC1>**
<函数的一段简短的描述,用于快速了解函数的功能>
## 语法
<函数的一个简单的语法表述如`FUNC1(**str**, **start_index**, [**num**])`。>
<下面介绍参数列表:>
* **param1**:参数1的说明
* **param2**:参数2的说明
## 示例
<此处列出一些使用示例>
1. `FUNC1(...)` 示例1说明...
2. `FUNC1(...)` 示例2说明...
3. ...
# group
函数所在分组,用于在表达式编辑器的函数列表中把函数显示在合适的分组中,已有的分组包括:
- analysis - 分析函数
- aggregate - 聚集函数
- string - 字符串函数
- math - 数学函数
- date - 日期函数
- logic - 逻辑函数
- transform - 转换函数
- others - 其他函数
如有需要可输入任意分组。
# arguments
函数的参数列表,表示函数可以接受哪些参数,如果没有此定义,那么函数可以接受任意参数,参数列表是一个json数组,可以定义如下属性:
- name 参数名
- description 参数描述
- type 参数的类型,可选项类似returnType。
- optional 为true表示参数是可选参数,如
find('test','es',1)
,第三个参数就可以不传,find('test','es')
,表示从0开始查找。 - repeatable 为true表示参数可以重复,如
caoncat
函数,其参数可以重复输入多个,如caoncat('a')
、caoncat('a','b','c')
、caoncat('a','b')
……。
# argumentsCount
函数的参数个数,-1表示是不限个数但至少有一个,0表示无参数。不定义时根据arguments中的信息自动判断参数个数。
# returnType
函数的返回值类型。函数的返回类型可以通过此属性明确定义,也可以来自某个参数的类型,见returnArgType,也可以是动态判断的,见checkArgsFunc。
如果要明确指定,那么可以配置此参数为下列值之一:
- 'C' - 字符型
- 'N' - 浮点型
- 'I' - 整形
- 'D' - 日期型
- 'L' - 布尔型
- 'R' - 数组
- '*' - 变体,匹配任意类型
# returnArgType
函数的返回值类型与某个参数的类型一致。只有当returnType没有定义时,此参数才有效。
将此属性设置为对应参数在参数列表中的序号,从0开始。
# expTemplate
表示使用系统其他标准的函数来组装这个自定义函数。系统虽然提供了很多函数,在某些特定场景下也可以满足需要,但是写法可能不是那么业务化,此时可以利用系统已有的函数定义一些比较常用的、业务化的、场景化的函数,方便用户使用。
如果能使用函数组合完成扩展函数需求,那么可以直接配置expTemplate
,这样就不需要做其他的函数脚本开发了,系统会自动适配各种运行环境。
示例:
- 从文本中解析身份证号码,参数是S,函数模版:
REGEXP_EXTRACT(S,'([1-9]\\d{5}(18|19|([23]\\d))\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx])|[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{2}')
- 从文本中解析电话号码,参数是S,函数模版:
REGEXP_EXTRACT(S,'(0\\d{2}-\\d{8}(-\\d{1,4})?)|(0\\d{3}-\\d{7,8}(-\\d{1,4})?)|((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(1[7-8][0,5-9]))\\d{8}')
- 15位身份证号码升级为18位,参数是P,函数模版:
IF(LEN(P)=15,CONCAT(MID(P,0,6),'19',MID(P,6,9),MID('10X98765432',((MID(P,0,1)*7+MID(P,1,1)*9+MID(P,2,1)*10+MID(P,3,1)*5+MID(P,4,1)*8+MID(P,5,1)*4+1*2+9*1+MID(P,6,1)*6+MID(P,7,1)*3+MID(P,8,1)*7+MID(P,9,1)*9+MID(P,10,1)*10+MID(P,11,1)*5+MID(P,12,1)*8+MID(P,13,1)*4+MID(P,14,1)*2)%11),1)),P)
说明:
- 模版中可以通过引用arguments中定义的参数的
name
来引用函数的参数。
# sqlTemplate
定义此函数"翻译"为数据库查询语言时使用的模版。
如果函数需要转换到SQL查询语言中在数据库中执行,那么需要配置此参数。此属性是一个JSON对象,key是数据库扩展的名字,见数据库连接器扩展,如MySQL
, Oracle
, OceanBase
, OpenGauss
...。SQL模版的格式类似数据库连接器扩展中函数模版的格式,见数据库扩展点配置选项。
说明:
- 由于不同的数据库执行的SQL会有不同,所以需要针对不同的连接器分别定义,可以考虑按需定义。
- 如果自定义函数不需要在DB中执行,那么不需要定义此属性。
- 如果是通过expTemplate配置的函数,那么不需要定义此属性,系统会自动根据模版引用的系统函数翻译SQL。
# jsScript
指定一个相对于当前扩展目录的前端脚本文件,用于提供scriptFunc指定的脚本函数。见脚本开发。
默认main.js
。
# serverScript
指定一个相对于当前扩展目录的后端脚本文件,用于提供scriptFunc指定的脚本函数。见脚本开发。
默认main.action
。
# scriptFunc
指定表达式在前端浏览器和后端运算时使用的脚本函数的函数名。见脚本开发。
# checkArgsFunc
指定一个js函数,用于检查函数参数的正确性。见脚本开发。
# renderSQLFunc
指定一个js函数,用于将表达式函数转换为可以执行的SQL表达式。见脚本开发。
# javaClass
指定一个java实现类。脚本在后端运行时,除了使用脚本开发,也可以选择使用java开发,脚本和java只需要选择一种。提供的java类需要实现com.succez.commons.exp.ExtExpressionFuncContributor
接口。