跳到主要内容

9.1 自定义函数

自定义 Udf 将应用能力提供给 DataQL,适合单个查询函数、业务服务调用和数据转换。脚本通过注册名称直接调用函数。

实现函数​

实现 call(Hints, UdfParams),通过 allParams() 读取脚本实参。下面的函数接收一个字符串并返回问候语。

GreetingUdf.java
package com.example.dataway;

import net.hasor.dataql.domain.Hints;
import net.hasor.dataql.domain.Udf;
import net.hasor.dataql.domain.UdfParams;

public class GreetingUdf implements Udf {
@Override
public Object call(Hints hints, UdfParams params) {
Object[] arguments = params.allParams();
if (arguments.length != 1 || !(arguments[0] instanceof String name)) {
throw new IllegalArgumentException("greeting requires one string argument");
}
return "Hello " + name;
}
}

注册配置​

config 表示应用注册的 DatawayConfig,以下配置在创建 Dataway 前完成。

import com.example.dataway.GreetingUdf;

config.function("greeting", new GreetingUdf());

脚本调用​

return greeting('Dataway');

返回 "Hello Dataway",最终响应由所选结果处理器输出。

使用说明​

Hints 提供本次执行选项,UdfParams 包含按位置排列的实参。函数可返回字符串、数值、集合等 DataQL 支持的值;二进制用法见结果响应。

注册的函数实例可被多个查询使用,应避免在实例字段中保存当前请求数据。需要按命名空间组织多个函数时,使用函数库。

读取执行上下文​

应用可通过 Hint 向 UDF 传递对象,在 call 中用 hints.getHint("app.context") 读取。设置方式见核心接口:Hint。UDF 收到的 Hint 不允许修改键值,其中的对象仍是原引用,使用时需注意共享状态。

Dataway 使用 DATAWAY_REQUEST、DATAWAY_RESPONSE 传递本次请求和响应,执行完成后移除。应用应使用独立的 Hint 名称。Header、Cookie 等脚本操作见 Web 函数库。