MONDRIAN-1034

原创文章,转载请注明出处: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类加载的问题,特别需要反复检查。

 

你可能感兴趣的:(MONDRIAN-1034)