Mondrian SlicerAxis 引起的错误

    公司原来使用的 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
	}
}

 

猜你喜欢

转载自jnwzping.iteye.com/blog/1850379