mondrian 源码解读(番外篇)-Calc层次结构

接口层

首先我们看Calc的接口。
他下面还有11个其他类型的计算器接口,分别是:

  • VoidCalc 接口 void evaluateVoid(Evaluator evaluator)
  • MemberCalc 接口 Member evaluateMember(Evaluator evaluator)
  • LevelCalc 接口 Level evaluateLevel(Evaluator evaluator)
  • DateTimeCalc 接口 Date evaluateDateTime(Evaluator evaluator)
  • DimensionCalc 接口 Dimension evaluateDimension(Evaluator evaluator)
  • HierarchyCalc 接口 Hierarchy evaluateHierarchy(Evaluator evaluator)
  • DoubleCalc 接口 double evaluateDouble(Evaluator evaluator)
  • BooleanCalc 接口 boolean evaluateBoolean(Evaluator evaluator)
  • TupleCalc 接口 Member[] evaluateTuple(Evaluator evaluator)
  • StringCalc 接口 String evaluateString(Evaluator evaluator)
  • IntegerCalc 接口 int evaluateInteger(Evaluator evaluator)

抽象层

AbstractCal实现了Calc接口。
在它下面有10种不同的抽象计算器,分别实现了上述的11中接口类型。
注意AbstractVoidCalc并没有继承。

  • GenericCal 抽象类 实现了所有的Calc下层接口,除了Calc的Object evaluate(Evaluator evaluator)接口
  • AbstractMemberCalc 抽象类 需实现Member evaluateMember(Evaluator evaluator)
  • AbstractLevelCalc 抽象类 需实现Level evaluateLevel(Evaluator evaluator)
  • AbstractDimensionCalc 抽象类 需实现Dimension evaluateDimension(Evaluator evaluator)
  • AbstractHierarchyCalc 抽象类 需实现Hierarchy evaluateHierarchy(Evaluator evaluator)
  • AbstractDoubleCalc 抽象类 需实现double evaluateDouble(Evaluator evaluator)
  • AbstractBooleanCalc 抽象类 需实现boolean evaluateBoolean(Evaluator evaluator)
  • AbstractTupleCalc 抽象类 需实现Member[] evaluateTuple(Evaluator evaluator)
  • AbstractStringCalc 抽象类 需实现String evaluateString(Evaluator evaluator)
  • AbstractIntegerCalc 抽象类 需实现int evaluateInteger(Evaluator evaluator)

通用层

GenericCal实现了这11个接口并继层了AbstractCal,在它下面还有几个实现类

  • AbstractVoidCalc 具体类,不返回任何值,这个类貌似应该继承AbstractCal即可,没必要继承GenericCal。
  • ConstantCalc 具体类 求值结果与原参数相同。
  • TupleValueCalc 具体类 在当前元组上下文中求cell值。
  • ValueCalc 具体类 直接在当前上下文中求Cell值
  • MemberArrayValueCalc 在多个成员上下文中求Cell值
  • CacheCalc 具体类 在缓存中获取Cell值
  • MemberValueCalc 具体类 在当前成员上下文中求Cell值

集合层

还有一种特殊类型IterCalc接口也继承了Calc。
ListCalc接口也继承IterCalc.
他们有4个类

  • AbstractIterCalc实现了IterCalc,并继承了AbstractCal。
  • AbstractListCalc实现了ListCalc,并继承了AbstractCal。
  • GenericIterCalc实现了ListCalc和IterCalc,并继承了AbstractCal。
  • IterableCalc继承了AbstractListCalc

使用

那么问题来了,有了这么多求值器,我应该在程序中使用哪种呢?下面将对如何选择各个层做分析。

  • 如果是求一般的成员,维度,数值,级别等等。那么,使用抽象层即可。
  • 如果是求集(Set)类型的,那么使用集合层。
  • 如果是求Cell值或者其他操作,那么使用通用层。