首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

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

如何实现 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 String
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
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 的内容,就不在此叙述了。
返回列表