mondrian源码分析与说明 联系客服

发布时间 : 星期日 文章mondrian源码分析与说明更新完毕开始阅读bf3b867f2e3f5727a5e96245

2.5.2.2. FastBatchingCellReader类

主要方法,Object get(Evaluator evaluator)

? 首先根据当前的上下文环境(即一组members)创建cellRequest,cellRequest中包

含了所有必要的从star中取值的信息。该组members的交集便是要求值的单元格,其中切片轴上的成员和其他轴上的成员完全同等对待;其中度量轴上的成员要求上StoredMeasure(非计算成员CaculatedMember);度量值上的成员位于第一个。通过调用request的addConstrainedColumn()方法把各member对应的column

和value(属StarColumnPredicate)值加至到request中.

? 调用AggregationManager.getCellFromCache(request,pinnedSegments)方法从

缓存中获取cell值。首先根据request中的列组索引标识从缓存中获取

aggreation缓存对象,如果为空说明缓存还未建立则直接返回null,如果有值则调用aggregation.getCellValue(measure,colValueKeys)方法获取缓存的cell值;getCellValue内部首先会根据measure查找匹配的segment,然后调用segment.getCellValue(keys)从segment的dataset缓存集中查找相应的cell值。 ? 如果getCellFromCache返回为null则调用recordCellRequest()记录需求。这

些cell request会被组织成多个cell request batch,以便将来聚合层进行批读取以提高效率。关于batch的详细讨论参见下面Batch类章节。

? 上层会在适当的时候调用batchCellReading.loadAggregations()以实际读取这些cell

值,前提是batches对象中已有cellRequest了。每个batch的读取参见batch. loadAggregation()方法,最终调用聚合层的方法,参见aggreation.load(….)。

2.5.2.3. FastBatchingCellReader.Batch类

每个batch对应与一组特定的columns环境下的cell求取(具有相同的列和列值(列值是具体的值,不会是“all”值));从batch的属性可以看出batch包含了哪些上下文:

? RolapStar.Column[],这个指明了基于哪些列(也即基于哪些维度,包括切片维度)

进行读取;

? Set[],保存了每列的限定值,对于一列而言,限定值可能会

有多个(毕竟是批处理,一次请求多个);

? MeasureList,指明求取哪些度量值上的cell(度量值本质是度量维上的限定值)。 ? BitKey,该batch的唯一索引。

如图所示的一个mdx查询结果界面:

此时会产生两个batch,每个batch最终可能会产生若干segment,segment是cells的集合,segment数和度量值个数相同。

? 一个batch是(其中“当量数/适应交通量=拥挤度”,拥挤度是计算成员),最终产生

3个segment,每个segment只有一个cell: ? (地市=’宁波市’,measure=’观察里程’) ? (地市=’宁波市’,measure=’当量数’) ? (地市=’宁波市’,measure=’适应交通量’)

? 另一个batch是(其中的G310等是路线代码,最终过滤掉空值后就剩下两个了) ,

最终产生3个segment,每个segment有多个cell:

? (地市=’宁波市’,roadId in (G310,G322,G210,S321….),measure=’观察里程’) ? (地市=’宁波市’,roadId in (G310,G322,G210,S321….),measure=’当量数’) ? (地市=’宁波市’,roadId in (G310,G322,G210,S321….),measure=’适应交通量’)

2、 …

2.5.3. RolapResult类

RolapResult 是一个运行中的请求的结果集。

Mondiran的执行结果由RolapResult类表单,由于mdx查询语句本身就包含on rows(行轴上)、on columns(列轴上)和where部分(切片轴上),结果集中相对应的为ROlapAxis对象,这其中有个sliceAxis对象。因此结果集是由若干ROlapAxis对象和一个RolapCell组构成的。每个axis对象又由若干Position对象组成,每个Position对象又可能由若干

member组成(注意一个postion会横跨多个维度的成员)。注意ROlapAxis是抽象类,实际的对象类可能随着不同的轴是不同的。如图:

图中,column轴上两个position(每个position含有一个成员),分别是:

[[Measures].[YJD]] [[Measures].[GCLC]]

Row轴上有三个position(每个position含有二个成员),分别是:

[[dimLX].[All dimLXs], [dimTime].[All dimTimes]]

[[dimLX].[All dimLXs].[宁波—梁辉], [dimTime].[All dimTimes]] [[dimLX].[All dimLXs].[同江-三亚], [dimTime].[All dimTimes]]

切片轴上则有一个position:[[dimStation].[All dimStations].[宁波市]]

单元值们则放置在RolapResult中的cellInfos对象里,属CellInfoContainer接口,其中存放着CellInfo,并通过Cellkey进行索引。

CellKey:用于在maps里访问cellinfo时使用的键值,根据cell的位置来决定键值。CellKey共有四个默认实现,及zero、one、two、three和many版的实现,分别对应着轴的个数。这些类中关键的属性便是存储各轴的位置值。

CellInfo、CellInfoContainer:内部类。CellInfo包含了一个cell所需要的所有信息(最关键的包含value值和一些formatter设置);最终将作为构造ROlapCell对象的参数。CellInfoContainer显然是cellInfo的容器,并使用CellKey来索引。

ROlapCell:最终返回给jpivot的cell单元值。

2.5.4. RolapEvaluator类

最终负责在多维环境中执行mdx表达式。

该类中维护一个很重要的对象,即currentMembers,该上下文对象针对每个维度都包含了一个成员;通过setContext方法用来设置当前维度,以开始计算当前维度组合下的表达式值。

2.5.5. 关于排序

排序有单元值排序和维度成员排序两种场景,但单元值排序优先级更高,只有当单元值排序相当时,才再对成员值进行排序。

单元值排序有六种,升序、降序、打破Hierarchy升序、打破Hierarchy降序、top count、bottom count。其中前四种参见:FunUtil.SortMembers()中的方法,这是总入口,其中有BreakMemberComparator、HierarchicalMemberComparator、BreakArrayComparator、HierarchicalArrayComparator等排序器(Array包含多个member,此时相当于cell上下文环境由多个维度参与)。

对于array类排序,参见其中的public int compare(Member[] a1,Member[] a2)方法;