2011-02-04 2 views
4

Я занимаюсь небольшим планированием приложения, которое использует модем Mondrian OLAP с Olap4j и должно представлять/отображать данные пользователю. Я понимаю все вспомогательные материалы, но я не уверен, как мне отображать данные на уровне представления.Презентация данных от двигателя Mondrian OLAP + Olap4j

Например, olap4j имеет форматировщик, который красиво отображает SELECT в консоли.

Как данные, которые я получаю от olap4j, отображаются в виде слоя? Я просто прошел через API olap4j, и, похоже, ничего не получается для получения результата в форме, которую можно каким-то образом обработать и отобразить. Является ли этот процесс частью решения Pentaho? Так что в противном случае на самом деле не так просто представить данные только с моделями Mondrian OLAP и olap4j?

EDIT: Я привык традиционно получать некоторые данные из базы данных в DTO и отображать их в виде слоя. Но как мне создать DTO для такого сложного набора результатов?

+0

Я бы пообщался с парнем сайку .. Предполагая, что у вас уже нет? – 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() для этого.

Вы также можете проверить форматирование Rectangular на SourceForge, но это немного дольше.

Смежные вопросы