# 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

函数所在分组,用于在表达式编辑器的函数列表中把函数显示在合适的分组中,已有的分组包括:

  1. analysis - 分析函数
  2. aggregate - 聚集函数
  3. string - 字符串函数
  4. math - 数学函数
  5. date - 日期函数
  6. logic - 逻辑函数
  7. transform - 转换函数
  8. others - 其他函数

如有需要可输入任意分组。

# arguments

函数的参数列表,表示函数可以接受哪些参数,如果没有此定义,那么函数可以接受任意参数,参数列表是一个json数组,可以定义如下属性:

  1. name 参数名
  2. description 参数描述
  3. type 参数的类型,可选项类似returnType
  4. optional 为true表示参数是可选参数,如find('test','es',1),第三个参数就可以不传,find('test','es'),表示从0开始查找。
  5. repeatable 为true表示参数可以重复,如caoncat函数,其参数可以重复输入多个,如caoncat('a')caoncat('a','b','c')caoncat('a','b')……。

# argumentsCount

函数的参数个数,-1表示是不限个数但至少有一个,0表示无参数。不定义时根据arguments中的信息自动判断参数个数。

# returnType

函数的返回值类型。函数的返回类型可以通过此属性明确定义,也可以来自某个参数的类型,见returnArgType,也可以是动态判断的,见checkArgsFunc

如果要明确指定,那么可以配置此参数为下列值之一:

  1. 'C' - 字符型
  2. 'N' - 浮点型
  3. 'I' - 整形
  4. 'D' - 日期型
  5. 'L' - 布尔型
  6. 'R' - 数组
  7. '*' - 变体,匹配任意类型

# returnArgType

函数的返回值类型与某个参数的类型一致。只有当returnType没有定义时,此参数才有效。

将此属性设置为对应参数在参数列表中的序号,从0开始。

# expTemplate

表示使用系统其他标准的函数来组装这个自定义函数。系统虽然提供了很多函数,在某些特定场景下也可以满足需要,但是写法可能不是那么业务化,此时可以利用系统已有的函数定义一些比较常用的、业务化的、场景化的函数,方便用户使用。

如果能使用函数组合完成扩展函数需求,那么可以直接配置expTemplate,这样就不需要做其他的函数脚本开发了,系统会自动适配各种运行环境。

示例:

  1. 从文本中解析身份证号码,参数是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}')
    
  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}')
    
  3. 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)
    

说明:

  1. 模版中可以通过引用arguments中定义的参数的name来引用函数的参数。

# sqlTemplate

定义此函数"翻译"为数据库查询语言时使用的模版。

如果函数需要转换到SQL查询语言中在数据库中执行,那么需要配置此参数。此属性是一个JSON对象,key是数据库扩展的名字,见数据库连接器扩展,如MySQL, Oracle, OceanBase, OpenGauss...。SQL模版的格式类似数据库连接器扩展中函数模版的格式,见数据库扩展点配置选项

说明:

  1. 由于不同的数据库执行的SQL会有不同,所以需要针对不同的连接器分别定义,可以考虑按需定义。
  2. 如果自定义函数不需要在DB中执行,那么不需要定义此属性。
  3. 如果是通过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接口。

是否有帮助?
0条评论
评论