1、组成部分
a) mondrian.olap.fun定义了mdx内置的函数集,包括函数的name、signature、description和flags,其中flags一般有三个以上的字母,分别代表了函数的语法类型(在Syntax中定义)、返回类型(Category中定义)、参数类型(Category中定义)。这种函数继承至FunDefBase类。
b) 用户自定义的函数包括两种,实现了UserDefinedFunction接口,一种是根据已有的内置函数拼接MDX,这种函数在进行第一次Query生成后,调用Query的toString时,调用了Util的unparse时,通过MdxFuncWrapper拼接完成;另一种,在MDX解析时调用其execute时起作用。
2、加载过程
a) RolapSchema在加载Schema XML时,会对全局GlobalFunTable初始化,其中包括内置方法BuiltinFunTable初始化和UserDefinedFuntion的初始化。
3、解析方式
a) 第一次解析Query时,在把ExpCompiler将Exp转换成Calc的过程中需要调用其compileCall进行解析生成对应的Calc
b) 然后使用Query的toString方法对生成的Query进行重新逆向解析,因为Query中包含用第一种方式用户自定义的方法,这种方法需要用Util的unparse进行解析。解析后返回MDX字符串。
c) 由于MDX字符串的变化就需要重新进行解析Query。
4、计算逻辑
a) 函数的计算真正发生在RolapConnection对Query的解析过程中,解析的结果是返回一个RolapResult。RolapResult创建使用了所谓的Evaluator算法:在第一步中,需要决定每个轴上的所有成员,被发现的成员都被加入到AxisMember,在此期间,调用方法的对象生成的Calc对象的方法。