Presentazione di dati dal motore Mondrian OLAP + OLAP4J
-
28-10-2019 - |
Domanda
Sto facendo un po 'di pianificazione di un'applicazione che utilizza il motore Mondrian OLAP con OLAP4J e dovrebbe presentare/visualizzare i dati all'utente. Capisco tutte le cose back-end, ma non sono sicuro di come dovrei visualizzare i dati nel livello di visualizzazione.
Ad esempio, OLAP4J ha un formatter che stampa la selezione bene nella console.
Come vengono visualizzati i dati che ottengo da OLAP4J nel livello visualizzato? Ho appena attraversato l'API OLAP4J e non sembra esserci nulla per ottenere il risultato in una forma che può essere in qualche modo ulteriormente elaborato e visualizzato. Questo processo fa parte della soluzione Pentaho? Quindi altrimenti non è davvero facile presentare dati solo da Mondrian OLAP Engine e OLAP4J?
EDIT: sono abituato a ottenere tradizionalmente alcuni dati da un database nel mio DTO e visualizzarlo in vista. Ma come posso creare DTOS per un set di risultati così complicato?
Soluzione
Puoi creare il tuo livello di vista È solo un po 'complicato.
Olapstatement.executeolapquery () restituisce a Cella, dovrai lavorare con quello. Leggi anche il specifiche, è una buona fonte di informazioni.
Ecco un esempio, che crea List<List<MyCell>>
(Non è la migliore rappresentazione, ma è facile smantificare come funziona). Questo crea una tabella simile a http://www.olap4j.org/api/index.html?org/olap4j/position.html (senza etichette "genere" e "prodotto").
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;
}
Crea la classe Mycell con questi costruttori:
public class MyCell {
...
public MyCell(){...}
public MyCell(Member m){...}
public MyCell(Cell c){...}
}
Non dimenticare di visualizzare i filtri, utilizzare cellset.getFilteraxis () per questo.
Puoi anche controllare il Rettangolare Formatter su SourceForge, ma è un po 'più lungo.