質問

Mondrian OLAPエンジンをOLAP4Jで使用し、ユーザーにデータを提示/表示する必要があるアプリケーションを少し計画しています。バックエンドのすべてを理解していますが、ビューレイヤーにデータをどのように表示するかわかりません。

たとえば、OLAP4Jには、セレクトをコンソールにうまく印刷するフォーマッタがあります。

OLAP4Jから取得したデータは、ビューレイヤーにどのように表示されますか?私はちょうどOLAP4J APIを通過しましたが、結果を何らかの形でさらに処理して表示できるフォームで取得するためのものは何もないようです。このプロセスはペンタホソリューションの一部ですか?そうでなければ、Mondrian OLAPエンジンとOLAP4Jからのデータを提示することは本当に簡単ではありませんか?

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

役に立ちましたか?

解決

独自のビューレイヤーを作成できますが、少し難しいです。

olapstatement.executeolapquery()はaを返します セルセット, 、あなたはそれで作業する必要があります。また読んでください 仕様, 、それは良い情報源です。

ここに、作成する例があります List<List<MyCell>> (最高の表現ではありませんが、それがどのように機能するかを告げるのは簡単です)。これにより、に似たテーブルが作成されます http://www.olap4j.org/api/index.html?org/olap4j/position.html (「性別」と「製品」ラベルなし)。

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のフォーマッタですが、もう少し長いです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top