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