我是ActivePivot中的新手,我想用DimensionType = time
创建一个维度,其中日期以分层方式显示。例如。对于30.01.2013
,我需要一年的一个级别 - > 2013
(降序排序),月份的一个级别(也是降序排序) - > 1天和一天的水平(也排序下降) - > 30, 29, 28, ...
通过ActivePivotLive查看应如下所示:
- 2013
- 1
- 30
- 29
- 28
- ...
+ 2012
+ 2011
等等。
我浏览了ActivePivot沙箱项目,但我找不到任何可以帮助我的东西。我在TimeBucket
中找到的EquityDerivativesCube
维度做了类似的事情,但是桶以不同的方式创建。
我该如何解决这个问题?
答案 0 :(得分:1)
好的,我把它处理掉了。
没有必要进行往返并实现维度。这可以通过levels
和a calculator
轻松完成
这里是EquityDerivativesCube.xml
<!-- Standard time buckets, bucketing performed at insertion -->
<dimension name="TimeBucket">
<properties>
<entry key="DimensionType" value="time" />
<entry key="IsAllMembersEnabled" value="true" />
</properties>
<level name="Year">
<properties>
<entry key="LevelType" value="TIME_YEARS" />
</properties>
<comparator pluginKey="ReverseOrder" />
</level>
<level name="Month">
<properties>
<entry key="LevelType" value="TIME_MONTHS" />
</properties>
<comparator pluginKey="Custom">
<order name="firstObjects">
<value>Jan</value>
<value>Feb</value>
<value>Mrz</value>
<value>Apr</value>
<value>Mai</value>
<value>Jun</value>
<value>Jul</value>
<value>Aug</value>
<value>Sep</value>
<value>Okt</value>
<value>Nov</value>
<value>Dez</value>
</order>
</comparator>
</level>
<!-- The Value Date level is the field Date -->
<level name="Value Date" property="Date">
<properties>
<entry key="LevelType" value="time" />
</properties>
<comparator pluginKey="ReverseOrder" />
</level>
</dimension>
我将以下代码段添加到PNLCalculator.enrichTrade
:
...
pnl = pnlVega + pnlDelta;
// Year and month calculations BEGIN
final Calendar cal = CALENDAR.get();
cal.setTime(trade.getDate());
final int year = cal.get(Calendar.YEAR);
final String month = DateFormatSymbols.getInstance(GERMANY).getShortMonths()[cal.get(MONTH)];
// Year and month calculations END
// instantiate the result that will hold the enrichment data
final PNLCalculatorResult result = new PNLCalculatorResult();
...
// add them to the result
result.setYear(year);
result.setMonth(month);
...
我还使用两个新字段扩展了SanboxFields.xml
:
...
<field name="Year" type="integer" />
<field name="Month" type="string" />
...
干杯!
答案 1 :(得分:0)
ActivePivot Sandbox应用程序中的TimeBucket维度根据财务时间段定义自定义分组。创建标准年份&gt;月份&gt;在ActivePivot中,日层次结构实际上更简单,更无缝。在描述中,如果模式需要声明三个字段(一个用于年份,一个用于月份,一个用于当天)。
<field name="Year" indexation="dictionary" />
<field name="Month" indexation="dictionary" />
<field name="Day" indexation="dictionary" />
然后你需要声明一个引用这些字段的维度。
<dimension name="Time">
<level name="Year" />
<level name="Month" />
<level name="Day" />
</dimension>
然后,ActivePivot将通过内省加载的记录来逐步构建时间层次结构。
如果输入记录(对象)已经包含Year属性,Month属性和Day属性(例如,如果输入记录是带有getYear(),getMonth()和getDay()方法的POJO,那么这将自动运行。如果不是这种情况,例如输入记录只有一个日期属性,你可以在将它们放入ActivePivot之前转换你的记录,或者在ActivePivot中注入一个计算器( com.quartetfs.biz.pivot.classification .ICalculator )将动态计算日期中的三个字段。请查看ActivePivot Sandbox应用程序以获取计算器示例。
通常使用标准Java代码来提取这些字段:
Date date = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
System.out.println("Date: " + date);
System.out.println("Year: " + calendar.get(Calendar.YEAR));
System.out.println("Month: " + calendar.get(Calendar.MONTH) + 1);
System.out.println("Day: " + calendar.get(Calendar.DAY_OF_MONTH));
关于维度级别中成员的排序,ActivePivot默认使用java对象的自然顺序(实现java.lang.Comparable接口的那些),因此日期和整数将从最低到最高排序。你可以通过在目标级别声明一个“ReverseOrder”比较器来轻松地反转它。
<dimension name="Time">
<level name="Year">
<comparator pluginKey="ReverseOrder" />
</level>
<level name="Month">
<comparator pluginKey="ReverseOrder" />
</level>
<level name="Day">
<comparator pluginKey="ReverseOrder" />
</level>
</dimension>