原创文章,转载请注明出处:http://qq85609655.iteye.com/blog/2269398
MONDRIAN-1034
Wrong SQL generated when aggregations designed and name column assigned.
http://jira.pentaho.com/browse/MONDRIAN-1034
这是一个不算bug的bug
http://forums.pentaho.com/showthread.php?167045-Mondrian-generates-the-wrong-SQL-(SqlTupleReader)-when-aggregations-is-called&s=958ed57ae5d180f51fcf79f4ddf80362&p=381287
在使用聚合表的情况下,使用一个维度,查询数据,没有配置nameColumn的时候,正常,
如果配置了这个属性,就报错。
错误的原因其实很简单,作为退化维,那么聚合表agg里面AggLevel存储维度值,按照理论是不再与维度关联,但是有时候业务场景比较复杂,agg表里面存储的是外键值,作为外键,展现的时候,显示外键值,业务人员是看不懂的,必须显示nameColumn的值,于是就必须关联维度了。
外键就外键吧,替换为AggForeignKey,这我也接受了,可是,有些指标类似,平均值和方差不允许二次迭代运算,这个场景,多个level替换为AggForeignKey后,需要过多个Hierarchy配置,解决不同level与聚合表匹配的问题,不过非常的不优雅,
使用通过[Dimensioname.Hierarchyname].[levelname]进行mdx,不够通用。
这开源的东西真够蛋疼的,有时候被搞得吐血,这么个问题,折腾了好几天。。。
官方的jira放了好几年了,这个bug也没有修复。。。看来要嘛绕过去,不用mondrian了,要嘛解决问题迎难而上。
跟着源代码,再一次跟着了源代码,发现了问题所在,测试了下,搞定。。。
修改mondrian.rolap.SqlContextConstraint.java添加aggStar的判断
public void addLevelConstraint( SqlQuery sqlQuery, RolapCube baseCube, AggStar aggStar, RolapLevel level) { if (aggStar == null && !isJoinRequired()) { return; } SqlConstraintUtils.joinLevelTableToFactTable( sqlQuery, baseCube, aggStar, evaluator, (RolapCubeLevel)level); }
OK,搞定
这里提醒下自己,在saiku上,进行多维分析时,插件使用了自己的mondrian版本,目前,saiku2.0使用了mondrian-3.6.5这个版本和biserver-ce-5.3.0.0-213里tomcat里面的pentaho的mondrian3.9的版本并不一致,同时发现将修改后的类放到webapp/WEB-INF/classes无效,所以,这里需要将其放到biserver-ce-5.3.0.0-213\biserver-ce\pentaho-solutions\system\saiku下,主要还是classpath类加载的问题,特别需要反复检查。