mondrian 源码解读(六)-创建CUBE

在第4节中,构建query的时候,有一个非常重要的东西被我忽略了,那就是构建cube Util.lookupCube(statement.getSchemaReader(), cube, true),下面我们来谈谈cube是如何构建的。

Cube是什么?

在第2节中,我们已经谈论了cube,即维度和度量的组合。

RolapCube

在理解了Cube后,我们就可以理解RolapCube了。根据字面意思,我们也可以理解为关系型联机分析处理cube。我们看看它里面主要是实体对象:

//不解释
protected Dimension[] dimensions;

//
private final RolapHierarchy measuresHierarchy;

/**
 * List of calculated members.
 * 定义在schema中的计算成员,注意公式是如何转换的呢?
 */
private final List<Formula> calculatedMemberList = new ArrayList<Formula>();

private RolapStar star; //关联的星型模型

//在Evaluator中用于计算当前成员是否为空,如果当前度量成员中有count聚合,即为当前成员,如果没有找到,创建一个虚拟的count聚合为测量的成员。
RolapBaseCubeMeasure factCountMeasure;

calculatedMemberList这里谈一下。如何将schema中定义的计算成员转换成已近解析好的Formula?
这里其实很简单,通过构造一个特定的mdx:
with member [Measures].[aa] as 'expression1' , [Measures].[bb] as 'expression2'select from cube
然后使用parser解析器解析mdx后返回一个query,query里面的计算成员即为此计算成员。

RolapStar是什么?

我们可以将它理解为一个关联了物理表之间的关系的对象。通过它来生成特定的sql,查询需要的数据。
具体实体对象大家可以打开看看,这里不做详细的解释了。

private DataSource dataSource;
private final Table factTable;
private final List<Column> columnList = new ArrayList<Column>();

Table对象..星型模型
public static class Table {
    private final RolapStar star;
    private final MondrianDef.Relation relation;
    private final List<Column> columnList;
    private final Table parent;
    private List<Table> children;
    private final Condition joinCondition;
    private final String alias;
}

源码修改

cube的创建是根据schema中定义的属性配置来创建cube,这部分没有细看,如何创建其实我们并不关系,理解cube的数据结构就行了。

我们在修改mondrian源码时,将cube创建这块全部去掉了,取而代之的使用了自己的cube创建方式。由于我们底层的存储结构不依赖与xml,而是我们自己定义好的实体间的关系,所以我们将我们的实体转换成了cube。