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