查询命令

DataQL 一共包含 8 种语句

import - 资源导入

语法格式

  • import "<函数类或函数包类>" as <别名>

  • import @"<资源地址>" as <别名>

  • 别名必须满足 标识符

import 语句必须要放在整个查询过程最开始的地方,它的作用是导入外部 函数 或者 函数包。被导入的资源会以 var 的方式定义。

例如:导入 net.hasor.dataql.sdk.CollectionUdfSource 函数包,并通过函数包中的函数判断一个集合是否为空。

  1. import "net.hasor.dataql.sdk.CollectionUdfSource" as collect
  2. var dataSet = []
  3. var test = collect.isEmpty(dataSet)

import 语句还有另外一个功效就是,可以将另外一个 DataQL 查询当作 函数 的形式导入到当前查询中。

例如:有一个已经保存在文件中的 DataQL 查询语句,这个查询保存在 classpath 路径中,”/net/hasor/demo.ql”

  1. return { "name": "马三", "msg": "Hello DataQL." }

有另外一个 DataQL 查询引用了 demo.ql 这个查询并拿到返回的结果。

  1. import @"/net/hasor/demo.ql" as demo
  2. return demo()

var - 定义变量

语法格式

  • var <变量名> = <表达式 or 值对象 or 函数定义>

提示

var 语句是用的最广泛的语句,它有两个特性:1.定义变量,2.执行并存储表达式的值

变量定义的作用是可以保存临时查询结果,以及保存查询过程中需要用到的函数定义。例如:

  1. var a = 1

执行表达式

  1. var a = 1 + 1

run - 仅执行

语法格式

  • run <表达式 or 值对象 or 函数定义>

run 语句相比 var 语句,只是不能保存查询结果。因此 run 语句也就不具备定义变量的能力。例如:下面这个语法是正确的,但是没有实际意义:

  1. run 1 + 1

在一些特殊场合中,查询的中间结果并不重要。因此也就无需专门为这些临时查询开辟数据保存空间,例如:把查询到的每一条数据,都调用一次 Udf。

  1. var dataSet = ...
  2. run dataSet => [ callUdf(#) ] // 遍历 dataSet 集合并调用 callUdf 函数

三大退出语句

DataQL 有三大退出指令,分别是:returnthrowexit。它们的区别如下:

return终止当前过程的执行并正常退出到上一个执行过程中
throw终止所有后续指令的执行并抛出异常
exit终止所有后续指令的执行并正常退出

它们的一般语法格式

  • return <状态码>, <表达式 or 值对象 or 函数定义>

  • throw <状态码>, <表达式 or 值对象 or 函数定义>

  • exit <状态码>, <表达式 or 值对象 or 函数定义>

  • 还可以不指定状态码 return <表达式 or 值对象 or 函数定义> 其它退出语句同理。

三大退出指令除了行为不同之外,语法和使用方式完全一样。例如:返回结果

  1. return ...

同样,还可以抛出异常,同时带上一个查询结果。

  1. throw ...

返回状态为 200 的查询,查询结果是一个对象

  1. return 200, { ... }

if - 分支选择语句

让 DataQL 变得灵活的正式由于 if 语句的存在,它的用法和 Java 或 JavaScript 相同。其语法格式为:

  1. if (boolean_expression) {
  2. /* 如果布尔表达式为真将执行的语句 */
  3. } else {
  4. /* 如果布尔表达式为假将执行的语句 */
  5. }

例如:

  1. if (testExpr) {
  2. return ...
  3. } else {
  4. return ...
  5. }

同样 DataQL 的选择分支也支持多重分支

  1. if (testExpr1) {
  2. return ...
  3. } else if (testExpr2) {
  4. return ...
  5. } else if (testExpr3) {
  6. return ...
  7. } else {
  8. return ...
  9. }

hint - 选项语句

  • 语法格式
    • hint <选项名称> = <选项值>

    • 选项名称:是满足 标识符 特征的

    • 选项值:可以定义,数字、字符串、布尔、null 四种基本类型数据。

例如计算百分比,精确到小数点后2位:

  1. hint MAX_DECIMAL_DIGITS = 4;
  2. hint NUMBER_ROUNDING = 'HALF_UP'; // 默认值也是 HALF_UP
  3. var num = 1.0
  4. var sumNum = 3.0
  5. return num / sumNum * 100 + "%"
  6. ...

执行查询结果为:33.33%

提示

hint 语句要放在 import 语句的前面,其作用是设置一些执行查询使用的选项参数。可用的选项列表如下:

选项名默认值可选值含义
INDEX_OVERFLOWnearthrow、null、near设置索引溢出的行为
MAX_DECIMAL_DIGITS200 和 正整数超出该范围将会根据 NUMBER_ROUNDING 选项规则进行舍入。
NUMBER_ROUNDINGHALF_UPRoundingEnum枚举小数的舍入模式,参考 RoundingEnum 定义的舍入模式(一共八种)
MIN_DECIMAL_WIDTHdoublefloat,double,big浮点数计算使用的最小数值宽度。
MIN_INTEGER_WIDTHintbyte,short,int,long,big整数计算使用的最小数值宽度。

每个选项的可选值和行为解释请参考附录。