
# 1 cache
我们可以调用DataSet的接口:
```java
public CachedDataSet cache(CacheHint cacheHint)
```
来创建一个CachedDataSet。
+ dataSet.cache(),dataSet是离线的,只能顺序遍历,遍历一次,无状态。
+ CachedDataSet是将DataSet缓存起来,通过id多次访问,并提供随机按Range访问。
+ CachedDataSet默认是有超时时间的(30分钟),业务可以自己设置。

***示例***
```java
//写入缓存
CacheHint hint = new CacheHint();
Hint.setTimeout(60* 60 * 1000); //默认超时是30分钟
CachedDataSet cachedDataSet = DataSet.cache(cacheHint);
String id = cachedDataSet.getCachedId();
//获取CachedDataSet
CachedDataSet cachedDataSet = Algo.get CachedDataSet(id);
//遍历缓存
Iterator<Row> iterator cachedDataSet.iterator(int begin, int length);
或者
List<Row> list = cachedDataSet. getList(int begin, int length);
//关闭
cachedDataSet.close();
```
# 2 Cache Builder
适用于当前dataset cache后可以继续添加row。
```java
//写入缓存
CacheHint hint = new CacheHint();
Hint.setTimeout(60* 60 * 1000); //默认超时是30分钟
CachedDataSet cachedDataSet = DataSet.cache(cacheHint);
String id = cachedDataSet.getCachedId();
//获取CachedDataSet
CachedDataSet cachedDataSet = Algo.get CachedDataSet(id);
//遍历缓存
Iterator<Row> iterator cachedDataSet.iterator(int begin, int length);
或者
List<Row> list = cachedDataSet. getList(int begin, int length);
//关闭
cachedDataSet.close();
```
# 3 DataSetBuilder
DataSetBuilder提供内存构造DataSet的功能,DataSetBuilder不同于CachedDataSet.Builder。
```java
RowMeta rowMeta = xxx;
DataSetBuilder builder = Algo.createDataSetBuilder(rowMeta);
builder.append(new Object[]{xxx});
builder.append(new Object[]{xxx});
DataSet dataset = builder.build();
```
# 4 Input
Input是一种数据源接口,通过Input可以创建一个DataSet,接口如下:
```java
DataSet createDataSet(Input... inputs);
```
执行并行取数,如果传入多个Input,默认启动4个并行查询。
Input有4个子类:
+ OrmInput
+ DbInput
+ OqlInput
+ CollectInput
Input有一个子接口CustomizedInput,供自定义Input。
***代码示例***
```java
int n = 8;
OrmInput[] inputs = new OrmInput[n];
for(int i=0;i<n;i++){
Qfilter[] filters = …; //把filters拆成多个,可并行执行
Inputs[i] = new OrmInput(algoKey, String entityName, selectFields, filters);
}
DataSet dataset = Algo.createDataSet(inputs);
```
# 5 计算表达式
***特性***
+ expr支持基本四则运算,包括:+,-,*,/,()。
+ 支持常量数字,字符串。
+ 支持逻辑表达式: <,>,<=,>=,<>,!=, and, or, xor, not。
+ 支持宏: NULL, TRUE, FALSE。
+ 别名: expr alias, expr as alias。
+ 支持跟SQL一样的Case When语法,2种。
+ 支持函数。
***代码示例***
```java
1. famount
2. famount as amount
3. famount * 2 as amount, famount + 2 as amount, famount / fqty as amount, famount * fqty as mount,
4. (famount + qty) * 2 as amount
5. famount > fqty as b
6. famount > fqty and fqty > 100 as c
7. null as c, true as c, false as c
8. 100 as amount, 'abc' as name
9. fname + 'abc' as name
```
***表达式语法***
| 类型 | 语法 | 说明 |
| - | - | - |
| 数值四则运算 | +,-,*,/,%,() | %为求余 |
| 字符串拼接 | + | 或者用concat函数 |
| 字符串like | like %abc% | 跟sql类似,通过%实现左右like匹配 |
| 别名 | expr as alias | A as c, a+b as c |
| 类型转换 | Cast(expr as DataType) | |
| 布尔连接符 | and,or | |
| 布尔比较符 | =, <, <= , >, >=, <>, != | <,<=,>,>=只适用于数值比较<> 等价于 != |
| Case When语句 | 1.Case 表达式 When 值 then 值 [else 值] end 2.Case When 布尔表达式 then 值 [else 值] end | 跟sql一样,有两种形式 |
| In | expr in (v1, v2,vN)