2011-02-04 4 views
4

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

たとえば、olap4jには、SELECTをコンソールにきれいに印刷するフォーマッタがあります。

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

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

+0

私はsaikuみんなにチャットしています..あなたはすでにhaventと思いますか? – Codek

答えて

5

独自のビューレイヤーを作成することはちょっと難しいことです。

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

ここでは、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のRectangularフォーマッタをチェックすることもできますが、もう少し時間がかかります。

関連する問題