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)方法;
相关推荐: