saiku多sort改造

    xiaoxiao2021-03-25  79

    saiku原生支持在行和列上添加排序规则,如果需要对维度分别设置上排序则需要进行代码改造 首先要了解saiku生成mdx的规则:主要依靠saiku-query这个工具(https://github.com/OSBI/saiku-query)。 saiku中ThinQuery与页面对应记录行列信息包含维度、层级等,查询时,请求发送至服务端,由Fat的convert方法将ThinQuery对应转化成saiku-query中的Query对象,然后Olap4jNodeConverter.toQuery生成对应的mdx,具体生成mdx的规则详见代码 知晓规则之后,在mdx中添加上sort就简单了: 首先定义SortOrder和sortEvaluationLiteral,如果加在QueryHierarchy级别则不需要额外定义,这个类继承了AbstractSortableQuerySet,同saiku的ThinHierarchy,如果加载level级别,就需要自己定义了,QueryLevel和ThinLevel都要加上。在Fat的convertHierarchy遍历level时,将sort的相关信息传递 if(tl.getSortOrder() != null){ if(tl.getSortEvaluationLiteral() == null) ql.sort(org.saiku.query.SortOrder.valueOf(tl.getSortOrder().name()), qh.getUniqueName() + ".CurrentMember.OrderKey"); else ql.sort(org.saiku.query.SortOrder.valueOf(tl.getSortOrder().name()), tl.getSortEvaluationLiteral()); } if(level.getSortOrder() != null){ LiteralNode evaluatorNode = LiteralNode.createSymbol( null, level.getSortEvaluationLiteral()); baseNode = new CallNode( null, "Order", Syntax.Function, baseNode, evaluatorNode, LiteralNode.createSymbol( null, level.getSortOrder().name())); } Olap4jNodeConverter的toLevel方法中添加如上代码,打完收工!
    转载请注明原文地址: https://ju.6miu.com/read-15180.html

    最新回复(0)