dagl 一个简洁的领域特定语言(DSL),用于定义一个有向无环图(DAG)。可以用来描述一个工作流。 编译后的结果可以适用于工作流引擎。
// english dagl is an easy-to-use domain-specific language (DSL) for defining a directed acyclic graph (DAG). It can be used to describe a workflow.
- 字符串
"hello world"
`hello world`
'hello world'
- 数组
[1,2,3]
- 参数对
a=b
- if else
if (a==b) {
a;
}else{
b;
}
- 内置函数
builtin("http", input, endpoint=`http://192002625-146479.Production/suggestion/`,
method=`post`, max_retry_times="3", default_value=`{"actions":[]}`, timeout="800ms");
- 自定义函数
inline func getCacheKey(input) {
builtin("jq",input,filter=`.suggestion_type+"##"+(.filter_retrievers//[]|join("#"))+"##"+(.context//[]|join("#"))+"##"+.query`);
}
- 调用自定义函数
@call(getCacheKey, [input]);
// this is a comment
常量只能在函数外部定义。
- 常量定义
@a=`hello world`;
- 常量引用
call(abc,[],a=@a);
变量只能在函数内部定义。
// a function to get cache key
inline func getCacheKey(input) {
builtin("jq",input,filter=`.suggestion_type+"##"+(.filter_retrievers//[]|join("#"))+"##"+(.context//[]|join("#"))+"##"+.query`);
}
// a function to set cache
inline func setCache(key, result) {
cacheReq=builtin("jq",[key,result],filter=`{"key": .[0], "payload": .[1], "ttl": 259200000}`);
builtin("set_cache", cacheReq, prefix=`ime_rec_bert_ner_v1`);
}
// a function to lookup cache
inline func lookupCache(key){
builtin("lookup_cache", key, prefix=`ime_rec_bert_ner_v1`);
}
func main(input) {
input = builtin("jq", input, filter=`.payload | fromjson`);
key=@call(getCacheKey, [input]);
cacheRes=@call(lookupCache,[key]);
result=builtin("http", input, endpoint=`http://192002625-146479.Production/suggestion/`,
method=`post`, max_retry_times="3", default_value=`{"actions":[]}`, timeout="800ms");
@call(setCache, [key, result]);
cacheMiss=builtin("jq", cacheRes, filter=`.found | not`);
if(cacheMiss){
result;
}else{
builtin("jq", cacheRes, filter=`.payload`);
}
}
// {"payload": "{\"request_id\":\"1674\",\"request_type\":7,\"context\":[],\"context_interval\":[],\"query\":\"红楼梦小姐姐\",\"uid\":\"1674\",\"api_level\":0}"}
dagl is an easy-to-use domain-specific language (DSL) for defining a directed acyclic graph (DAG). It can be used to describe a workflow.
- string
"hello world"
`hello world`
'hello world'
- array
[1,2,3]
- key-value pair
a=b
- if else
if (a==b) {
a;
}else{
b;
}
- builtin function
builtin("http", input, endpoint=`http://192002625-146479.Production/suggestion/`,
method=`post`, max_retry_times="3", default_value=`{"actions":[]}`, timeout="800ms");
- inline function
inline func getCacheKey(input) {
builtin("jq",input,filter=`.suggestion_type+"##"+(.filter_retrievers//[]|join("#"))+"##"+(.context//[]|join("#"))+"##"+.query`);
}
- call inline function
@call(getCacheKey, [input]);
// this is a comment
constant can only be defined outside of function.
- constant definition
@a=`hello world`;
- constant reference
@b=@a;
variable can only be defined inside of function.
// a function to get cache key
inline func getCacheKey(input) {
builtin("jq",input,filter=`.suggestion_type+"##"+(.filter_retrievers//[]|join("#"))+"##"+(.context//[]|join("#"))+"##"+.query`);
}
// a function to set cache
inline func setCache(key, result) {
cacheReq=builtin("jq",[key,result],filter=`{"key": .[0], "payload": .[1], "ttl": 259200000}`);
builtin("set_cache", cacheReq, prefix=`ime_rec_bert_ner_v1`);
}
// a function to lookup cache
inline func lookupCache(key){
builtin("lookup_cache", key, prefix=`ime_rec_bert_ner_v1`);
}
func main(input) {
input = builtin("jq", input, filter=`.payload | fromjson`);
key=@call(getCacheKey, [input]);
cacheRes=@call(lookupCache,[key]);
result=builtin("http", input, endpoint=`http://192002625-146479.Production/suggestion/`,
method=`post`, max_retry_times="3", default_value=`{"actions":[]}`, timeout="800ms");
@call(setCache, [key, result]);
cacheMiss=builtin("jq", cacheRes, filter=`.found | not`);
if(cacheMiss){
result;
}else{
builtin("jq", cacheRes, filter=`.payload`);
}
}
// {"payload": "{\"request_id\":\"1674\",\"request_type\":7,\"context\":[],\"context_interval\":[],\"query\":\"红楼梦小姐姐\",\"uid\":\"1674\",\"api_level\":0}"}