BI 前端实践 14:探究润乾多维分析的开源代码

实践目标

         通过解构润乾多维分析系统,阅读关键源代码,详细了解其能力构成,从而总结出使用它的指导意见。

润乾多维分析系统的特殊性

         现在主流多维分析系统都是BS结构的,大多是一个多用户WEB系统,用户在浏览器上操作,向WEB服务器发出请求,WEB服务器再从数据库(或文件)里获得数据返回给界面。同时设计了一种用户角色权限方案,内置在系统中。还能对系统中的数据源/数据集/分析文件/系统日志等各种资源进行管理。往往是一个重度、密不可分的WEB系统,买来即用,基本上不涉及二次开发。

         润乾多维分析比较特殊,整体比较轻量,通过试读其关键源代码,有下面四个特殊点需要细究:

         1、它重点推荐使用的数据源并非常规数据库(DB Server),而是把DB Server用语义层描述后,封装起来,再用DQL Server提供数据查询服务,当然查询语言也就从之前的SQL变成了DQL。之所以费劲搞这个封装,是基于DQL的元数据树做多维分析,能自动解决JOIN等一些难题,提前CUBE建模的步骤就基本省去了。

         2、没有内置用户权限系统,要根据自己已有系统登录用户的权限,通过在session中设置隐含条件、JS变量中设置资源路径等方式进行控制。

         3、分析结果以分组、交叉表格、不同种类的统计图展示,制作这些图表不是个小工程,润乾多维分析的代码里确实也没自己制作,是借用了润乾报表API,根据分析操作用JAVA程序生成润乾报表(*.rpx,通常是用设计器制作润乾报表的)

         4、运行环境中集成了集算器脚本,可以处理一些需要特殊编程才能支持的数据,比如有的多维分析内置了读取excel文件的能力,但不支持读取txtcsvjson文件,这些容易用一句类似的集算器脚本支持:file(a.csv).import@t(;,“,”)。有特殊数据来源,或需要复杂计算,或需要解决性能的计算,都可以用这种集算器脚本实现。

 

         在细究这些特殊点之前,先看一下都有哪些相关源代码。

         浏览器端的Javascript源代码都在{WEB根目录}/raqsoft/guide/js/下,主要的js文件有dqlApi.jsdqlreport.jsquery.jsraqsoftApi.jswhere.jscommon.js

         JSP中的taglib技术展示页面,taglib定义在{WEB根目录}/WEB-INF/raqsoftAnalyse.tld,实现taglibJava类是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,提供JDBC驱动,连接DQL Server做查询;

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

         raqsoftReport.jar润乾报表。

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

 

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

 

生成元数据树

         多维分析界面中指定一个DQL Server类型的数据源时,会显示它的元数据树用于分析:

..

         从源码角度追踪一下如何获得这棵树,在query.js中用mdUtils.getTables()获得所有元数据表,经过权限过滤后,形成树的节点,用一个JS控件ztree生成界面上的树:

..

         mdUtils.getTables()是基于一个大的JS对象dqlQuery.lmd,它基本上等同于DQL Server中的整个元数据文件内容:

..

         JS中的lmd变量是用一个getLmdajax请求从WEB服务器获得:

..

         WEB服务器中,向DQL Server数据源执行一句”metadata”获得整个元数据,它返回一个大JSON串,基本上包含了整个语义层的信息:

..

         除了上面这个语句,还提供了一系列list语句,得到元数据中不同种类的信息:

       list table;

       list dim;

       list dim table of 客户;

       ……

       调用方法一样:ResultSet rs = dqlStatement.executeQuery("list table");

自动生成查询DQL

       基于元数据树做多维分析,选出一些字段(包括深层的广义字段)、分组、聚合、过滤条件等,所有动作组合到一个JSONdqlSegments中,用queryDqlData请求提交给WEB服务器,拼DQL、查数据:

..

       dqlSegments的格式如下,用DqlUtil.getDql()方法拼成最终的DQL语句:

..

       注意getDql方法的一个参数outerConditions,它来自session中针对表的预设条件,自动的拼入DQL中,实现权限控制。

..

       queryDqlData请求最终会执行拼好的DQL,并把数据集缓存在服务器上,等待下一步生成报表时使用。

..

用润乾报表API生成展示报表

         数据查询成功后,就会用genReport请求生成报表:

..

         下面的genReport请求源代码,经过简化,演示了用润乾报表API生成一个报表的主要过程,实际API会详细控制每个格子是什么表达式,什么颜色外观、行列的宽高等等。最终生成的报表对象继续缓存到服务器的session中:

..

         需要生成统计图方式的报表,或个性化复杂格式的表格时,可以用报表设计器预制一个报表模板(template.rpx),然后给预制的模板增补上数据集,也能创建一个完整的报表:

..

 

         session中的报表对象,用一个展示报表的jsp就能显示出来了。

..

用集算器脚本API拓展数据处理能力

         在界面中能看到集算器脚本(*.dfx)类型的数据集,

..

     有两点需要说明,一是服务器上可选用的脚本文件列表。哪个用户可以选哪些脚本文件,可以用下面这样的JS变量控制:

..

界面初始化的时候,会用getFiles请求去服务器获得各种可用的资源文件列表,除了 dfx,还可能会有待分析数据文件 *.xls、*.csv、多维分析文件 *.olap 等。这也属于用户权限的控制。

第二点是集算器脚本 (或脚本文件) 在服务器上怎么执行,也有相关的 API 可用:

..

集成润乾多维分析方式的思考

         润乾多维分析的结果图表样式、显示细节等展示能力相对较弱,虽然它依靠的润乾报表有能力应对复杂图表,但多维分析界面未细致设计,没有充分利用润乾报表API。这方面如果期望较高,就要重新设计多维分析界面,同时使用更多的润乾报表API进行二次开发。

         对元数据树的操作流程和风格不满意,也可以弃用,开源代码的流程仅供参考。借用独立的DQL Server,自己仍然能够实现出比较敏捷的多维分析系统来。

         总的来说,不苛求美术效果,系统无需重度管理时,润乾的开源系统能较敏捷的实现多维分析。如果保留敏捷性的同时,有较大的个性化需求时,选用DQL Server和润乾报表这两个技术门槛比较高的基础功能模块,应该能让开发过程事倍功半。集算器脚本针对特殊的数据处理有帮助,采不采用,对多维分析系统结构影响不大。