公司原来使用的 OLAP 服务器为 SSIS (MicrosoftSQLServer2008IntegrationServices),因为部分原因,现需要使用 java 版 Mondrian 开源 OLAP作为服务器, 在展示层不变的情况下,Mondrian 和 SSIS在查询返回结果集的时候生成的XML结构不同,而无法解析展示出来。分析如下:
Mondrian 默认会在生成结果集的XML文件里添加 SlicerAxis,当查询语句里不带切片维的时候会多生成会在结果集xml中添加<Axis name="SlicerAxis"></Axis>和<AxisInfo name="SlicerAxis"><AxisInfo>标签,这样会引起原先SSIS展示层解析错误,其实也就是 Mondrian 和SSIS查询结果集的结构不同造成的,在这里需要对结果集做些过滤
改造代码如下:
修改 XmlaHandler 类 axisInfo(SaxWriter writer,CellSetAxis axis,String axisName):
private List<Hierarchy> axisInfo( SaxWriter writer, CellSetAxis axis, String axisName) { // writer.startElement( // "AxisInfo", // "name", axisName); List<Hierarchy> hierarchies; Iterator<org.olap4j.Position> it = axis.getPositions().iterator(); if (it.hasNext()) { final org.olap4j.Position position = it.next(); hierarchies = new ArrayList<Hierarchy>(); for (Member member : position.getMembers()) { hierarchies.add(member.getHierarchy()); } } else { hierarchies = axis.getAxisMetaData().getHierarchies(); } List<Property> props = getProps(axis.getAxisMetaData()); if(hierarchies!=null&&hierarchies.size()!=0){ writer.startElement( "AxisInfo", "name", axisName); writeHierarchyInfo(writer, hierarchies, props); writer.endElement(); // AxisInfo } return hierarchies; }
修改 XmlaHandler 类 axis(SaxWriter writer,CellSetAxis axis,List<Property> props,String axisName):
private void axis( SaxWriter writer, CellSetAxis axis, List<Property> props, String axisName) throws OlapException { if(axisName.equals("SlicerAxis")){ List<Position> positions = axis.getPositions(); Iterator<Position> pit = positions.iterator(); Position prevPosition = null; Position position = pit.hasNext() ? pit.next() : null; Position nextPosition = pit.hasNext() ? pit.next() : null; while (position != null) { int k = 0; for (Member member : position.getMembers()) { writer.startElement( "Axis", "name", axisName); writer.startSequence("Tuples", "Tuple"); writer.startSequence("Tuple", "Member"); writeMember( writer, member, prevPosition, nextPosition, k++, props); writer.endSequence(); // Tuple writer.endSequence(); // Tuples writer.endElement(); // Axis } prevPosition = position; position = nextPosition; nextPosition = pit.hasNext() ? pit.next() : null; } }else{ writer.startElement( "Axis", "name", axisName); writer.startSequence("Tuples", "Tuple"); List<Position> positions = axis.getPositions(); Iterator<Position> pit = positions.iterator(); Position prevPosition = null; Position position = pit.hasNext() ? pit.next() : null; Position nextPosition = pit.hasNext() ? pit.next() : null; while (position != null) { writer.startSequence("Tuple", "Member"); int k = 0; for (Member member : position.getMembers()) { writeMember( writer, member, prevPosition, nextPosition, k++, props); } writer.endSequence(); // Tuple prevPosition = position; position = nextPosition; nextPosition = pit.hasNext() ? pit.next() : null; } writer.endSequence(); // Tuples writer.endElement(); // Axis } }