4

Olap4j で Mondrian OLAP エンジンを使用し、ユーザーにデータを提示/表示するアプリケーションの計画を少し行っています。バックエンドのことはすべて理解していますが、ビュー レイヤーにデータを表示する方法がわかりません。

たとえば、olap4j には、SELECT をコンソールに適切に出力するフォーマッタがあります。

olap4j から取得したデータはビュー レイヤーにどのように表示されますか? 私はolap4j APIを調べましたが、何らかの方法でさらに処理して表示できる形式で結果を取得するためのものはないようです。このプロセスは Pentaho ソリューションの一部ですか? そうでなければ、Mondrian OLAP エンジンと olap4j だけからデータを表示するのは本当に簡単ではありませんか?

編集:私は伝統的にデータベースからDTOにデータを取得し、それをビューレイヤーに表示することに慣れています。しかし、このような複雑な結果セットの DTO を作成するにはどうすればよいでしょうか?

4

1 に答える 1

5

少しトリッキーですが、独自のビューレイヤーを作成できます。

OlapStatement .executeOlapQuery() はCellSetを返します。それを処理する必要があります。仕様も読んでください。これは良い情報源です。

これが作成する例ですList<List<MyCell>>(最良の表現ではありませんが、それがどのように機能するかを理解するのは簡単です)。これにより、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;
}

次のコンストラクターを使用して MyCell クラスを作成します。

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

フィルターを表示することを忘れないでください。そのために Cellset.getFilterAxis() を使用してください。

SourceForge でRectangular formatter を確認することもできますが、少し長くなります。

于 2011-02-16T19:04:21.183 に答える