如何实现 Gridx 在 Server 端的数据筛选(3)
 
- UID
- 1066743
|

如何实现 Gridx 在 Server 端的数据筛选(3)
Server 端筛选条件的解析 (后台)当数据筛选请求发送到 Server 端后,需要将 Filter 条件的 JSON String 解析出来。首先通过用"filter"这个字段从 HTTP Request 的 Headers 里拿到 JSON String,它是一个递归的结构,如:
清单 7. 一个 Filter 条件结构的示例1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
| {
op: 'or',
data: [
{
op: 'lessEqual',
data: [
{
op: 'number',
data: 'colC',
isCol: true
},
{
op: 'number',
data: 89
}
]
},
{
op: 'not',
data: [
{
op: 'endWith',
data: [
{
op: 'string',
data: 'colD',
isCol: true
},
{
op: 'string',
data: 'xyz'
}
]
}
]
}
]
}
|
接下来我们需要对这个 JSON String 进行解析,将其转换成 Java 类,可以通过一些开源的框架来做转换解析,这里选用 Gson 这个开源库来解析这个 JSON String。
首先需要定义下 Java 的 POJO 类来存放解析 JSON String 之后获得的对象:
清单 8. 用于存放 Filter 表达式对象的接口类1
| interface FilterExpression{}
|
由于 JSON String 是一个递归的结构,包含了两种不同的子结构。所以需要一个共用的基础类来存放解析得到的不同类型的 Java 对象,此处用 FilterExpression 接口。
清单 9. 用于存放 Filter 外层结构对象的类1
2
3
4
| class FilterExpressionList implements FilterExpression{
String op;
List<FilterExpression> data;
}
|
FilterExpressionList 用于存放 Filter 的条件,或者条件集合
清单 10. 用于存放 Filter 最里层结构对象的类1
2
3
4
5
| class FilterExpressionColOrValue implments FilterExpression{
String op;
String data;
String isCol;
}
|
FilterExpressionColOrValue 则用于存放 Filter 条件里的 Column 或者 Value 信息。
下面再来对 JSON String 进行具体的递归解析,将最终获取的对象放入这个接口类中。
清单 11. 解析 Filter 条件的 JSON String1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| class FilterExpressionParser implements
JsonDeserializer<FilterExpression> {
public FilterExpression deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
FilterExpression expr = null;
if (json == null) {
expr = null;
} else {
JsonElement data = json.getAsJsonObject().get("data");
if (data.isJsonArray()) {
FilterExpressionList exprList = new FilterExpressionList();
Type type = new TypeToken<List<FilterExpression>>() {
}.getType();
exprList.data = context.deserialize(data, type);
exprList.op = json.getAsJsonObject().get("op").getAsString();
expr = exprList;
} else if (data.isJsonPrimitive()) {
FilterExpressionColOrValue exprDetail = new FilterExpressionColOrValue();
exprDetail.data = json.getAsJsonObject().get("data")
.getAsString().trim();
exprDetail.op = json.getAsJsonObject().get("op").getAsString();
if (json.getAsJsonObject().get("isCol") != null) {
exprDetail.isCol = json.getAsJsonObject().get("isCol")
.getAsBoolean();
}
expr = exprDetail;
} else {
expr = null;
}
}
return expr;
}
}
|
通过观察 JSON String 的结构,也可以通过 FilterBar 来确认,这个 JSON String 肯定是 Filter 的条件或者筛选条件集合,即一个外层结构的对象,所以将 JSON String 解析之后获得的接口对象,可以直接转换成一个 FilterExpressionList 类的对象。
清单 12. 获取解析得到的对象1
2
3
4
5
6
7
| GsonBuilder gb = new GsonBuilder();
gb.registerTypeAdapter(FilterExpression.class,
new FilterExpressionParser());
Gson gson = gb.create();
FilterExpressionList filter = (FilterExpressionList)gson.fromJson(inputJsonString,
FilterExpression.class);
|
由于通过 FilterBar 产生的条件只有两种形式:1)满足单个条件 2)全部满足或者任意满足的条件集合。对于筛选条件的操作形式有以下几种:
and, or, not, equal, greater, less, greaterEqual, lessEqual, isEmpty, contain, startWith, endWith
接下来就可以相对容易的通过这个 FilterExpressionList 对象,将其转化成相应的 SQL,再来与数据库进行交互,获得过滤后的数据。具体的转化 SQL 的过程由于不涉及到 Gridx 的 Filter 的内容,就不在此叙述了。 |
|
|
|
|
|