简体   繁体   English

从Mondrian OLAP引擎+ Olap4j中呈现数据

[英]Presentation of data from Mondrian OLAP engine + Olap4j

I'm doing a little bit of planning of an application that uses Mondrian OLAP engine with Olap4j and should present/display data to user. 我正在计划一个使用Mondrian OLAP引擎和Olap4j的应用程序,并且应该向用户显示/显示数据。 I understand all the back-end stuff, but I'm not sure how should I display the data in the view layer. 我理解所有的后端内容,但我不确定如何在视图层中显示数据。

For example olap4j has a formatter that prints the SELECT nicely into the console. 例如,olap4j有一个格式化程序,可以很好地将SELECT打印到控制台中。

How is the data that I get from olap4j displayed in view layer ? 我从olap4j获得的数据如何显示在视图层中? I just went through the olap4j API, and there doesn't seem to be anything for getting the result in a form that can be somehow further processed and displayed. 我刚刚浏览了olap4j API,并且似乎没有任何东西可以以某种方式获得结果,可以以某种方式进一步处理和显示。 Is this process part of the Pentaho solution ? 这个过程是Pentaho解决方案的一部分吗? So that otherwise it is really not easy to present data just from Mondrian OLAP engine and olap4j ? 那么否则仅仅从Mondrian OLAP引擎和olap4j呈现数据真的不容易?

EDIT: I'm used to traditionally get some data from a database into my DTO and display it in view layer. 编辑:我习惯于传统上从数据库中获取一些数据到我的DTO中并在视图层中显示它。 But how do I create DTOs for such a complicated result set ? 但是如何为这样复杂的结果集创建DTO呢?

You can create your own view layer it's just a little bit tricky. 你可以创建自己的视图层,这有点棘手。

OlapStatement .executeOlapQuery() returns a CellSet , you will have to work with that. OlapStatement .executeOlapQuery()返回一个CellSet ,你必须使用它。 Also read the specifications , it's a good source of information. 另请阅读规格 ,这是一个很好的信息来源。

Here is an example, that creates List<List<MyCell>> (not the best representation but it's easy to undarstand how it works). 下面是一个示例,它创建了List<List<MyCell>> (不是最好的表示,但很容易解读它是如何工作的)。 This creates a table similar to http://www.olap4j.org/api/index.html?org/olap4j/Position.html (without the "Gender" and "Product" labels). 这将创建一个类似于http://www.olap4j.org/api/index.html?org/olap4j/Position.html的表格(不包含“Gender”和“Product”标签)。

private final static int COLUMNS = 0; //see Cellset javadoc
private final static int ROWS= 1; //see Cellset javadoc
/**
* Outer list: rows, inner list: elements in a row
*/
private List<List<MyCell>> getListFromCellSet(CellSet cellSet) {
    List<List<MyCell>> toReturn= new ArrayList<List<MyCell>>();
    //Column header
    //See http://www.olap4j.org/api/index.html?org/olap4j/Position.html on how Position works, it helps a lot
    //Every position will be a column in the header
    for (Position pos : cellSet.getAxes().get(COLUMNS).getPositions()) {
        for (int i = 0; i < pos.getMembers().size(); i++) {
            if (toReturn.size() <= i) {
                toReturn.add(i, new ArrayList<MyCell>());
            }
            Member m = pos.getMembers().get(i);
            MyCell myCell = new MyCell(m); //use m.getCaption() for display
            toReturn.get(i).add(myCell );
        }
    }
    //Put empty elements to the beginning of the list, so there will be place for the rows header
    if (cellSet.getAxes().get(ROWS).getPositions().size() > 0) {
        for (int count=0; count < cellSet.getAxes().get(1).getPositions().get(0).getMembers().size(); count++) {
            for (int i = 0; i < toReturn.size(); i++) {
                toReturn.get(i).add(0, new MyCell());
            }
        }
    }
    //Content + row header
    for(int i = 0; i < cellSet.getAxes().get(ROWS).getPositionCount(); i++) {
        List<MyCell> row = new ArrayList<MyCell>();
        //Header
        for (org.olap4j.metadata.Member m : cellSet.getAxes().get(ROWS).getPositions().get(i).getMembers()) {
            row.add(new MyCell(m));
        }
        //Content
        for (int j = 0; j < cellSet.getAxes().get(COLUMNS).getPositionCount(); j++) {
            ArrayList<Integer> list = new ArrayList<Integer>();
            list.add(j); //coordinte
            list.add(i); //coordinte
            row.add(new MyCell(cellSet.getCell(list))); //use cell.getFormattedValue() for display
        }
        toReturn.add(row);
    }
    return toReturn;
}

Create the MyCell class with these constructors: 使用这些构造函数创建MyCell类:

public class MyCell {   
    ...
    public MyCell(){...}
    public MyCell(Member m){...}
    public MyCell(Cell c){...}  
}

Don't forget to display the filters, use Cellset.getFilterAxis() for that. 不要忘记显示过滤器,使用Cellset.getFilterAxis()。

You can also check the Rectangular formatter on SourceForge, but it's a bit longer. 您还可以检查SourceForge上的矩形格式化程序,但它会更长一些。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM