前言:
在mondrian中,所有数据的来源都是聚集层,储存层把mdx语句生成的sql执行完后,再到聚集层中做整理,存入外部缓存。
今天要讲的类:
SegmentLoader.java。
主要说下 loadImpl()方法中主要方法的主要作用。
1. createExecuteSql( ) 生成sql。
2. processData( ) ,将维度每一列的值都加载到 axisValueSets属性中,他为sortedSet,值有序不重复。axisContainsNull 为此列是否为空的标识(这里我认为是有bug的)。返回值即为所有维度、度量的值。
3. setAxisDataAndDecideSparseUse( ),axes参数中即为多个SegmentAxis对象,每一个对象对应一个维度列。mapKeyToOffset为真正的值,空值为 #null。
4. createDataSetsForGroupingSets( ),整理以上个属性。
5. loadDataToDataSets( ) ,创建pos坐标,这是为每一个维度值在结果中的顺序坐标,这个是后面从缓存中取数据的关键,只要有一个坐标值对不上,那就取不出数据。axis.getOffset((Comparable) o) ,这个方法是关键。
6. setDataToSegments( )这个方法主要是把数据存到外部缓存,核心方法:cacheSegment(cacheMgr, segment.star, header, body),segmentWithData 就是附带数据的每一个段,一个度量对应一个段(segement)。