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方法中添加如上代码,打完收工!