开源 BI 实践:开源代码

润乾 BI 之所以开源,主要考量是 BI 前端的管理需求多变,固定的产品难以应付,在 DQL 解决了关联数据查询难题后,用户容易基于它开发出真正敏捷的 BI 前端。

下面详细了解下该 BI 系统的开源代码,用户可以基于它直接二次开发,也可以借鉴做法,基于 DQL 新开发自己的 BI 系统。

主要源码简介

浏览器端的 Javascript 源代码都在 {WEB 根目录}/raqsoft/guide/js/ 下,主要的 js 文件有 dqlApi.js、dqlreport.js、query.js、raqsoftApi.js、where.js、common.js。

页面用 JSP 中的 taglib 技术展示,taglib 定义在 {WEB 根目录}/WEB-INF/raqsoftAnalyse.tld,实现 taglib 的 Java 类是 com.raqsoft.guide.tag.AnalyseTag.java,其它一些主要 Java 类有:

com.raqsoft.guide.web.DataSphereServlet.java,请求入口的 Servlet

com.raqsoft.guide.web.dl.ActionResultPage.java,处理大部分 Servlet 请求,主要功能代码在这个类里。

com.raqsoft.guide.web.dl.DfxQuery.java,用内置集算器脚本查询 / 计算不同来源的数据。

com.raqsoft.guide.web.dl.DfxData.java,缓存计算好的数据集。

引入的 jar 主要有:

datalogic.jar,DQL JDBC 驱动,连接 DQL Server 做查询;

esproc-bin-*.jar 集算器,内置了一些集算器脚本实现查询、计算;界面用户也可以自定义脚本做个性化的数据处理;

raqsoftReport.jar 润乾报表。

源代码中会调用这三个工具的一些接口类实现功能,但这三个工具自身的代码不开源。

同时集算器和润乾报表共用了同一个运行环境配置文件,{WEB 根目录}/WEB-INF/raqsoftConfig.xml,里面会定义所有可用的 JDBC 数据源,一些资源路径等。

获得 DQL 元数据

看 ConfigUtil.java 里的代码:

..

JDBC 查询语句”metadata”,能从 DQL 服务器获得 JSON 格式的整个元数据信息:

{

 "tables": [{"name": "客户","dispName": "客户","type": "0","desc": "",

  "fields": [{

   "name": "客户",

   "type": 2,

   "desc": "",

   "pk": 1,

   "dim": "客户"

   }

   ......

  ],

  "subTables": []

 }

 }],

 "dims": [{"name": "市","table": "市","field": "市",

  "destLevels": [{

   "name": "省","dest": "省. 省","formula": "int(?/100)"

  }, {

   "name": "大区","dest": "大区. 大区","formula": "int(?/10000)"

  }]

 },

 ......

 ],

 "levels": [],

 "annexTables": [

  [{

   "name": "客户","pks": ["客户"]

  }, {

   "name": "VIP 客户","pks": ["VIP 客户"]

  }],

  ......

 ],

 "classTables": [],

 "editStyles": []

}

显示元数据树

把上面元数据信息从 WEB 服务器端传送到浏览器端,query.js 中用一个 JS 控件 zTree 把这些元数据信息整理后,显示为一棵元数据树:

..

其中的 zNodes 就是整理后的树节点,根据外键关联关系,相应的树节点可以展开出外键表:

..

依据界面操作生成 DQL 语句

从元数据树上选出一些字段做多维分析:

..

这些界面操作记录在 JS 变量 olapObj.conf.rpxs 里:
..

之后用 dqlApi.js 里的 dqlQuery.confUtils.generateDql() 方法按照界面上多维分析操作拼出相应的查询 DQL:

..

在 generateDql()方法里的最后可以看到,把整理好的 DQL 片段 (dqlSegments) 提交到服务器拼出最终的 DQL 语句:

..

得到 DQL 语句后,在 dqlreport.js 的 aly.queryData() 方法中,向 WEB 服务器发送查询请求:

..

用 DQL 查出的数据生成报表

界面上多维分析操作,除了用来生成查询 DQL,同时还用来生成润乾报表模板,用 aly.generateReport() 方法整理出一些报表关键信息,然后请求 WEB 服务器生成报表:

..

ActionResultPage.java 里 genReport 操作中,把生成好的报表模板存入 session:

..

最后在 showReport.jsp 中把 session 中的润乾报表模板展示出来即可。

后记

按照上述步骤,逐步实现了依靠 DQL 的敏捷 BI。除了这个主流程,还有一些分支功能,比如:

支持分组前 (WHRER)、后(HAVING) 条件、排序、按位对齐多表查询;

支持非 DQL 的单数据集(一句 SQL、一个 excel 数据文件等);

支持大报表 (结果数据太多时,不能一次查出到内存);

支持报表的显示格式设置(前景色、背景色、字体、居中等);

支持预定义报表模板(用于显示统计图、或图表结合);

支持报表中的跨行组计算(排名、占比、同比等)。

再加上多用户权限,要合理的管理系统中的各种资源,这将会逐步演变成一个越来越庞大的 BI 系统。BI 系统庞大,不可避免,但直接引入重度、固定的 BI 系统,不容易匹配用户复杂多变的需求。

依托 DQL、润乾报表这些重要且难的 BI 基础能力,以开源 BI 为起点,从自身需求出发,逐步演变出更适合自己的敏捷 BI 系统,会是一条较优的技术路径。


以下是广告时间

对润乾产品感兴趣的小伙伴,一定要知道软件还能这样卖哟性价比还不过瘾? 欢迎加入好多乾计划。
这里可以低价购买软件产品,让已经亲民的价格更加便宜!
这里可以销售产品获取佣金,赚满钱包成为土豪不再是梦!
这里还可以推荐分享抢红包,每次都是好几块钱的巨款哟!
来吧,现在就加入,拿起手机扫码,开始乾包之旅



嗯,还不太了解好多乾?
猛戳这里
玩转好多乾