查询命令
DataQL 一共包含 8 种语句
import - 资源导入
语法格式
import "<函数类或函数包类>" as <别名>
import @"<资源地址>" as <别名>
别名必须满足 标识符
import 语句必须要放在整个查询过程最开始的地方,它的作用是导入外部 函数
或者 函数包
。被导入的资源会以 var
的方式定义。
例如:导入 net.hasor.dataql.sdk.CollectionUdfSource
函数包,并通过函数包中的函数判断一个集合是否为空。
- import "net.hasor.dataql.sdk.CollectionUdfSource" as collect
- var dataSet = []
- var test = collect.isEmpty(dataSet)
import
语句还有另外一个功效就是,可以将另外一个 DataQL 查询当作 函数
的形式导入到当前查询中。
例如:有一个已经保存在文件中的 DataQL 查询语句,这个查询保存在 classpath 路径中,”/net/hasor/demo.ql”
- return { "name": "马三", "msg": "Hello DataQL." }
有另外一个 DataQL 查询引用了 demo.ql
这个查询并拿到返回的结果。
- import @"/net/hasor/demo.ql" as demo
- return demo()
var - 定义变量
语法格式
var <变量名> = <表达式 or 值对象 or 函数定义>
提示
var
语句是用的最广泛的语句,它有两个特性:1.定义变量,2.执行并存储表达式的值
变量定义的作用是可以保存临时查询结果,以及保存查询过程中需要用到的函数定义。例如:
- var a = 1
执行表达式
- var a = 1 + 1
run - 仅执行
语法格式
run <表达式 or 值对象 or 函数定义>
run
语句相比 var 语句,只是不能保存查询结果。因此 run
语句也就不具备定义变量的能力。例如:下面这个语法是正确的,但是没有实际意义:
- run 1 + 1
在一些特殊场合中,查询的中间结果并不重要。因此也就无需专门为这些临时查询开辟数据保存空间,例如:把查询到的每一条数据,都调用一次 Udf。
- var dataSet = ...
- run dataSet => [ callUdf(#) ] // 遍历 dataSet 集合并调用 callUdf 函数
三大退出语句
DataQL 有三大退出指令,分别是:return
、throw
、exit
。它们的区别如下:
return | 终止当前过程的执行并正常退出到上一个执行过程中 |
throw | 终止所有后续指令的执行并抛出异常 |
exit | 终止所有后续指令的执行并正常退出 |
它们的一般语法格式
return <状态码>, <表达式 or 值对象 or 函数定义>
throw <状态码>, <表达式 or 值对象 or 函数定义>
exit <状态码>, <表达式 or 值对象 or 函数定义>
还可以不指定状态码
return <表达式 or 值对象 or 函数定义>
其它退出语句同理。
三大退出指令除了行为不同之外,语法和使用方式完全一样。例如:返回结果
- return ...
同样,还可以抛出异常,同时带上一个查询结果。
- throw ...
返回状态为 200 的查询,查询结果是一个对象
- return 200, { ... }
if - 分支选择语句
让 DataQL 变得灵活的正式由于 if
语句的存在,它的用法和 Java 或 JavaScript 相同。其语法格式为:
- if (boolean_expression) {
- /* 如果布尔表达式为真将执行的语句 */
- } else {
- /* 如果布尔表达式为假将执行的语句 */
- }
例如:
- if (testExpr) {
- return ...
- } else {
- return ...
- }
同样 DataQL 的选择分支也支持多重分支
- if (testExpr1) {
- return ...
- } else if (testExpr2) {
- return ...
- } else if (testExpr3) {
- return ...
- } else {
- return ...
- }
hint - 选项语句
- 语法格式
hint <选项名称> = <选项值>
选项名称:是满足
标识符
特征的选项值:可以定义,数字、字符串、布尔、null 四种基本类型数据。
例如计算百分比,精确到小数点后2位:
- hint MAX_DECIMAL_DIGITS = 4;
- hint NUMBER_ROUNDING = 'HALF_UP'; // 默认值也是 HALF_UP
- var num = 1.0
- var sumNum = 3.0
- return num / sumNum * 100 + "%"
- ...
执行查询结果为:33.33%
提示
hint
语句要放在 import
语句的前面,其作用是设置一些执行查询使用的选项参数。可用的选项列表如下:
选项名 | 默认值 | 可选值 | 含义 |
INDEX_OVERFLOW | near | throw、null、near | 设置索引溢出的行为 |
MAX_DECIMAL_DIGITS | 20 | 0 和 正整数 | 超出该范围将会根据 NUMBER_ROUNDING 选项规则进行舍入。 |
NUMBER_ROUNDING | HALF_UP | RoundingEnum枚举 | 小数的舍入模式,参考 RoundingEnum 定义的舍入模式(一共八种) |
MIN_DECIMAL_WIDTH | double | float,double,big | 浮点数计算使用的最小数值宽度。 |
MIN_INTEGER_WIDTH | int | byte,short,int,long,big | 整数计算使用的最小数值宽度。 |
每个选项的可选值和行为解释请参考附录。