跳到主要内容

flexmodel-json-logic

通过Json构建复杂的dsl语法,适用于低代码开发平台的条件规则和表达式等功能

能干什么?

  1. 通过JSON去表示条件组规则、函数、表达式功能

  2. 进行计算得出布尔值、数值、日期时间等

  3. 将语法转换为其他DSL语法(例如SQL)等

Basic Specification

{
"operator": [
"values",
"..."
]
}

添加依赖

<dependency>
<groupId>tech.wetech.flexmodel</groupId>
<artifactId>flexmodel-json-logic</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>

要求Java 17以上版本,低版本不受支持

Node Type

类型结构定义说明示例
var{"var":[<variable_name> (,default_value) }变量,arg1: 变量名称, arg2: 默认值,非必填 {"var":["foo",1]} 或者 {"var": "foo" }
table_field{"table_field":[<table>,<field>]}arg1: table, arg2: field {"table_field":["user","name"]}
datetime {"datetime":"2021-09-02T02:50:12.208"}日期时间, 时间格式yyyy-MM-dd'T'HH:mm:ss.SSS{"datetime":"2021-09-02T02:50:12.208"}
temporal_offset{"temporal_offset":[<unit>,<offset>]} 时间偏移, arg1: year month week day hour minute second{"temporal_offset":["year",1]}
current_datetime{"current_datetime":[]} 当前时间{"current_datetime":[]}
current_user{"current_user":[]} 当前用户{"current_user":[]}

Operator

操作符说明可运算值类型
andboolean
orboolean
==等于number+string+boolean
!=不等于number+string+boolean
>大于number
>=大于等于number
<小于number
<=小于等于number
+number
-number
*number
/number
%求余number
contains包含array+string
not_contains不包含array+string
between范围datetime+number

Functions

字符串函数

UPPER(string)

说明:返回转换为大写的字符串

示例:{"upper":"Who Am I"}

输出:WHO AM I

LOWER(string)

说明:返回转换为小写的字符串

示例:{"lower": "How Are You"}

输出: how are you

SUBSTR(string,pos[,len])

说明:字符串截取

pos: 截取坐标

len: 可选参数, 截取长度

示例一 :{"substr":["中国经济航船行稳致远",2]}

输出:经济航船行稳致远

示例二:{"substr":["中国经济航船行稳致远",2,2]}

输出:经济

CAT(string[,string...])

说明:字符串拼接

示例:{"cat":["中国经济","航船","行稳致远"]}

输出:中国经济航船行稳致远

数值函数

MIN(number[,number...])

说明:计算最小值

示例:{"min":[1,3,5,1]}

输出:1

MAX(number[,number...])

说明:计算最大值

示例:{"max":[1,3,5,1]}

输出:5

聚合函数

说明:聚合函数适用于计算子表字段的数据值

COUNT(table_field)

说明:返回记录总数

示例:{"count": [{"table_field":["student","name"]}]}

AVG(table_field)

示例:{"avg": [{"table_field":["student","score"]}]}

说明:返回所有数值的平均值(算术平均值)

MIN(table_field)

说明:计算最小值

示例:{"min": [{"table_field":["student","age"]}]}

MAX(table_field)

说明:计算最大值

示例:{"max": [{"table_field":["student","age"]}]}

SUM(table_field)

说明:返回所有数值之和

示例:{"sum": [{"table_field":["student","score"]}]}

Sql Logic Rules

支持的功能类型: table_field var

支持的表达式: and or == != > >= < <= contains not-contains between

Example


expression: {"and":[{">":[{"table_field":["user", "id"]}, 2]},{"==":["jack", {"table_field":["user", "name"]}]},{"<":[{"table_field":["user", "age"]}, 21]}]}

// 支持无限层级and/or嵌套

result: ( user.id > ? and ? = user.name and user.age < ? )

// 参数 [2,"jack",21]

MongoDB Logic Rules

支持的功能类型: var table_field datetime temporal_offset current_datetime current_user

支持的表达式: and or == != > >= < <= contains not_contains between

Example

expression:

{
"and": [
{ ">": [{ "var": "id" }, 2] },
{ "==": ["jack", "name" ] },
{ "<": [{ "var": "age" }, 21] }
]
}

result:

{
$and: [
{ id: { $gt: 2.0 } },
{ jack: { $eq: "name" } },
{ age: { $lt: 21.0 } }
]
}

Boolean Logic Rules

支持的功能类型: var table_field datetime

支持的表达式: and or == != > >= < <= contains not_contains between

Example 1


expression: {"or":[{">":[1, 2]},{"<":[1, 2]}]}

// (1 > 2 or 1 < 2)

data: null

result: false

Example 2


expression: {"and":[{"and":[{">=":[3, 5]},{"<=":[1, 2]}]},{"or":[{">":[3, 2]},{"<":[1, 2]}]}]}

// ((3 >= 5 and 1 <= 2) and (3 > 2) or (1 < 2))

data : null

result: true

Example 3


expression: {"and":[{">":[{"var":["a",3]}, 2]},{"<":[1, {"var":"b"}]},{"<":[{"var":"c.cc"},21]}]}

// ((a > 2) and (1 < b)) and c.cc < 21

data: {"b":10,"c":{"cc":20}} //a默认值是3

result: true

Math Logic Rules

算术四则运算以及两个日期相减

支持的功能类型: var datetime

支持的表达式: + - * / %

Example


expression: { "+": [ 5, { "%": [ { "/": [ { "*": [ 2 , { "-": [ 10, 6 ] } ] }, { "var": "a" } ] }, 2 ] } ] }

// 5 + (2 * ( 10 - 6 )/ 4 ) % 2

data: { a: 4 }

result: 6

Datetime Logic Rules

加或者减去某个日期时间

支持的功能类型:var datetime temporal_offset

支持的表达式: + -

Example


expression: { "+": [ { "datetime": "2021-09-02T02:50:12.208" }, { "temporal_offset": [ "year", { "var": "a" } ] } ] }

data: { a: 1 }

result: 2022-09-02T02:50:12.208Z