函数

外部函数

并非通过 DataQL 语句定义的函数都是外部函数。使用外部函数通常需要编写 Java 代码,然后在 DataQL 查询中将其导入之后才可以使用。

例如:下面这个函数就是返回一个 DataBean 对象:

  1. public class DemoUdf implements Udf {
  2. @Override
  3. public Object call(Hints readOnly, Object[] params) {
  4. return new DataBean();
  5. }
  6. }

然后通过 import 语句导入,导入之后就可以正常使用这个函数了。

  1. import 'net.demo.packages.DemoUdf' as demo;
  2. var data = demo() => { ... };
  3. ...

提示

使用外部函数需要用到的语句是 import 语句,更多外部函数的技巧需要在开发手册中查阅。

定义函数

在 DataQL 查询中可以定义一个函数,然后在后续查询中使用它。一个典型的场景就是对性别字段的转换。定义函数的语法如下:

  1. var foo = (param1,param2,...) -> {
  2. <语句1>;
  3. <语句2>
  4. <语句3>
  5. }

其中 foo 是函数名,param1param2是函数的参数。``{ … } 花括号中间是函数体。定义的函数和外部函数的用法完全一样,只是函数的逻辑部分是通过 DataQL 来编写的。这有点类似 存储过程

  1. var foo = () -> {
  2. return { ... } // 返回一个数据体
  3. }
  4. var data = foo() => { ... }; // 对 foo 数据体进行结构变换
  5. ...

Lambda

例如在使用 net.hasor.dataql.sdk.CollectionUdfSource 函数包进行数据过滤时,需要指定一个过滤函数。在不使用 Lambda 表达式之前需要定义一个函数。

  1. import 'net.hasor.dataql.sdk.CollectionUdfSource' as collect;
  2. var dataSet = ...
  3. var foo = (dat) -> {
  4. return test.parent_id == null; // 返回一个数据体
  5. }
  6. return collect.filter(dataSet, foo);

Lambda 可以帮助减少对函数的声明,例如简写为:

  1. import 'net.hasor.dataql.sdk.CollectionUdfSource' as collect;
  2. var dataSet = ...
  3. return collect.filter(dataSet, (dat) -> { return test.parent_id == null; });