跳到主要内容

类型系统

DataQL 是弱类型定义的查询语言,在DataQL 中所有数据都会被归结到有限的几种类型上。无需定义数据类型结构,在弱类型系统中编写查询会非常方便,它去掉了繁杂的类型定义。

提示

弱类型定义会带来 字段类型不确定 的问题。即:在没有搭配类型转换函数情况下,字段类型可能是 boolean 也有可能是 string,这具体要看原始数据是什么类型。

数据类型

数据类型表示方式详情
布尔truefalse表示真假值
数值负无穷大0正无穷大浮点数、整数、科学计数法表示的数
字符串'...'"..."字符串 或 单个字符
空值nullNULL空值
集合[...] 数组 或 多维数组带有顺序的多组数据的集合
对象{'key':...} 具有键值对的数据体DataQL 的对象不支持方法,但是可以具备 UDF 类型的属性
UDFlambda 函数 或 一个外部的 UDF一个外部的 net.hasor.dataql.Udf 接口函数定义
DataQL 中书写的 lambda 函数也被称作为 UDF。
一个扩展代码片段的定义,也属于 UDF 的范畴

数据的表示

布尔类型

  • 举例:var bool = true;

数值类型

  • 二进制表示法:0b010101011000B01010101100
  • 十进制表示法:-0000234123
  • 八进制表示法:0o12345670O1234567
  • 十六进制表示法:0x123450X12345
  • 科学计数法:a * 10的n 次幂的形式,其中 1 < a < 10
  • 关于负数:目前只有十进制表示法中提供了负数的表示能力。

字符串

  • 举例:var str = 'abcdefg...';var str = "abcdefg...";
  • 空字符串:var empty = '';var empty = "";
  • Unicode字符表示:var unicode = '\u0041'; (拉丁字母 A)

空值

  • 举例:null

集合

  • 格式:[...]
  • 空集合:[]
  • 多维集合:[[...],[...]]

对象

  • 格式:{"k1": ... ,"k2": ...}
  • 空对象:{}
  • 多层结构:{"k1": { ... }, "k2": { ... } }

UDF

  • 外部UDF:外部的 UDF 被引入之后,通常以标识符形式表示它。
  • lambda: 中书写的 lambda 表达方式为:var foo = () -> { /* 代码块 */ }
  • 外部代码片段:var a = @@xxx() <% /* 外部代码块 */ %>

JSON

  • DataQL 可以直接表达 Json 数据(Json 的 Key 必须通过双引号或单引号形式包裹起来)

自动类型提升

当两个操作数之间做运算时,其中一个数值类型和另外一个数值的类型不一致情况下。将两个数值的类型统一转换成同一种类型的行为。

类型自动提升行为表:

boolbytesortintlongfloatdoubleBigIntDecimalstring
boolbytesortintlongfloatdoubleBigIntDecimalstring
bytebytesortintlongfloatdoubleBigIntDecimalstring
sortsortsortintlongfloatdoubleBigIntDecimalstring
intintintintlongdoubledoubleBigIntDecimalstring
longlonglonglonglongdoubledoubleBigIntDecimalstring
floatfloatfloatfloatdoubledoubledoubleDecimalDecimalstring
doubledoubledoubledoubledoubledoubledoubleDecimalDecimalstring
BigIntBigIntBigIntBigIntBigIntBigIntDecimalDecimalDecimalstring
DecimalDecimalDecimalDecimalDecimalDecimalDecimalDecimalDecimalstring
stringstringstringstringstringstringstringstringstringstring