
# 1 接口说明
Algo相关接口定义和实现存在于bos-algo-1.0.jar中。在实际使用过程中主要使用DataSet的相关接口方法。
# 2 接口列表
**DataSet**
| 接口方法 | 说明 |
| - | - |
| join | join操作 |
| leftJoin | leftJoin操作 |
| rightJoin | rightJoin操作 |
| fullJoin | fullJoin操作 |
| hashJoin | hashJoin操作 |
| union | union操作 |
| top | 取top n个 |
| limit | 取部分行 |
| range | 取部分行,类似limit |
| copy | 拷贝自己 |
| count | 对field进行count计数,distinct消除重复 |
| cache | 将dataset缓存起来 |
| cacheBuilder | |
| print | 打印输出到console |
| close | 关闭 |
| select | 选择字段。类似:select a,b,c,a,b,c可以是表达式 |
| addField | 增加字段 |
| addNullField | 增加null字段,等价于addField("null",alias) |
| addBalanceField | 增加余额字段,该字段的值从上往下累加 |
| removeField | 删除字段 |
| filter | 过滤,类似where,expr中可以写变量,变量值通过params传递,比如”a>b”, params是map,key包含a和b |
| where | 过滤 |
| orderBy | 排序,field可以写成field asc,field desc |
| groupBy | groupBy操作 |
| executeSql | 执行sql |
# 3 select
+ **功能描述**
选择字段。类似:select a,b,c,a,b,c可以是表达式。
+ **方法**
```java
public DataSet select(String[] exprs)
public DataSet select(String exprs);
```
+ **参数说明**
| 参数 | 类型 | 说明 |
| - | - | - |
| exprs | String[] | exprs可以是 字段field、Field as alias、表达式 as alias;Select是对源DataSet的重新选择,类似sql;DataSetA.Select(new String[]{“a”,”b+c as d”})等价于Select a,b+c as d from DataSetA。 |
| exprs | String | exprs可以是直接写多个字段,比如dataSetA.select(“fname, famount as amount,1+2 as c”); |
+ **返回值**
返回选择字段后的DataSet。
+ **示例代码**
```java
DataSet ds= dataSet.select(new String[]{
"famount",
"famount c1",
"famount + fqty c2",
"famount * fqty c3",
"null c4", "true c5",
"(famount + fqty) * 3 c6",
"famount >= fqty c7",
"famount >= fqty and fqty<100 c8",
"fname + 'abc' name"});
DataSet ds= dataSet.select(
"famount, famount c1,famount + fqty c2,famount * fqty c3 ,null c4,?true c5,(famount + fqty) * 3 c6,famount >= fqty c7,famount >= fqty and fqty<100 c8,fname + 'abc' name}");
```
# 4 addField
+ **功能描述**
添加字段。
+ **方法**
```java
// 在现有DataSet基础上添加字段,或者删除字段
public DataSet addField(String expr, String alias)
// 添加表达式expr字段,数据类型自动判断
public DataSet addField(String expr, String alias)
```
+ **参数说明**
| 参数 | 类型 | 说明 |
| - | - | - |
| expr | String | expr可以是字段field、Field as alias、表达式 as alias |
| alias | String | 字段别名 |
+ **返回值**
返回添加完字段后的DataSet。
# 5 addNullField
+ **功能描述**
添加值为null的字段,数据类型为NullType。
+ **方法**
```java
public DataSet addNullField(String alias)
public DataSet addNullField(String... aliases)
```
+ **参数说明**
| 参数 | 类型 | 说明 |
| - | - | - |
| alias | String | 别名 |
| aliases | String... | 别名数组 |
+ **返回值**
返回添加完字段后的DataSet。
# 6 addBalanceField
+ **功能描述**
添加余额字段,addBalanceField方法将字段的值从上往下累加。
+ **方法**
```java
public DataSet addBalanceField(String expr, String alias)
```
+ **参数说明**
| 参数 | 类型 | 说明 |
| - | - | - |
| expr | String | 表达式 |
| alias | String | 别名 |
+ **返回值**
返回添加完字段后的DataSet。
+ **代码示例**
```java
addBalanceField("amount", "balance")
addBalanceField("amount * 2", "balance2")
```
| Period | Amount | balance | balance2 |
| - | - | - | - |
| 201701 | 100 | 100 | 200 |
| 201702 | 200 | 300 | 600 |
| 201703 | 200 | 500 | 1000 |
# 7 removeField
+ **功能描述**
删除字段。
+ **方法**
```java
public DataSet removeField(String field)
```
+ **参数说明**
| 参数 | 类型 | 说明 |
| - | - | - |
| field | String | 字段名称 |
+ **返回值**
返回删除完字段后的DataSet。
# 8 where/filter
+ **功能描述**
过滤,类似where,expr中可以写变量,变量值通过params传递,比如”a>b”, params是map,key包含a和b。filter类似于sql的where条件。where和filter是完全等价的。
+ **方法**
```java
public DataSet where(String expr)
public DataSet where(String expr, Map<String, Object> params)
public DataSet filter(String expr)
public DataSet filter(String expr, Map<String, Object> params)
```
+ **参数说明**
| 参数 | 类型 | 说明 |
| - | - | - |
| expr | String | expr是计算表达式,必须为boolean |
| params | Map<String, Object> | params传递参数给expr。如expr为famount + var1 > 10000。params为:{var1: 100}等价于: famount+100>10000。 |
+ **返回值**
返回过滤后的DataSet。
+ **代码示例**
```java
DataSet ds= dataSet.where("famount>50 and (fqty-100)<5");
DataSet ds = dataSet.filter("famount>50 and (fqty-100)<5");
```
# 9 orderBy
+ **功能描述**
排序。
+ **方法**
```java
public DataSet orderBy(String[] exprs)
```
+ **参数说明**
| 参数 | 类型 | 说明 |
| - | - | - |
| expr | String[] | expr可以是:字段Fname,默认为asc排序。Fname asc、Fname desc、Expr不可以为表达式 |
+ **返回值**
返回排序后的DataSet。
+ **代码示例**
```java
DataSet dataSet2 = dataSet.orderBy(new String[]{"fname", "famount"});
DataSet dataSet2 = dataSet.orderBy(new String[]{"fname desc", "famount asc"});
```
# 10 groupBy
+ **功能描述**
groupBy操作与SQL中的类似。
***groupBy说明***
1. GroupBy结果集默认根据group fields排序,默认asc排序,可以对每个field的排序方向进行设置,即以下orderByDescs:
```java
GroupbyDataSet groupBy(String[] groupFields, boolean[] orderByDescs);
```
所以,对groupby结果进行orderBy,请考虑是否有必要。
2. SQL 92标准,group by结果是不保证排序的,上述API查询结果默认是排序的,是历史原因,目前无法简单去掉;现在没有sql的group by,结果就不保证排序
3. 当GroupBy字段为空时,如dataset.groupBy(null),或者dataSet.groupBy(new String[0]);dataSet.groupBy(null).sum(a).max(b).finish()等价于没有groupby。
4. 有聚合函数的sql:Select sum(a),max(b) from t;如果用sql,可以简写: Select sum(a),max(b), 不需要group by关键字。
+ **方法**
```java
GroupbyDataSet groupBy(String[] groupFields)
GroupbyDataSet groupBy(String[] groupFields, boolean[] orderByDescs)
```
+ **参数说明**
| 参数 | 类型 | 说明 |
| - | - | - |
| groupFields | String[] | groupBy字段 |
| orderByDescs | boolean[] | 是否desc排序|
+ **返回值**
返回GroupbyDataSet对象。
+ **代码示例**
**调用过程**
1. 获取构造器GroupByDataSet。
2. 构造器里设置sum,avg等聚合函数。
3. 构造器finish得到DataSet。
```java
GroupbyDataSet groupby = dataSet.groupBy(new String[]{"fname"}); //groupby是构造器
groupby = groupby.sum("(famount + fqty) * 2", "amount").count("countalias");
groupby = groupby.maxP("famount", "fqty", "amount").count();
DataSet dataSet2 = groupby.finish(); //构造完毕,返回DataSet
```
# 11 union
+ **功能描述**
union操作与SQL的union类似。两个DataSet叠加起来,不支持消除重复。
两个DataSet字段个数必须相同,且每个字段的类型必须互相兼。
***字段Fields合并规则***
1. 默认字段名取左边。
2. 数据类型取左边和右边的兼容类型。
***数据类型兼容规则***
1. Number类型,取最大精度如(Int,Long)取long,(BigDecimal,Long)取BigDecimal。
2. 含Null类型的,取非Null类型。
3. 含Unknown类型的,取非Unknown类型的。
如果两个DataSet字段个数不同,又需要Union,可以通过DataSet.addNullField()添加null字段,以满足相同个数。
+ **方法**
```java
public DataSet union(DataSet rightDataSet)
```
+ **参数说明**
| 参数 | 类型 | 说明 |
| - | - | - |
|