9.2 函数库
函数库将相关函数放入同一命名空间,脚本通过 import 导入后调用。可使用普通 Java 方法定义函数,也可直接注册 Map<String, Udf>。
实现函数库
继承 AbstractUdfSource,通过 @UdfName 指定脚本中的函数名。示例提供大小写转换。
TextFunctions.java
package com.example.dataway;
import java.util.Locale;
import net.hasor.dataql.host.function.AbstractUdfSource;
import net.hasor.dataql.host.function.UdfName;
public class TextFunctions extends AbstractUdfSource {
@UdfName("upper")
public String upper(String value) {
return value.toUpperCase(Locale.ROOT);
}
@UdfName("lower")
public String lower(String value) {
return value.toLowerCase(Locale.ROOT);
}
}
注册配置
config 表示应用注册的 DatawayConfig,以下配置在创建 Dataway 前完成。
import com.example.dataway.TextFunctions;
config.importSource("app.text", TextFunctions::new);
该实现无请求状态,使用无参构造方法创建。AbstractUdfSource 默认会反射创建方法调用对象。应用配置等数据可直接通过应用对象导入提供给脚本。
脚本调用
import 'app.text' as text;
return {
'upper': text.upper('Dataway'),
'lower': text.lower('Dataway')
};
返回 {"upper":"DATAWAY","lower":"dataway"}。
使用函数 Map
import java.util.Map;
import com.example.dataway.GreetingUdf;
config.library("app.tools", Map.of("greeting", new GreetingUdf()));
import 'app.tools' as tools;
return tools.greeting('Dataway');
GreetingUdf 见自定义函数。library 在配置时复制函数 Map,随后修改原 Map 不会改变注册内容。方法式函数不支持重载,应使用不同函数名。