我想实现一个为 MDX 查询提供支持的应用程序。为此,我想使用pentaho mondrian(具有 MDX 接口的开源 OLTP 服务器)中的一个库,它将 MDX 查询转换为下划线数据库的 SQL(基于 xml 描述),不幸的是我找不到任何信息我需要在我的项目中包含的库——以及如何使用它们——才能使 MDX 到 SQL 映射工作。
有没有人在她/他的应用程序中重用蒙德里安组件方面有一些经验?
我想实现一个为 MDX 查询提供支持的应用程序。为此,我想使用pentaho mondrian(具有 MDX 接口的开源 OLTP 服务器)中的一个库,它将 MDX 查询转换为下划线数据库的 SQL(基于 xml 描述),不幸的是我找不到任何信息我需要在我的项目中包含的库——以及如何使用它们——才能使 MDX 到 SQL 映射工作。
有没有人在她/他的应用程序中重用蒙德里安组件方面有一些经验?
Olap4j 现在是 pentaho mondrian 的一部分。也许您可以在 olap4j API 中找到信息?http://www.olap4j.org/
在此页面上,我看到:
org.olap4j.mdx.parser:MDX 查询语言的解析器。
olap4j 是用于 OLAP 的开放 Java API。
可以将其想象为 JDBC,但用于访问多维数据。
olap4j 旨在成为任何 OLAP 服务器的通用 API,因此您可以在一个 OLAP 服务器上编写应用程序并轻松地将其切换到另一个服务器。在该 API 的基础上,将会有越来越多的工具和组件。
我建议下载 Mondrian 的最新 3.2.0 版本,它与所有依赖项一起分发。发行版中还包括一个 ivy 文件,它描述了它的依赖关系。
最新版本: http://forums.pentaho.com/showthread.php?77035-Mondrian-3.2-GA-Schema-Workbench-and-Agg-Designer-stable-available-on-SourceForge& p=239443#poststop
文档也可以在 Pentaho 的网站上找到。祝你好运!
我正在使用由 hsqldb 支持的 Mondrian,以便开发人员针对内存中的 dbs 工作,但是当我们部署到真实环境时切换到非 Mondrian OLAP 实现。意味着我们可以做一些更灵活的开发,本质上只是使用 Mondrian 将 MDX 转换为 sql。
我创建了一个 SpringBoot/mvn 测试用例并使用此页面开始 - 复制 ROLAP ddl 和 Mondrian 映射模式。我使用了此处评论之一中的 MondrianDaoSupport 模板。同一页面还对所需的 mvn 依赖项有一些帮助(注意:我必须将 jflex 1.4.1 与 mondrian 3.2.0 一起使用才能解决 NPE 问题)。将 SpringBoot 与 hsqldb 一起使用,我使用测试启动时的数据创建了 ROLAP 模式。然后我将模式文件作为类路径资源注入,然后 Datasource 是自动连接的 hsqldb 数据源。到目前为止它运行良好 - 只需 ~ 秒即可运行 Junit 测试,该测试使用数据引导一个新的数据库并执行 MDX 查询。我预计在尝试使用更复杂的 MDX 查询时会出现一些问题——但让我们看看。
看起来 mondrian.rolap.agg.AggregationManager 有一些与之相关的代码,但它不是直截了当的。
parseTree = this.olap4jConnection.getMondrianConnection().parseStatement(mdx);
DrillThrough plan1 = (DrillThrough)parseTree;
Query query = plan1.getQuery();
query.setResultStyle(ResultStyle.LIST);
this.setQuery(query);
CellSet cellSet = this.executeOlapQueryInternal(
query,
(MondrianOlap4jCellSetMetaData) null
);
List coords = Collections.nCopies(cellSet.getAxes().size(), Integer.valueOf(0));
MondrianOlap4jCell cell = (MondrianOlap4jCell) cellSet.getCell(coords);
ResultSet resultSet = cell.drillThroughInternal(
plan1.getMaxRowCount(),
plan1.getFirstRowOrdinal(),
plan1.getReturnList(),
true,
(Logger)null,
rowCountSlot
);
如果按照最后一行,
cell.drillThroughInternal(...)
你最终会在这里
String sql = this.getDrillThroughSQL(fields, extendedContext);
但我不太确定 mondrian 是否只为 mdx 生成一个 SQL。我认为通过 XMLA(大多数工具用作接口),您可以请求在单个轴上进行钻取,其中不会重写完整的查询。
希望这个答案。