gpt4 book ai didi

olap - Mondrian OLAP 引擎 + Olap4j 的数据呈现

转载 作者:行者123 更新时间:2023-12-02 11:04:31 28 4
gpt4 key购买 nike

我正在对一个应用程序进行一些规划,该应用程序使用 Mondrian OLAP 引擎和 Olap4j,并且应该向用户呈现/显示数据。我了解所有后端内容,但我不确定应该如何在 View 层中显示数据。

例如,olap4j 有一个格式化程序,可以将 SELECT 很好地打印到控制台中。

从olap4j获取的数据如何显示在 View 层中?我刚刚浏览了olap4j API,似乎没有任何东西可以以可以某种方式进一步处理和显示的形式获取结果。这个过程是 Pentaho 解决方案的一部分吗?那么,仅从 Mondrian OLAP 引擎和 olap4j 呈现数据真的不容易吗?

编辑:我习惯于传统上从数据库获取一些数据到我的 DTO 中并将其显示在 View 层中。但是如何为如此复杂的结果集创建 DTO?

最佳答案

您可以创建自己的 View 层,只是有点棘手。

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 上的格式化程序,但它有点长。

关于olap - Mondrian OLAP 引擎 + Olap4j 的数据呈现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4893993/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com