2011-02-04 12 views
4

Olap4j에서 몬드리안 OLAP 엔진을 사용하는 애플리케이션을 계획하고 사용자에게 데이터를 표시하거나 표시해야합니다. 모든 백엔드 항목을 이해하지만 뷰 계층에 데이터를 표시하는 방법을 잘 모르겠습니다.몬드리안 OLAP 엔진 + Olap4j 데이터 프레젠테이션

예를 들어 olap4j에는 SELECT를 콘솔에 멋지게 인쇄하는 포맷터가 있습니다.

olap4j에서 얻은 데이터는 어떻게 뷰 레이어에 표시됩니까? 난 그냥 olap4j API를 통해 갔는데, 어떻게 든 처리하고 표시 할 수있는 양식으로 결과를 얻는 데는 아무 것도없는 것처럼 보입니다. 이 프로세스가 Pentaho 솔루션의 일부입니까? 그렇게하지 않으면 몬드리안 OLAP 엔진과 olap4j에서 데이터를 제시하는 것이 쉽지 않습니다.

편집 : 전통적으로 데이터베이스의 일부 데이터를 내 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 포맷터를 확인할 수도 있지만 조금 깁니다.